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

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

QQ登錄

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

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

51單片機(jī)+18B20溫度1602顯示的控制源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本單片機(jī)采用STC89C52RC芯片,用LCD1602顯示溫度上限設(shè)定值,下限設(shè)定值,
以及在線(xiàn)溫度實(shí)時(shí)顯示,用18B20溫度傳感器檢測(cè)溫度,同時(shí)用按鍵設(shè)置溫度
上下限,以及設(shè)定切換,用timer0中斷設(shè)置1秒閃爍指示燈顯示運(yùn)行狀態(tài)。  

制作出來(lái)的實(shí)物圖如下:


單片機(jī)源程序如下:
  1. /******************************************************************
  2. 本單片機(jī)采用STC89C52RC芯片,用LCD1602顯示溫度上限設(shè)定值,下限設(shè)定值,
  3.   以及在線(xiàn)溫度實(shí)時(shí)顯示,用18B20溫度傳感器檢測(cè)溫度,同時(shí)用按鍵設(shè)置溫度
  4.   上下限,以及設(shè)定切換,用timer0中斷設(shè)置1秒閃爍指示燈顯示運(yùn)行狀態(tài)。
  5. *******************************************************************/

  6. #include<REG52.h>
  7. #include <intrins.h>
  8. unsigned char times;

  9. #define uchar unsigned char//宏定義
  10. #define uint unsigned int


  11. sbit RS = P3^5;   //定義lcd1602通訊端口
  12. sbit RW = P3^6;
  13. sbit EN = P3^4;
  14. sbit DQ= P2^2;          //18B20總線(xiàn)端口
  15. sbit led1=P1^1;          //系統(tǒng)運(yùn)行指示,
  16. uint temp1;  
  17. uchar bai,shi,ge; //測(cè)量溫度顯示位置
  18. uchar qian1,bai1,shi1,ge1;//上下限溫度顯示位置
  19. bit flag; //標(biāo)志位
  20. sbit ds=P2^2;//18B20傳感器 I/O口
  21. sbit beep=P1^0;//溫度報(bào)警
  22. uint temp;
  23. sbit led4=P1^4;//溫度上下限設(shè)定指示
  24. sbit led3=P1^2;//工作指示

  25. sbit key1=P3^0;// 溫度上線(xiàn)限設(shè)定轉(zhuǎn)換按鈕
  26. sbit key2=P3^1;//溫度設(shè)定加
  27. sbit key3=P3^2;//溫度設(shè)定減
  28. uchar num,num_shang=0,num_xia=0,numled,flag_qiehuan; //變量初始化,定義

  29. /*====================================
  30. 函數(shù)        : delay(uint z)
  31. 參數(shù)        :z 延時(shí)毫秒設(shè)定,取值范圍0-65535
  32. 返回值        :無(wú)
  33. 描述        :12T/Fosc11.0592M毫秒級(jí)延時(shí)
  34. ====================================*/
  35. void delay(xms)                                   //毫秒延時(shí)函數(shù)
  36. {
  37.         uint i,j;
  38.         for(i=xms;i>0;i--)
  39.                 for(j=100;j>0;j--);
  40. }
  41. void delayus(uint t)        //us延時(shí)函數(shù)
  42. {
  43.          while(t--);
  44. }
  45. void init()                                                   //初始化函數(shù)
  46. {
  47.         TMOD=0x01;                                                   //設(shè)置定時(shí)器0位工作方式(00000001)
  48.         TH0=(65536-22500)/256;                           //裝初值
  49.         TL0=(65536-22500)%256;                           
  50.         EA=1;                                                             //開(kāi)總中斷
  51.         ET0=1;                                                           //開(kāi)定時(shí)器0中斷
  52.         TR0=1;
  53. }

  54. void ds_reset()           //復(fù)位函數(shù)
  55. {
  56.         ds=1;
  57.         delayus(5);     //         延時(shí)
  58.         ds=0;
  59.         delayus(80);
  60.         ds=1;
  61.         delayus(14);
  62.         if(ds==0)
  63.                 flag=1;
  64.         else
  65.                 flag=0;                                //flag作為標(biāo)志位,等1表示18b20存在
  66.         delayus(20);
  67. }
  68. bit ds_read_bit(void)                        //讀一位數(shù)據(jù)函數(shù)
  69. {
  70.         bit dat;
  71.         ds=0;
  72.         _nop_();                                   //延時(shí)機(jī)器周期
  73.         _nop_();
  74.         ds=1;                                                //釋放總線(xiàn)
  75.         _nop_();
  76.         dat=ds;
  77.         delayus(10);               //延時(shí)100us
  78.         return dat;
  79. }
  80. uchar ds_read_byte()                   //讀一個(gè)字節(jié)函數(shù)
  81. {
  82.         uchar i,j,k;
  83.         for(i=0;i<8;i++)                  //一個(gè)字節(jié)8位組成,循環(huán)八次
  84.         {
  85.                 j=ds_read_bit();
  86.                 k=(j<<7)|(k>>1);                //讀出的數(shù)據(jù)最低位在最前面
  87.         }
  88.         return k;
  89. }
  90. void ds_write_byte(uchar dat)      //寫(xiě)一個(gè)字節(jié)的函數(shù)
  91. {
  92.         uchar i;
  93.         for(i=0;i<8;i++)                        //循環(huán)八位將一個(gè)字節(jié)由低到高寫(xiě)入
  94.         {
  95.                 ds=0;
  96.                 _nop_();
  97.                 ds=dat&0x01;                        //保留dat的最低位
  98.                 delayus(6);
  99.                 ds=1;                 //釋放總線(xiàn)
  100.                 dat=dat>>1;
  101.         }
  102.         delayus(6);
  103. }
  104. uint read_temp()                //讀取溫度函數(shù)
  105. {
  106.         uchar a,b;
  107.         ds_reset();
  108.         ds_write_byte(0xcc);//                18B20忽略指令
  109.         ds_write_byte(0xbe); //讀暫存器指令
  110.         a=ds_read_byte();           //讀低八位
  111.         b=ds_read_byte();                        //讀高八位
  112.         temp=b;
  113.         temp=temp<<8;
  114.         temp=temp|a;
  115.         temp=temp*0.0625;                //得到實(shí)際溫度值
  116.         return temp;
  117. }

  118. /*************************************/
  119. void keyscan()
  120. {
  121.         if(key1==0)//按鍵1處理,切換設(shè)置上下限
  122.         {         
  123.                         delay(5);         //去抖
  124.                      if(key1==0)
  125.                    {
  126.                
  127.                      flag_qiehuan=!flag_qiehuan;//溫度上下限按鍵取反
  128.                         
  129.                                                                                           
  130.                          led4=flag_qiehuan;//溫度設(shè)置切換按鍵狀態(tài)指示
  131.                         
  132.                          while(!key1);//松手檢測(cè)
  133.                      }
  134.                 }               
  135.                         

  136.                                 
  137.                     
  138.                
  139.         if((key2==0)&&(flag_qiehuan==0))//溫度加按鈕,k2長(zhǎng)按
  140.         {        
  141.                     delay(30);
  142.                 if((key2==0)&&(flag_qiehuan==0))
  143.                           {                        
  144.                                 if(num_xia!=40)//上限值40
  145.                                  num_xia++;         //
  146.                           }
  147.                         
  148.         }
  149.         else if((key2==0)&&(flag_qiehuan==0))//K2短按
  150.         {
  151.                 delay(3);
  152.                 if((key2==0)&&(flag_qiehuan==0))
  153.                          {
  154.                                 if(num_xia!=40)// 上限值40
  155.                                  num_xia++;
  156.                                 while(!key2);//松手檢測(cè)                 
  157.                          }
  158.                
  159.         }
  160.         if((key3==0)&&(flag_qiehuan==0))//         溫度減按鍵
  161.         {
  162.                 delay(30);
  163.                 if((key3==0)&&(flag_qiehuan==0))
  164.                           {
  165.                         if(num_xia!=0)//下限值0
  166.                                 
  167.                                   num_xia--;
  168.                         
  169.                           }        
  170.         }
  171.         else if((key3==0)&&(flag_qiehuan==0))                                                                                //K3短按
  172.         {
  173.                 delay(3);
  174.                 if((key3==0)&&(flag_qiehuan==0))
  175.                 {
  176.                         if(num_xia!=0)//下限值0
  177.                           num_xia--;
  178.                         while(!key3);//松手檢測(cè)                 
  179.                 }        
  180.         }
  181.         if((key2==0)&&(flag_qiehuan==1))                                         
  182.         {
  183.                 delay(30);
  184.                 if((key2==0)&&(flag_qiehuan==1))
  185.                 {
  186.                         if(num_shang!=40)//上限值40
  187.                         num_shang++;
  188.                 }        
  189.         }
  190.         else if((key2==0)&&(flag_qiehuan==1))                                 
  191.         {
  192.                 delay(3);
  193.                 if((key2==0)&&(flag_qiehuan==1))
  194.                 {
  195.                         if(num_shang!=40)//上限值40
  196.                         num_shang++;
  197.                         while(!key2);//松手檢測(cè)                 
  198.                 }
  199.         }
  200.         if((key3==0)&&(flag_qiehuan==1))
  201.         {
  202.                 delay(30);
  203.                 if((key3==0)&&(flag_qiehuan==1))
  204.                 {
  205.                         if(num_shang!=0)//
  206.                         num_shang--;// 下限值0
  207.                 }
  208.         }        
  209.         else if((key3==0)&&(flag_qiehuan==1))
  210.         {
  211.                 delay(3);
  212.                 if((key3==0)&&(flag_qiehuan==1))
  213.                 {
  214.                         if(num_shang!=0) //下限值0
  215.                         num_shang--;
  216.                         while(!key3);//        松手檢測(cè)         
  217.                 }
  218.         }        
  219.                   
  220. }
  221. void deal()//         溫度報(bào)警設(shè)定
  222. {
  223.         if((temp>=num_xia)||(temp<=num_shang))        //大于下限或低于上限不報(bào)警
  224.         {
  225.                 beep=0;
  226.         }
  227.         if((temp<num_xia)&&(temp>num_shang)) //低于下限或高于上限報(bào)警
  228.         {
  229.                 beep=1;
  230.         }        
  231. }                                       
  232. /****************************************/
  233. void display_set_alm()                                        //顯示子函數(shù),報(bào)警數(shù)據(jù)分離,顯示在液晶面板上
  234. {                                                                                

  235.         qian1=num_shang/10;                                   
  236.         bai1=num_shang%10;
  237.         shi1=num_xia/10;
  238.         ge1=num_xia%10;
  239. }
  240. /************************************/

  241.          
  242.   void delay_DS18B20(  time)//18B20延時(shí)5us函數(shù)
  243. {
  244.         uint i,j;
  245.         for(i=0;i<time;i++)
  246.                 for(j=0;j<1;j++);
  247. }
  248. void delay_ms(uchar time)//延時(shí)1ms函數(shù)
  249. {
  250.   unsigned int i,j;
  251.   for(i=0;i<time;i++)
  252.           for(j=0;j<110;j++);
  253. }
  254. uchar Init_DS18B20(void)//18B20初始化
  255. {
  256.         uchar Presence;
  257.         DQ=1;                                //數(shù)據(jù)端置高電平
  258.         delay_DS18B20(10);         //延時(shí)

  259.         DQ=0;                                 //數(shù)據(jù)端置低電平
  260.         delay_DS18B20(29);

  261.         DQ=1;
  262.         delay_DS18B20(3);

  263.         Presence=DQ;
  264.         delay_DS18B20(23);
  265.         return (Presence);

  266. }

  267. uchar Read_bit_DS18B20(void)
  268. {
  269.         DQ=1;
  270.         delay_DS18B20(1);//DS18B20讀位
  271.         DQ=0;
  272.         DQ=1;
  273.         return (DQ);
  274. }

  275. void Write_bit_DS18B20(uchar date)//DS18B20寫(xiě)位
  276. {
  277.         DQ=0;
  278.         if(date==1)
  279.                 DQ=1;
  280.         delay_DS18B20(1);
  281.         DQ=1;
  282.         delay_DS18B20(1);
  283. }

  284. uchar Read_Byte_DS18B20(void)//DS18B20讀字節(jié)
  285. {
  286.         uchar i,date=0;
  287.         for(i=0;i<8;i++)
  288.         {
  289.                 if(Read_bit_DS18B20())
  290.                 {
  291.                         date=date|(0x01<<i); //00000001   00000010
  292.                 }
  293.         }

  294.         return (date);
  295. }

  296. void Write_Byte_DS18B20(uchar date)//DS18B20寫(xiě)字節(jié)
  297. {
  298.         uchar i;
  299.         for(i=0;i<8;i++)
  300.         {
  301.                 Write_bit_DS18B20(date&0x01);
  302.                 date=date>>1;        
  303.         }
  304. }

  305. uint Gettemp(void)//讀取溫度,并將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成溫度值
  306. {
  307.         uchar a,b;
  308.         uint temp;
  309.         float t;
  310.         Init_DS18B20();
  311.         Write_Byte_DS18B20(0xcc);//跳過(guò)        ROM
  312.     Write_Byte_DS18B20(0x44);//開(kāi)始轉(zhuǎn)換溫度
  313.         delay_DS18B20(30);

  314.         Init_DS18B20();
  315.         Write_Byte_DS18B20(0xcc);//跳過(guò)        ROM
  316.     Write_Byte_DS18B20(0xbe);//讀取數(shù)據(jù)

  317.         a=Read_Byte_DS18B20();//讀溫度值的低位
  318.         b=Read_Byte_DS18B20();//讀溫度值的高位

  319.         temp=b;
  320.         temp=temp<<8;
  321.         temp=temp|a;

  322.         t=temp*0.0625;                 //計(jì)算溫度值
  323.         temp=t*10+0.5;                 

  324.         return (temp);                // 返回

  325. }
  326. void LCD_Write_Com(uchar com)//         lcd寫(xiě)命令
  327. {  
  328. delay_ms(5);
  329. RS=0;
  330. RW=0;
  331. EN=1;
  332. P0=com;
  333. EN=0;
  334. }
  335. void LCD_Write_Data(uchar Data) //寫(xiě)入數(shù)據(jù)函數(shù)
  336. {
  337. delay_ms(5);
  338. RS=1;
  339. RW=0;
  340. EN=1;
  341. P0= Data;
  342. EN=0;
  343. }
  344. void gotoxy(uchar x,uchar y)         //確定顯示位置
  345. {
  346.         if (x == 1)
  347.          {     
  348.                  LCD_Write_Com(0x80 + y-1);     //表示第一行
  349.          }
  350.         else
  351.          {      
  352.                  LCD_Write_Com(0xC0 + y-1);      //表示第二行
  353.          }        
  354. }
  355. void LCD_Write_String(uchar *s) // 寫(xiě)入字符串函數(shù)
  356. {     
  357.          while (*s)
  358.          {     
  359.          LCD_Write_Data( *s);     
  360.          s ++;     
  361.          }
  362. }
  363. void LCD_Init(void)  //初始化函數(shù)
  364. {
  365.    LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
  366.    delay_ms(1);
  367.    LCD_Write_Com(0x38);
  368.    delay_ms(1);
  369.    LCD_Write_Com(0x38);
  370.    delay_ms(1);
  371.    LCD_Write_Com(0x38);  
  372.    LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
  373.    LCD_Write_Com(0x01);    /*顯示清屏*/
  374.    LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
  375.    delay_ms(1);
  376.    LCD_Write_Com(0x0C);    /*顯示開(kāi)及光標(biāo)設(shè)置*/
  377. }
  378. void main(void)
  379. {
  380.             
  381.           init();                                //定時(shí)器初始化函數(shù)調(diào)用
  382.         
  383.         {
  384.          ds_reset();
  385.          ds_write_byte(0xcc); //18B20忽略指令
  386.          ds_write_byte(0x44);//18B20溫度轉(zhuǎn)換指令
  387.          keyscan();//按鍵掃描
  388.          deal();        //測(cè)量溫度處理
  389.                
  390.         }
  391.          
  392.         LCD_Init();
  393.         gotoxy(1,1);
  394.     LCD_Write_String("ALM H   L"); //第一行第一列開(kāi)始寫(xiě)
  395.         gotoxy(2,1);
  396.         LCD_Write_String("DS18B20:");//第二行第三列開(kāi)始寫(xiě)
  397.         while(1)
  398.         {         
  399.                         
  400.                 temp1=Gettemp();
  401.                 bai=temp1/100;
  402.                 shi=temp1%100/10;
  403.                 ge=temp1%10;
  404.         gotoxy(2,9);
  405.                 LCD_Write_Data(bai+0x30);        //加0x30的原因是在A(yíng)SCII碼中0的地址是0x30
  406.                 LCD_Write_Data(shi+0x30);
  407.                 LCD_Write_Data('.');
  408.                 LCD_Write_Data(ge+0x30);
  409.                         
  410.          gotoxy(1,6);
  411.                 LCD_Write_Data(qian1+0x30);
  412.                 LCD_Write_Data(bai1+0x30);
  413.                 gotoxy(1,10);
  414.                 LCD_Write_Data(shi1+0x30);
  415.                 LCD_Write_Data(ge1+0x30);
  416.                         
  417.                         keyscan() ;
  418.                 display_set_alm();
  419.            }

  420. }
  421. /***************************************************/
  422. void T0_time() interrupt 1//中斷1
  423. {
  424.         TH0=(65536-22500)/256;                           //裝初值
  425.         TL0=(65536-22500)%256;
  426.         numled++;
  427.         if(numled==50)
  428.         {
  429.           numled=0;
  430.           led3=~led3;         //定時(shí)1s燈閃爍
  431.         }
  432. }
復(fù)制代碼
此附件由于多人回帖說(shuō)代碼有錯(cuò)誤,已經(jīng)被管理員刪除,無(wú)法下載
51單片機(jī)-1602 18B20溫度顯示控制.rar (5.96 MB, 下載次數(shù): 48)
此附件由于多人回帖說(shuō)代碼有錯(cuò)誤,已經(jīng)被管理員刪除,無(wú)法下載

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:474538 發(fā)表于 2019-12-29 08:36 | 只看該作者
程序運(yùn)行不了,定義的一些led也沒(méi)用上,下面圖片是個(gè)最基本的錯(cuò)誤,主函數(shù)里面也有錯(cuò)誤

%3X~3@S3BSRW]GW3D3[2UYN.png (66.56 KB, 下載次數(shù): 53)

%3X~3@S3BSRW]GW3D3[2UYN.png
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区视屏 | 6996成人影院网在线播放 | 国产一区二区影院 | 中文字幕在线一区二区三区 | 久久久久国产精品一区二区 | 精品欧美乱码久久久久久 | 免费观看一级特黄欧美大片 | 午夜精品一区二区三区三上悠亚 | 日韩在线小视频 | 久久四虎 | 欧美在线色| 欧美专区在线观看 | 99精品久久99久久久久 | 一区二区成人 | 久久久久久成人 | 国产欧美视频一区二区三区 | 亚洲欧美日本国产 | 欧美一区免费 | 国产精品一码二码三码在线 | 亚洲欧美日韩精品久久亚洲区 | 一区二区三区国产 | 国产四区 | 国产视频福利在线观看 | www.788.com色淫免费 | 国产精品精品视频一区二区三区 | 久久精品一区二区三区四区 | 国产精品视频偷伦精品视频 | 欧美四虎 | 日韩在线一区二区三区 | 午夜久久久久久久久久一区二区 | 爱爱爱av| 不卡一区 | 黄色片大全在线观看 | 国产精品综合色区在线观看 | 青春草国产 | 乳色吐息在线观看 | 三级视频在线观看电影 | 午夜小视频在线播放 | 国产精品久久久久久久久久久久久久 | 亚洲精品福利视频 | 欧美在线综合 |