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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2950|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)溫度報(bào)警ds18b20.想知道哪里不正確..

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:477709 發(fā)表于 2019-2-21 18:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
想知道為什么無(wú)法運(yùn)行
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

sbit HI_LED=P2^3; //高溫,低溫白凈閃爍 LED
sbit LO_LED=P2^6;
sbit DQ=P3^3;    //DS18B20數(shù)據(jù)線
sbit BEEP=P3^7;   //報(bào)警
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit K1=P1^7;   //正常顯示溫度,越界時(shí)報(bào)警
sbit K2=P1^4;   //顯示報(bào)警溫度
sbit K3=P1^1;   //查看 ROM CODE

uchar code RomCodeStr[]={"-- ROM  CODE --"};
uchar RomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //64位ROM CODE
uchar code Temp_Disp_Title[]   ={"Current Temp: "};
uchar Current_Temp_Display_Buffer[]={"TEMPE:    "};
uchar code Temperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};  //溫度示字符
uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};
uchar Alarm_HI_LO_STR[]={"Hi:    Lo:      "};
uchar temp_data[2]={0x00,0x00};
uchar temp_alarm[2]={0x00,0x00};
uchar display[5]={0x00,0x00,0x00,0x00,0x00,};   //溫度值
uchar display1[3]={0x00,0x00,0x00};            //溫度報(bào)警值
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};   //溫度小數(shù)位對(duì)照表
//.......................................................
//報(bào)警溫度上下限(取值范圍:-128~+127)(DS18B20溫度范圍為:-55~+125)
//數(shù)組中前一位為高溫值,后一位為低溫值
//此處類型注意設(shè)為char,否則不能進(jìn)行有符號(hào)數(shù)的比較
char Alarm_Temp_HL[2]={70,-20};
//............................................................
uchar CurrentT=0; //當(dāng)前讀取溫度整數(shù)部分
uchar Temp_Value[]={0x00,0x00};//從DS18B20讀取的溫度值
uchar Display_Digit[]={0,0,0,0};//待顯示的各溫度數(shù)位
bit HI_Alarm=0,LO_Alarm=0; //高低溫報(bào)警標(biāo)志
bit DS18B20_IS_OK=1; //傳感器正常標(biāo)志
uint Time0_Count=0;   //定時(shí)器延時(shí)累加
//...........................
//延時(shí)
//...........................
void DelayXus(int x)
{
   uchar i;
   while(x--)for(i=0;i<200;i++);
}
//.......................................

//忙檢測(cè)
bit LCD_Busy_Check()
{
bit LCD_Status;
RS=0;//寄存器選擇
RW=1;//讀狀態(tài)寄存器EN=1;//開(kāi)始讀
DelayXus(1);
LCD_Status=(bit)(P0&0x80) ;
EN=0;
return LCD_Status;
}


//寫(xiě)LCD指令
void Write_LCD_Command(uchar cmd)
{
   while((LCD_Busy_Check()&0x80)==0x80);   //忙等待
   RS=0;   //寫(xiě)選擇命令寄存器
   RW=0;  //寫(xiě)
   EN=0;
   P0=cmd; EN=1;   DelayXus(1);   EN=0;
}
//向LCD寫(xiě)數(shù)據(jù)
void Write_LCD_Data(uchar dat)
{

   while((LCD_Busy_Check()&0x80)==0x80);   //忙等待
   RS=1;RW=0;EN=0;P0=dat;EN=1;   DelayXus(1);   EN=0;
}
//設(shè)置液晶顯示位置
void Set_LCD_POS(uchar pos)
{
   Write_LCD_Command(pos |0x80);
}
//LCD初始化
void LCD_Initialise()
{
  Write_LCD_Command(0x38);
DelayXus(1);
  Write_LCD_Command(0x01);    //清屏
DelayXus(1);   
  Write_LCD_Command(0x06);   //字符進(jìn)入模式:屏幕不動(dòng),字符后移
DelayXus(1);   
  Write_LCD_Command(0x0C);   //顯示開(kāi),關(guān)光標(biāo)
DelayXus(1);   
}

//...............................................

//..........................................
//自定義字符寫(xiě)CGRAM
//..................................
void Write_NEW_LCD_Char()
{
     uchar i;
     Write_LCD_Command(0x40);     //寫(xiě)CGRAM
     for(i=0;i<8;i++)
     Write_LCD_Data(Temperature_Char[i]);  //寫(xiě)入溫度符號(hào)
}
//............................................
//延時(shí)
//........................................................
void Delay(uint num)
{
   while(--num);
}
//...............................................
//初始化DS18B20
//...............................................
uchar Init_DS18B20()
{
    uchar status;
    DQ=1;Delay(8);
    DQ=0;Delay(90);
    DQ=1;Delay(8);
    status=DQ;
    Delay(100);
    DQ=1;
    return status;                                            //初始化成功時(shí)返回0
}
//...............................................
//讀一節(jié)
//...............................................
uchar ReadOneByte()
{
    uchar i,dat=0;
    DQ=1;_nop_();
    for(i=0;i<8;i++)
    {
        DQ=0;dat>>=1;DQ=1;_nop_(); _nop_();
        if(DQ) dat |=0x80;Delay(30);DQ=1;
    }
    return dat;
}
//...............................................
//寫(xiě)一字節(jié)
//...............................................
void WriteOneByte(uchar dat)
{
  uchar i;
  for(i=0;i<8;i++)
  {
     DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;
  }
}
//...............................................
//讀取溫度值
//...............................................
void Read_Temperature()
{
    if(Init_DS18B20()==1)                              //DS18B20故障
       DS18B20_IS_OK=0;
    else
    {
       WriteOneByte(0xCC);                             //跳過(guò)序列號(hào)
       WriteOneByte(0x44);                             //啟動(dòng)溫度轉(zhuǎn)換
       Init_DS18B20();
       WriteOneByte(0xCC);                             //跳過(guò)序列號(hào)
       WriteOneByte(0xBE);                             //讀取溫度寄存器
       Temp_Value[0]=ReadOneByte();                    //溫度低8位
       Temp_Value[1]=ReadOneByte();                    //溫度高8位
       Alarm_Temp_HL[0]=ReadOneByte();                 //報(bào)警溫度TH
       Alarm_Temp_HL[1]=ReadOneByte();                 //報(bào)警溫度TL
       DS18B20_IS_OK=1;
    }
}

//...............................................
//設(shè)置DS18B20溫度報(bào)警值
//...............................................
void Set_Alarm_Temp_Value()
{
   Init_DS18B20();
   WriteOneByte(0xCC);                                  //跳過(guò)序列號(hào)
   WriteOneByte(0x4E);                                  //將設(shè)定的溫度報(bào)警值寫(xiě)入DS18B20
   WriteOneByte(Alarm_Temp_HL[0]);                      //寫(xiě)TH
   WriteOneByte(Alarm_Temp_HL[1]);                      //寫(xiě)TL
   WriteOneByte(0x7F);                                  //12位精度
   Init_DS18B20();
   WriteOneByte(0xCC);                                  //跳過(guò)序列號(hào)
   WriteOneByte(0x48);                                  //溫度報(bào)警值存入DS18B20
}

//......................................................
//在LCD上顯示當(dāng)前溫度
//.....................................................
void Display_Temperature()
{
    uchar i;
    uchar t=150;     //延時(shí)值
    uchar ng=0;      //負(fù)數(shù)標(biāo)識(shí)
    char Signed_Current_Temp;
//如果為負(fù)數(shù)則取反加1,并設(shè)置負(fù)數(shù)標(biāo)識(shí)
if((Temp_Value[1]&0xF8)==0xF8)
{
    Temp_Value[1]=~Temp_Value[1];
    Temp_Value[0]=~Temp_Value[0]+1;
    if(Temp_Value[0]==0x00) Temp_Value[1]++;
    ng=1;  //設(shè)負(fù)數(shù)標(biāo)識(shí)
}
//查表得到溫度小數(shù)部分
Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];
//獲取溫度整數(shù)部分(無(wú)符號(hào))
CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);
//有符號(hào)的當(dāng)前溫度值,注意此處定義為char, 其值可為-128~+127
Signed_Current_Temp=ng?-CurrentT:CurrentT;
//高低溫報(bào)警標(biāo)志設(shè)置(與定義為char類型的Alarm_Temp_HL比較,這樣可區(qū)分正負(fù)比較)
HI_Alarm=Signed_Current_Temp>=Alarm_Temp_HL[0]?1:0;
LO_Alarm=Signed_Current_Temp<=Alarm_Temp_HL[1]?1:0;
//將整數(shù)部分分解為三位待顯示數(shù)字
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
//刷新LCD顯示緩沖
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';
//高位為0時(shí)不顯示
if(Display_Digit[3]==0)  Current_Temp_Display_Buffer[7]=' ';
//高位為0且次高位為0時(shí),次高位不顯示
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';
//負(fù)數(shù)符號(hào)顯示恰當(dāng)位置
if (ng)
{
   if(Current_Temp_Display_Buffer[8]==' ')
     Current_Temp_Display_Buffer[8]='_';
   else
   if(Current_Temp_Display_Buffer[7]==' ')
     Current_Temp_Display_Buffer[7]='_';
   else
     Current_Temp_Display_Buffer[6]='_';
}
//在第一行顯示標(biāo)題
Set_LCD_POS(0X00);
for(i=0;i<16;i++) Write_LCD_Data( Temp_Disp_Title[i]);
//在第二行顯示當(dāng)前溫度
Set_LCD_POS(0X40);
for(i=0;i<16;i++) Write_LCD_Data(Current_Temp_Display_Buffer[i]);
//顯示溫度符號(hào)
Set_LCD_POS(0X4D);Write_LCD_Data(0x00);
Set_LCD_POS(0X4E);Write_LCD_Data('C');
}

//.....................................
//定時(shí)器中斷,控制報(bào)警聲音
//.................................
void T0_INT() interrupt 1
{
   TH0=-1000/256;
   TL0=-1000%256;
   BEEP=!BEEP;
   if(++Time0_Count==400)
{
      Time0_Count=0;
      if(HI_Alarm) HI_LED=~HI_LED; else HI_LED=0;
      if(LO_Alarm) LO_LED=~LO_LED; else LO_LED=0;  
      TR0=0;
}
}
//...............................................
//ROM CODE轉(zhuǎn)換與顯示
//.....................................................
void Display_Rom_Code()
{
   uchar i,t;
   Set_LCD_POS(0x40);
   for(i=0;i<8;i++)
{
   t=((RomCode[i]&0xF0)>>4);
   if(t>9) t+=0x37;else t+='0';
   Write_LCD_Data(t);             //高位數(shù)顯示
   t=RomCode[i]&0x0F;
   if(t>9) t+=0x37;else t+='0';
   Write_LCD_Data(t);             //低位數(shù)顯示
  }
}
//..................................
//讀64位序列碼
//...............................
void Read_Rom_Code()
{
   uchar i;
   Init_DS18B20();
   WriteOneByte(0x33);                  //讀序列碼
   for (i=0;i<8;i++) RomCode[i]=ReadOneByte();
}
//.........................................
//顯示ROM CODE
//...............................
void Display_RomCode()
{
    uchar i;
    Set_LCD_POS(0x00);
    for(i=0;i<16;i++)                   //顯示標(biāo)題
    Write_LCD_Data(RomCodeStr[i]);   
    Read_Rom_Code();                 //讀64位序列碼
    Display_Rom_Code();          //顯示64位ROM CODE
}
//.......................................
//顯示報(bào)警溫度
//...............................................
void Disp_Alarm_Temperature()
{
  uchar i,ng;
//顯示Alarm_Temp_HL數(shù)組中的報(bào)警溫度值
//由于Alarm_Temp_HL類型為char,故可以直接進(jìn)行正負(fù)比較
//高溫報(bào)警值.........................
  ng=0;
  if(Alarm_Temp_HL[0]<0) //如果為負(fù)數(shù)則取反加1
  {
    Alarm_Temp_HL[0]=~Alarm_Temp_HL[0]+1;
    ng=1;
}
//分解高溫各數(shù)位到待顯示串中
Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0';
Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'0';
Alarm_HI_LO_STR[6]=Alarm_Temp_HL[0]%10+'0';
//屏蔽高位不顯示的0
if(Alarm_HI_LO_STR[4]=='0') Alarm_HI_LO_STR[4]=' ';
if(Alarm_HI_LO_STR[4]==' '&& Alarm_HI_LO_STR[5]=='0')
Alarm_HI_LO_STR[5]=' ';
//"-"符號(hào)顯示
if (ng)
{
   if (Alarm_HI_LO_STR[5]==' ') Alarm_HI_LO_STR[5]='-';
   else
   if(Alarm_HI_LO_STR[4]==' ') Alarm_HI_LO_STR[4]='-';
   else
   Alarm_HI_LO_STR[3]='-';
}
//低溫報(bào)警值
ng=0;
if(Alarm_Temp_HL[1]<0)     //如果為負(fù)數(shù)則取反加1
{
  Alarm_Temp_HL[1]=~Alarm_Temp_HL[1]+1;
  ng=1;
}
//分解低溫各數(shù)位到待顯示串中
Alarm_HI_LO_STR[12]=Alarm_Temp_HL[1]/100+'0';
Alarm_HI_LO_STR[13]=Alarm_Temp_HL[0]/10%10+'0';
Alarm_HI_LO_STR[14]=Alarm_Temp_HL[0]%10+'0';
//屏蔽高位不顯示的0
if(Alarm_HI_LO_STR[12]=='0') Alarm_HI_LO_STR[12]=' ';
if(Alarm_HI_LO_STR[12]==' '&& Alarm_HI_LO_STR[13]=='0')
Alarm_HI_LO_STR[13]=' ';
//"-"符號(hào)顯示
if (ng)
{
   if (Alarm_HI_LO_STR[13]==' ') Alarm_HI_LO_STR[13]='-';
   else
   if(Alarm_HI_LO_STR[12]==' ') Alarm_HI_LO_STR[12]='-';
   else
   Alarm_HI_LO_STR[11]='-';
}
//顯示高低溫報(bào)警溫度值
Set_LCD_POS(0x00);       //顯示標(biāo)題
for (i=0;i<16;i++) Write_LCD_Data(Alarm_Temp[i]);
Set_LCD_POS(0x40);      //顯示高低溫
for (i=0;i<16;i++) Write_LCD_Data(Alarm_HI_LO_STR[i]);
}
//................................
//主函數(shù)
//..................................
void main()
{
   uchar Current_Operation=1;    //默認(rèn)當(dāng)前操作為顯示溫度
   LCD_Initialise();
   IE=0x82;
   TMOD=0x01;
   TH0=-1000/256;
   TL0=-1000%256;
   TR0=0;
   HI_LED=0;
   LO_LED=0;
   Set_Alarm_Temp_Value();
   Read_Temperature();
   Delay(50000);
   Delay(50000);
   while(1)
   {
      if (K1==0) Current_Operation=1;
      if (K2==0) Current_Operation=2;
      if (K3==0) Current_Operation=3;
      switch (Current_Operation)
      {
        case 1://正常顯示當(dāng)前溫度,越界時(shí)報(bào)警
              Read_Temperature();
              if( DS18B20_IS_OK)
               {
                  if (HI_Alarm==1 || LO_Alarm==1) TR0=1;
                  else TR0=0;
                  Display_Temperature();
               }
               DelayXus(100);
               break;
        case 2:  //顯示報(bào)警溫度上下限
               Read_Temperature();
               Disp_Alarm_Temperature();
               DelayXus(100);
               break;
        case 3:  //顯示DS18B20  ROM CODE
               Display_RomCode();
               DelayXus(50);
               break;
   }
}
}

程序如上

fujian.zip

20.61 KB, 下載次數(shù): 6

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

使用道具 舉報(bào)

沙發(fā)
ID:164602 發(fā)表于 2019-2-22 08:58 | 只看該作者
這么長(zhǎng)的程序,應(yīng)該沒(méi)有多少人會(huì)有時(shí)間去看的。
給你支個(gè)招吧。
程序調(diào)試,自己是可以做的。
你的程序,不外就是兩個(gè)功能:1、18B20;2、LCD
另外寫(xiě)兩個(gè)程序,功能分別是上面說(shuō)的一個(gè),主體語(yǔ)句要用這個(gè)程序的,看能不能達(dá)成功能,如LCD能否顯示指定內(nèi)容,18B20能否顯示出正常的溫度,或者能不能報(bào)警等等,這樣可以確定你現(xiàn)在的程序語(yǔ)句、邏輯有沒(méi)有問(wèn)題。若沒(méi)有問(wèn)題,再回頭看你現(xiàn)在的程序,只看兩功能關(guān)聯(lián)部分,因?yàn)槟阋呀?jīng)證明兩功能分別是正確的了;如果兩功能本身就有問(wèn)題,那就要先解決,不然合起來(lái)的程序當(dāng)然就有問(wèn)題。

評(píng)分

參與人數(shù) 1黑幣 +3 收起 理由
lmn2005 + 3 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:158375 發(fā)表于 2019-2-22 09:10 | 只看該作者
沙發(fā)說(shuō)的沒(méi)錯(cuò):你就按照沙發(fā)說(shuō)的做吧,沒(méi)準(zhǔn)另外寫(xiě)兩個(gè)程序能學(xué)到不少東西呢。
回復(fù)

使用道具 舉報(bào)

地板
ID:71233 發(fā)表于 2019-2-22 10:00 | 只看該作者
設(shè)計(jì)復(fù)雜的程序,我一般先從簡(jiǎn)單的程序開(kāi)始。要完成多個(gè)任務(wù)時(shí)首先要決定先解決一個(gè)任務(wù),然后再解決下一任務(wù),一個(gè)一個(gè)地來(lái),不能一步登天,因?yàn)橥鎲纹瑱C(jī)不單是硬件上要保證正確無(wú)誤,軟件也需要保證完美無(wú)缺,硬軟件的設(shè)計(jì),一點(diǎn)都不能馬虎,這樣才能保證運(yùn)行的正常。

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
HC6800-ES-V2.0 + 5 說(shuō)得對(duì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2019-2-22 12:12 | 只看該作者
先讀能ds18b20的手冊(cè),再看盾程序有沒(méi)有違反手冊(cè)。
回復(fù)

使用道具 舉報(bào)

6#
ID:981034 發(fā)表于 2022-1-21 11:14 | 只看該作者
是的,先調(diào)出顯示屏
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日日骚网 | 精品1区2区 | 丁香婷婷久久久综合精品国产 | 超碰超碰| 国产乱码精品一品二品 | 久久精品久久久久久 | a级免费视频 | 日韩欧美在线一区 | 亚洲午夜视频在线观看 | 久久精品一区二区三区四区 | 一级黄片一级毛片 | 精品无码久久久久久国产 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 91 在线 | 色偷偷噜噜噜亚洲男人 | 男女啪啪高潮无遮挡免费动态 | www.操.com| 日韩一区二区三区视频 | 免费艹逼视频 | 免费观看日韩av | 在线观看亚洲专区 | 精品国产91乱码一区二区三区 | 亚洲一区二区在线免费观看 | 久久综合一区 | 欧美日本韩国一区二区 | 成人综合久久 | 国产欧美精品 | 中文字幕在线播放不卡 | eeuss国产一区二区三区四区 | 中文字幕在线三区 | xxx国产精品视频 | 国产精品地址 | av网站免费看 | 91精品国产日韩91久久久久久 | 久久亚洲一区二区 | 成人在线h | 97超碰人人 | 九九久久精品 | 亚洲国产精品一区二区久久 | 特级毛片爽www免费版 | 三级黄色大片网站 |