找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3415|回复: 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 单片机教程网

快速回复 返回顶部 返回列表