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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
本單片機采用STC89C52RC芯片,用LCD1602顯示溫度上限設定值,下限設定值,
以及在線溫度實時顯示,用18B20溫度傳感器檢測溫度,同時用按鍵設置溫度
上下限,以及設定切換,用timer0中斷設置1秒閃爍指示燈顯示運行狀態。  

制作出來的實物圖如下:


單片機源程序如下:
  1. /******************************************************************
  2. 本單片機采用STC89C52RC芯片,用LCD1602顯示溫度上限設定值,下限設定值,
  3.   以及在線溫度實時顯示,用18B20溫度傳感器檢測溫度,同時用按鍵設置溫度
  4.   上下限,以及設定切換,用timer0中斷設置1秒閃爍指示燈顯示運行狀態。
  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總線端口
  15. sbit led1=P1^1;          //系統運行指示,
  16. uint temp1;  
  17. uchar bai,shi,ge; //測量溫度顯示位置
  18. uchar qian1,bai1,shi1,ge1;//上下限溫度顯示位置
  19. bit flag; //標志位
  20. sbit ds=P2^2;//18B20傳感器 I/O口
  21. sbit beep=P1^0;//溫度報警
  22. uint temp;
  23. sbit led4=P1^4;//溫度上下限設定指示
  24. sbit led3=P1^2;//工作指示

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

  29. /*====================================
  30. 函數        : delay(uint z)
  31. 參數        :z 延時毫秒設定,取值范圍0-65535
  32. 返回值        :無
  33. 描述        :12T/Fosc11.0592M毫秒級延時
  34. ====================================*/
  35. void delay(xms)                                   //毫秒延時函數
  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延時函數
  42. {
  43.          while(t--);
  44. }
  45. void init()                                                   //初始化函數
  46. {
  47.         TMOD=0x01;                                                   //設置定時器0位工作方式(00000001)
  48.         TH0=(65536-22500)/256;                           //裝初值
  49.         TL0=(65536-22500)%256;                           
  50.         EA=1;                                                             //開總中斷
  51.         ET0=1;                                                           //開定時器0中斷
  52.         TR0=1;
  53. }

  54. void ds_reset()           //復位函數
  55. {
  56.         ds=1;
  57.         delayus(5);     //         延時
  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作為標志位,等1表示18b20存在
  66.         delayus(20);
  67. }
  68. bit ds_read_bit(void)                        //讀一位數據函數
  69. {
  70.         bit dat;
  71.         ds=0;
  72.         _nop_();                                   //延時機器周期
  73.         _nop_();
  74.         ds=1;                                                //釋放總線
  75.         _nop_();
  76.         dat=ds;
  77.         delayus(10);               //延時100us
  78.         return dat;
  79. }
  80. uchar ds_read_byte()                   //讀一個字節函數
  81. {
  82.         uchar i,j,k;
  83.         for(i=0;i<8;i++)                  //一個字節8位組成,循環八次
  84.         {
  85.                 j=ds_read_bit();
  86.                 k=(j<<7)|(k>>1);                //讀出的數據最低位在最前面
  87.         }
  88.         return k;
  89. }
  90. void ds_write_byte(uchar dat)      //寫一個字節的函數
  91. {
  92.         uchar i;
  93.         for(i=0;i<8;i++)                        //循環八位將一個字節由低到高寫入
  94.         {
  95.                 ds=0;
  96.                 _nop_();
  97.                 ds=dat&0x01;                        //保留dat的最低位
  98.                 delayus(6);
  99.                 ds=1;                 //釋放總線
  100.                 dat=dat>>1;
  101.         }
  102.         delayus(6);
  103. }
  104. uint read_temp()                //讀取溫度函數
  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;                //得到實際溫度值
  116.         return temp;
  117. }

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

  136.                                 
  137.                     
  138.                
  139.         if((key2==0)&&(flag_qiehuan==0))//溫度加按鈕,k2長按
  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);//松手檢測                 
  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);//松手檢測                 
  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);//松手檢測                 
  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);//        松手檢測         
  217.                 }
  218.         }        
  219.                   
  220. }
  221. void deal()//         溫度報警設定
  222. {
  223.         if((temp>=num_xia)||(temp<=num_shang))        //大于下限或低于上限不報警
  224.         {
  225.                 beep=0;
  226.         }
  227.         if((temp<num_xia)&&(temp>num_shang)) //低于下限或高于上限報警
  228.         {
  229.                 beep=1;
  230.         }        
  231. }                                       
  232. /****************************************/
  233. void display_set_alm()                                        //顯示子函數,報警數據分離,顯示在液晶面板上
  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延時5us函數
  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)//延時1ms函數
  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;                                //數據端置高電平
  258.         delay_DS18B20(10);         //延時

  259.         DQ=0;                                 //數據端置低電平
  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寫位
  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讀字節
  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寫字節
  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)//讀取溫度,并將二進制數據轉換成溫度值
  306. {
  307.         uchar a,b;
  308.         uint temp;
  309.         float t;
  310.         Init_DS18B20();
  311.         Write_Byte_DS18B20(0xcc);//跳過        ROM
  312.     Write_Byte_DS18B20(0x44);//開始轉換溫度
  313.         delay_DS18B20(30);

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

  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;                 //計算溫度值
  323.         temp=t*10+0.5;                 

  324.         return (temp);                // 返回

  325. }
  326. void LCD_Write_Com(uchar com)//         lcd寫命令
  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) //寫入數據函數
  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) // 寫入字符串函數
  356. {     
  357.          while (*s)
  358.          {     
  359.          LCD_Write_Data( *s);     
  360.          s ++;     
  361.          }
  362. }
  363. void LCD_Init(void)  //初始化函數
  364. {
  365.    LCD_Write_Com(0x38);    /*顯示模式設置*/
  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);    /*顯示關閉*/
  373.    LCD_Write_Com(0x01);    /*顯示清屏*/
  374.    LCD_Write_Com(0x06);    /*顯示光標移動設置*/
  375.    delay_ms(1);
  376.    LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
  377. }
  378. void main(void)
  379. {
  380.             
  381.           init();                                //定時器初始化函數調用
  382.         
  383.         {
  384.          ds_reset();
  385.          ds_write_byte(0xcc); //18B20忽略指令
  386.          ds_write_byte(0x44);//18B20溫度轉換指令
  387.          keyscan();//按鍵掃描
  388.          deal();        //測量溫度處理
  389.                
  390.         }
  391.          
  392.         LCD_Init();
  393.         gotoxy(1,1);
  394.     LCD_Write_String("ALM H   L"); //第一行第一列開始寫
  395.         gotoxy(2,1);
  396.         LCD_Write_String("DS18B20:");//第二行第三列開始寫
  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的原因是在ASCII碼中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;         //定時1s燈閃爍
  431.         }
  432. }
復制代碼
此附件由于多人回帖說代碼有錯誤,已經被管理員刪除,無法下載
51單片機-1602 18B20溫度顯示控制.rar (5.96 MB, 下載次數: 48)
此附件由于多人回帖說代碼有錯誤,已經被管理員刪除,無法下載

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:474538 發表于 2019-12-29 08:36 | 只看該作者
程序運行不了,定義的一些led也沒用上,下面圖片是個最基本的錯誤,主函數里面也有錯誤

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

%3X~3@S3BSRW]GW3D3[2UYN.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美综合久久久 | 九九久久精品视频 | 三级成人在线 | 精品一区二区免费视频 | 国产色播av在线 | 一区二区三区视频免费看 | 日本不卡免费新一二三区 | 欧美伊人久久久久久久久影院 | 中文字幕免费中文 | 91久久电影| 欧美一级特黄aaa大片在线观看 | h视频在线免费 | 亚洲狠狠丁香婷婷综合久久久 | 欧美精品二区三区 | 午夜免费视频 | 婷婷国产一区 | 美女视频一区二区三区 | 亚洲精品欧洲 | 久久久久久久久久久久久久久久久久久久 | 伊人天堂网 | 国产成人免费 | 永久www成人看片 | 天天天操 | 精品自拍视频在线观看 | 高清不卡毛片 | 日本精品一区二区三区在线观看视频 | 国产精品一区一区 | 国产成人啪免费观看软件 | 免费特级黄毛片 | 精品美女久久久 | 国产精品 亚洲一区 | 午夜精品久久久久久久星辰影院 | 亚洲精品视 | 亚洲精品一区二区久 | 九九热精品视频 | 国产精品精品久久久久久 | 欧美精品在线视频 | 色视频在线观看 | 国产成人高清视频 | 国产成人精品久久二区二区91 | 亚洲一区视频在线 |