找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3346|回复: 2
收起左侧

DS18B20+RS485+液晶1602+显示(带限温)Proteus仿真+单片机程序

[复制链接]
ID:509881 发表于 2019-6-10 16:18 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  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. ……………………

  178. …………限于本文篇幅 余下代码请从附件下载:

复制代码

全部资料51hei下载地址:
DS18B20 RES485 液晶1602 显示(带限温).zip (153.18 KB, 下载次数: 166)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:76408 发表于 2019-11-30 11:56 | 显示全部楼层
谢谢楼主,我下载了。。。。。
回复

使用道具 举报

ID:258520 发表于 2019-12-19 20:39 | 显示全部楼层
可以运行成功了,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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