久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2838|回復: 0
打印 上一主題 下一主題
收起左側

怎么實現下面的程序不管哪路溫度超限都報警

[復制鏈接]
跳轉到指定樓層
樓主
ID:74571 發表于 2015-3-19 21:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>
#include<intrins.h>
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
#define uint  unsigned int

sbit RS=  P2^0  ;                                                        //液晶顯示引腳定義
sbit RW=  P2^1  ;
sbit EN=  P2^2  ;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
float n;
uint  t=0,dian=0;
uchar LCD_LINE_ONE[16]={"tp1:           "};                //定義顯示屏幕
uchar LCD_LINE_TWO[16]={"tp2:           "};


int Tm;
int  fushu=0 ;
sbit DQ= P3^3;                                                                                  
static unsigned char get_serial[]={                  //獲取的八個DS18B20內部RAM64位序列號
   224, 0,0,0,  184,  197, 50, 40,
   215, 0,0,0,  184,  197, 51, 40
};
void delay( ms )                                          //用于液晶顯示的延時函數
{
          int i ;
          while(ms--)
          {
               for(i=0 ;i<5 ;i++ )  ;

          }
}

uchar Read_LCD_State()                                  //讀取液晶顯示的狀態
{
        uchar state;
        RS=0;RW=1;EN=1;delay(1);
        state=P0;
        EN = 0;delay(1);
        return state;
}
void LCD_Busy_Wait()                                 //如果忙則等待函數
{
        while((Read_LCD_State()&0x80)==0x80);
        delay(5);
}

void Write_LCD_Zhilin(uchar zl)                          //液晶顯示寫指令函數
{
        LCD_Busy_Wait();
        RS=0;RW=0;
        EN=0;
        P0=zl;
        EN=1;
        delay(1);
        EN=0;       
}
void Write_LCD_shuju(uchar date)             //液晶顯示寫數據函數
{
        LCD_Busy_Wait();
        RS=1;RW=0;
        EN=0;
        P0=date;
        EN=1;
        delay(1);
        EN=0;       
}
void LCD_INIT()                                //液晶顯示初始化
{
    Write_LCD_Zhilin(0x38);          // 顯示模式設置
        delay(1);                                  
        Write_LCD_Zhilin(0x01);          // 顯示清屏
        delay(1);                                 
        Write_LCD_Zhilin(0x06);          // 光標移動設置
        delay(1);
        Write_LCD_Zhilin(0x0c);          // 開及光標設置
        delay(1);
}
void Display_LCD_String(uchar p,uchar *s)                  //液晶顯示寫入函數
{
        uchar i;
        Write_LCD_Zhilin(p|0x80)        ;    //寫地址高位為一
        for(i=0;i<16;i++)
        {
                Write_LCD_shuju(s[i]);
                delay(1);        
        }
}
/***************************************************************************************/
void delays(int us)                                           //用于DS18B20的延時函數
{ int s;
for ( s=0; s<us; s++);
}
void rst(void)                                                //DS18B20初始化
{
DQ = 1;
delays(2);
DQ = 0;
delays(30); //精確延時 480~960us
DQ = 1;
delays(8);
}
void write(unsigned char ku)                //DS18B20寫函數
{
int i=0;
     for (i=0;i<8;i++)
    {
                DQ=0;
                DQ =ku&0x01;
                delays(3);
                DQ=1;
                ku>>=1;
    }
}
void match_rom(unsigned char *rom)          //DS18B20匹配ROM函數
{
unsigned char i;
rst();                                                          //初始化
write(0x55);                                          //匹配ROM
for(i=8;i>0;i--)
{
          write(*(rom+i-1));
}

}
unsigned int read(void)                          //DS18B20讀函數,每次讀16位
{
        int i=0;
        unsigned int u=0;
    for (i=0;i<16;i++)
    {
                DQ=0;
                u>>=1;
                DQ=1;
                if(DQ) u|=0x8000;
                delays(4);
     }
    return (u);
}
int  read0(unsigned char *seria)        //讀取對應溫度值并轉換函數
{
     int temperature ;
    unsigned int tp;
    unsigned int lsb;
    rst();                                  //初始化
    write(0xCC);                  //跳過RAM
        write(0x44);                  //溫度轉換
        rst();                                  //再次初始化
        write(0xCC);
        match_rom(seria);    //匹配ROM函數調用
                 write(0xBE);         //讀取存儲器指令
        tp=read();                         //讀取溫度值
        if((tp&0xf800)==0xf800)                //判斷正負數
            {
                     fushu=1 ;
                      tp=~tp+1 ;
                        n=tp;
                    lsb=(unsigned int)(tp*6.25);
                        dian=lsb%100;                  //取小數部分
               
                     temperature=lsb/100;

                }
     else
            {
                    fushu=0;
                    lsb=(unsigned int)(tp*6.25);
                        dian=lsb%100;  
               
                     temperature=lsb/100;
                        n=temperature;

             }
     return(temperature);
}

/*****************************************************************************************/
void main()
{
      uint i ;
          int m=10;
          LCD_INIT();
          EA=0 ;                 //使用DS18B20禁止任何中斷
          while(1)
         {          
              for(i=0;i<2;i++)
                  {       
                      Tm=read0(get_serial+i*8);
                                if(i==0)                                   //判斷是第幾個的數據
                                {
                                           if(fushu==0)                                           //判斷是否加負號
                                                sprintf(LCD_LINE_ONE+5," %d", Tm);
                                           if(fushu==1)
                                                    sprintf(LCD_LINE_ONE+5,"-%d", Tm);
                                       sprintf(LCD_LINE_ONE+10,".%d",dian);                //加入小數部分
                                           Display_LCD_String(0x00,LCD_LINE_ONE);
                                           if(Tm<m)
                                          {
                                            led1=0 ;
                                           }
                                           else
                                           {
                                           led1=1;
                                           }
                                 }
                                if(i==1)
                                {  
                                       if(fushu==0)       
                                                 sprintf(LCD_LINE_TWO+5," %d", Tm);
                                           if(fushu==1)
                                                     sprintf(LCD_LINE_TWO+5,"-%d", Tm);
                                       sprintf(LCD_LINE_TWO+10,".%d",dian);
                                           Display_LCD_String(0x40,LCD_LINE_TWO);
                       
               
                                }

                  }

               
         }
}
如果能查出具體哪個超限最好,最好備注一下

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人免费电影 | 日韩在线观看 | 国产一区二区三区在线免费 | 精品91视频 | aaa在线观看 | 一区二区在线不卡 | 久久网亚洲| 国产精品亚洲精品日韩已方 | 一区二区视频在线观看 | 99久久精品国产一区二区三区 | 婷婷色国产偷v国产偷v小说 | 欧美日韩一区在线观看 | 天堂在线www| 亚洲精品电影网在线观看 | 伊大人久久 | 视频一区二区在线观看 | 亚洲成人高清 | 亚洲欧美在线观看 | 亚洲欧洲激情 | 国产九九精品 | 91麻豆精品国产91久久久更新资源速度超快 | 国产永久免费 | 久久久www成人免费无遮挡大片 | 好姑娘影视在线观看高清 | 激情欧美一区二区三区中文字幕 | 欧美一区二区大片 | 亚洲国产一区二区三区四区 | 天天av天天好逼 | 黑人一级黄色大片 | 亚洲免费观看 | 天天草草草 | 国产精品一二三区在线观看 | 91久久久久久久久 | 欧美激情国产日韩精品一区18 | www.97zyz.com| 中文字幕 国产 | 欧洲一区二区视频 | 国产91丝袜在线播放 | 欧美精品导航 | 亚洲天堂久久新 | 一区二区三区免费看 |