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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20 RES485主從通信程序 液晶1602 顯示(帶限溫)

[復制鏈接]
跳轉到指定樓層
樓主

東西貨真價實,有代碼有注釋,真給力
     寫了一個測溫的程序,測溫的是主機測溫,在從機的1602顯示出來,并且有限溫的調節。里面有比較詳細的講說,適合與我一樣的菜鳥借鑒借鑒!
     有需要的同學可以看看吧



DS18B20 RES485 液晶1602 顯示(帶限溫).rar (131.96 KB, 下載次數: 85)



主機程序:
  1. #include<main.h>
  2. #include<DS18B20.h>

  3. uchar  Uart_flag=0;                 //串口標志位
  4. uchar k1num=0;
  5. uchar a;

  6. char TH=10,TL=-10;                  //設置限制最高值、最低值
  7. void key_scan();

  8. /****
  9. *****延時1MS函數
  10. ****/

  11. void delay(uint x)
  12. {
  13.         uchar m,n;
  14.         for(m=x;m>0;m--)
  15.         for(n=110;n>0;n--);
  16. }
  17. /***
  18. **函數名:UART_init()
  19. **功能:  串口初始化
  20. ****/
  21. void UART_init()
  22. {
  23.         TMOD=0x20;
  24.         SCON=0x50;
  25.         TH1=0xFD;
  26.         TL1=0xFD;
  27.         TR1=1;

  28.         en=1;           //485一直在寫
  29. }
  30. /***
  31. **函數名:UART_sent()
  32. **功能:  串口發送一個字節
  33. ****/
  34. void UART_sent(uchar date)
  35. {
  36.        
  37.         SBUF=date;
  38.         while(!TI);
  39.         TI=0;
  40. }
  41. /***
  42. **函數名:SPEAK()
  43. **功能:  做報警鈴聲
  44. ****/
  45. void SPEAK()
  46. {
  47.                 beep=0;
  48.                 delay(160);
  49.                 beep=1;       
  50. }
  51. /***
  52. **函數名:main()
  53. **功能:  主函數
  54. ****/
  55. void main()
  56. {
  57.         int ans;         //讀取的溫度寄存器
  58.          uchar flag;   //正負位標志
  59.         UART_init();
  60.         while(1)
  61.         {         
  62.                 key_scan();
  63.                
  64.                 /************* 正常溫度*********************/
  65.                 if(Uart_flag==0)
  66.                 {
  67.                                
  68.                         DS18B20_start_change();         //開始讀溫度
  69.                         delay(1000);
  70.                         ans=DS18B20_read_date();
  71.                         if((ans>TH)||(ans<TL))         //                判斷溫度是否超過限溫值
  72.                         {
  73.                                 P0=0;
  74.                                 SPEAK();
  75.                         }
  76.                         else               
  77.                         {
  78.                                 P0=0xff;
  79.                                 beep=1;
  80.                         }
  81.                         /******判斷是否為負溫度********/
  82.                         if(ans<0)
  83.                         {
  84.                                 ans=-ans;
  85.                                 flag=1;
  86.                         }
  87.                         else
  88.                                 flag=0;
  89.                        
  90.                         if(flag==1)                         //負溫度,發送‘-’
  91.                                 UART_sent('-');
  92.                         else
  93.                                 UART_sent('+');         //正溫度,發送‘+’
  94.                         UART_sent( ( uchar )ans);
  95.                 }
  96.                        
  97.                 /**********調節上限溫度*****************/
  98.                 if(Uart_flag==1)
  99.                 {
  100.                         UART_sent('!');                //調節上限溫度標志
  101.                            _nop_();
  102.                         _nop_();
  103.                    UART_sent(TH);                //發送上限溫度標志
  104.                 }
  105.                 /**********調節下限溫度**************/
  106.                 if(Uart_flag==2)
  107.                 {
  108.                         UART_sent('@');                //調節下限溫度標志
  109.                            _nop_();
  110.                         _nop_();
  111.                    UART_sent(TL);                //發送下限溫度標志
  112.                 }
  113.         }
  114. }
  115. /***
  116. **函數名:key_scan()
  117. **功能:  掃描鍵盤
  118. ****/
  119. void key_scan()
  120. {
  121.         if(k1==0)
  122.         {
  123.                 delay(2);
  124.                 if(k1==0)
  125.                 {
  126.                         while(!k1);                          //松手檢測
  127.                         k1num++;
  128.                         if(k1num==1)
  129.                         {
  130.                                 Uart_flag=1;        //發送限制最高溫度標志
  131.                         }
  132.                         if(k1num==2)
  133.                         {
  134.                                 Uart_flag=2;        //發送限制最低溫度標志
  135.                         }
  136.                         if(k1num==3)
  137.                         {
  138.                                 Uart_flag=0;
  139.                                 k1num=0;       
  140.                         }
  141.                 }
  142.         }
  143.         if(k1num!=0)
  144.         {
  145.                 switch(k1num)
  146.                 {
  147.                         case 1:                                                          //調節最高限溫值
  148.                                 {
  149.                                         if(k2==0)
  150.                                         {
  151.                                                 delay(2);
  152.                                                 if(k2==0)
  153.                                                 {
  154.                                                         while(!k2);
  155.                                                         TH++;
  156.                                                         if(TH>=30)
  157.                                                                 TH=30;       
  158.                                                 }
  159.                                         }
  160.                                         if(k3==0)
  161.                                         {
  162.                                                 delay(2);
  163.                                                 if(k3==0)
  164.                                                 {
  165.                                                         while(!k3);
  166.                                                         TH--;
  167.                                                         if(TH<0)
  168.                                                                 TH=0;       
  169.                                                 }
  170.                                         }

  171.                                 }break;
  172.                         case 2:                                                                //調節最低限溫值
  173.                                 {
  174.                                         if(k2==0)
  175.                                         {
  176.                                                 delay(2);
  177.                                                 if(k2==0)
  178.                                                 {
  179.                                                         while(!k2);
  180.                                                         TL++;
  181.                                                         if(TL>0)
  182.                                                                 TL=0;       
  183.                                                 }
  184.                                         }
  185.                                         if(k3==0)
  186.                                         {
  187.                                                 delay(2);
  188.                                                 if(k3==0)
  189.                                                 {
  190.                                                         while(!k3);
  191.                                                         TL--;
  192.                                                         if(TL<-30)
  193.                                                                 TL=-30;       
  194.                                                 }
  195.                                         }

  196.                                 }break;
  197.                 }       
  198.         }
  199. }
復制代碼

從機程序:
  1. #include<main.h>
  2. #include<1602.h>
  3. #include<ds1302.h>
  4. uchar time[]={40,59,23,25,7,3,12};        //2012年7月25日 23:59: 40
  5. uchar code tab1[]="20  -  -   ";
  6. uchar code tab2[]="Temp:      :  :";
  7. uchar flag;
  8. uchar wendu;

  9. /****
  10. *******        延時1ms函數
  11. *****/
  12. void delay(uint x)
  13. {
  14.         uint m,n;
  15.         for(m=x;m>0;m--)
  16.         for(n=110;n>0;n--);
  17. }
  18. /****
  19. *******        串口初始化函數
  20. *****/
  21. void uart_init()
  22. {
  23.         TMOD=0x20;                //9600bps
  24.         SCON=0x50;
  25.         TH1=0xFD;
  26.         TL1=0xFD;
  27.         TR1=1;

  28.         ES=1;
  29.         EA=1;

  30.         UART_EN=0;           //串口一直處于接收狀態
  31. }

  32. /****
  33. *******        主函數
  34. *****/
  35. void main()
  36. {
  37.                
  38.         uart_init();
  39.         DS1302_set_time(&time);                                 //設置時鐘初值
  40.         while(1)
  41.         {       
  42.                 if((flag==0)||(flag==1))           //正常顯示時間、溫度
  43.                 {
  44.                         lcd_init();
  45.                         lcd_write_str(0x84,tab1);
  46.                         lcd_write_str(0xc0,tab2);
  47.                         while((flag==0)||(flag==1))
  48.                         {
  49.                
  50.                                 DS1302_read_time(&time);          
  51.                                 lcd_write_time(0x86,time[6]);  //年
  52.                                 switch(time[5])                               //星期
  53.                                 {
  54.                                         case 1:        lcd_write_str(0x8F,"MON");break;
  55.                                         case 2:        lcd_write_str(0x8F,"TUE");break;
  56.                                         case 3:        lcd_write_str(0x8F,"WED");break;
  57.                                         case 4:        lcd_write_str(0x8F,"THU");break;
  58.                                         case 5:        lcd_write_str(0x8F,"FRI");break;
  59.                                         case 6:        lcd_write_str(0x8F,"SAT");break;
  60.                                         case 7:        lcd_write_str(0x8F,"SUN");break;
  61.                                 }
  62.                                 lcd_write_time(0x89,time[4]);  //月
  63.                                 lcd_write_time(0x8c,time[3]);  //日
  64.                                 lcd_write_time(0xc9,time[2]);  //時
  65.                                 lcd_write_time(0xcc,time[1]);  //分
  66.                                 lcd_write_time(0xcf,time[0]);        //秒
  67.                                 if(flag==1)                                                   //顯示負溫度
  68.                                 {
  69.                                         lcd_write_com(0xc5);
  70.                                         lcd_write_date('-');
  71.                                         lcd_wendu(0xc6,wendu);
  72.                                 }
  73.                                 if(flag==0)                                                         //顯示正溫度
  74.                                 {
  75.                                         lcd_wendu(0xc5,wendu);
  76.                                         lcd_write_com(0xc7);
  77.                                         lcd_write_date(' ');
  78.                                 }
  79.                         }
  80.                 }
  81.                 if(flag==2)                                                                          //顯示限溫最高值
  82.                 {
  83.                         lcd_init();                  
  84.                         lcd_write_str(0x80,"PSE SET HIGHEST TEMP");
  85.                         lcd_write_str(0xC0,"Temperatuer:   C");
  86.                         while(flag==2)
  87.                         {
  88.                                 lcd_wendu(0xcc,wendu);       
  89.                         }
  90.                 }
  91.                 if(flag==3)                                                                        //顯示限溫最低值
  92.                 {
  93.                         lcd_init();
  94.                         lcd_write_str(0x80,"PSE SET LOWEST TEMP");
  95.                         lcd_write_str(0xC0,"Temperatuer:-   C");
  96.                         while(flag==3)
  97.                         {
  98.                                 lcd_write_com(0xc5);
  99.                                 lcd_write_date('-');
  100.                                 lcd_wendu(0xcd,-wendu);       
  101.                         }
  102.                 }       
  103.         }
  104. }
  105. /****
  106. *******        串口中斷服務程序函數
  107. *****/
  108. void ser() interrupt 4
  109. {
  110.         static uchar string[2],i;
  111.         if(RI)
  112.         {
  113.                 RI=0;
  114.                 string[i++]=SBUF;
  115.                 if(i>1)
  116.                         i=0;

  117.                 if(string[0]=='-')
  118.                 {         
  119.                         flag=1;                                  //負溫度
  120.                 }
  121.                 if(string[0]=='+')                //正溫度
  122.                 {         
  123.                          flag=0;
  124.                 }
  125.                 if(string[0]=='!')
  126.                 {         
  127.                         flag=2;                                  //顯示上限溫度
  128.                 }
  129.                 if(string[0]=='@')
  130.                 {         
  131.                         flag=3;                                  //顯示下限溫度
  132.                 }
  133.                
  134.                 wendu=string[1];                //存儲數值
  135.         }       
  136. }
復制代碼



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

使用道具 舉報

沙發
ID:58937 發表于 2017-3-4 10:20 | 只看該作者
謝謝你的分享...............
回復

使用道具 舉報

板凳
ID:63317 發表于 2019-1-29 08:56 | 只看該作者
很好!解析詳細,值得學習!
回復

使用道具 舉報

地板
ID:79544 發表于 2019-6-3 17:19 | 只看該作者
感謝樓主分享,好東西學習啦。謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线一区二区三区 | 中文字幕一区二区三区不卡 | 欧美性猛交 | 国产成人在线播放 | 在线视频一区二区 | 91麻豆精品国产91久久久更新资源速度超快 | 91精品国产92 | 天堂久 | 在线观看日韩精品视频 | 久久免费观看一级毛片 | 成人亚洲| 久久久久久久久久久久91 | 91亚洲国产亚洲国产 | 九九在线精品视频 | 国产一级毛片视频 | 中文字幕视频一区 | 日韩精品一区二区三区中文字幕 | 巨大荫蒂视频欧美另类大 | 日韩午夜一区二区三区 | 国产一级片91 | 国产乱人伦 | 色噜噜狠狠色综合中国 | 高清一区二区三区 | 在线婷婷 | 影音av| av黄色免费 | 日韩欧美精品在线 | 久久亚洲国产 | 精品视频久久久久久 | 精久久久久 | 国产女人精品视频 | 久久91精品久久久久久9鸭 | 亚洲女优在线播放 | 91av精品 | 中文字幕人成人 | 97久久精品午夜一区二区 | 日韩在线观看一区 | 99久久精品国产麻豆演员表 | 亚洲国产成人精品久久久国产成人一区 | 欧美一区二区三区小说 | 91精品国产色综合久久 |