找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3712|回复: 7
打印 上一主题 下一主题
收起左侧

51单片机四路DS18B20温度检测系统代码与Proteus仿真图

  [复制链接]
跳转到指定楼层
楼主
基于51单片机四路温度检测系统DS18B20的仿真和源程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include"stc89c51.h"

  2. #include"define.h"


  3. sbit SetKey = P3^0;
  4. sbit UpKey  = P3^1;
  5. sbit DnKey  = P3^2;
  6. sbit AlarmK = P3^3;
  7. sbit BEEP   = P2^4;

  8. sbit LED1   = P2^0;
  9. sbit LED2   = P2^1;
  10. sbit LED3   = P2^2;
  11. sbit LED4   = P2^3;



  12. extern void StartDs18b20(uchar * ROMCODE);                               
  13. extern void ReadDs18b20(uchar * ROMCODE);
  14. extern  uchar  TZ;                           //转换后的温度值整数部分          
  15. extern  uchar  TD;                           //转换后的温度值整数部分       
  16. //extern void init_lcd (void);
  17. //extern void LcdWrData(uchar content);
  18. //extern  void LcdWrCommand(uchar content)        ;
  19. extern uchar FindDevices(uchar CodeROM[][8]);
  20. data uchar Ds18b20Rom[4][8];
  21. //************************************************************************************************************************
  22. extern uchar   LastDiscrap        ;
  23. //extern void writeChar(uchar x,uchar y,uchar s); //LCD 写字符串
  24. //extern  void writestring(uchar x,uchar y,uchar *s) ;//LCD 写字符串

  25. //extern void LCD_Initial(void);
  26. //extern void write_dat(unsigned char dat);
  27. //extern void command(unsigned int com);

  28. extern  unsigned char tflag;
  29. unsigned char AlarmTempLow=1,AlarmTempTop=125,Set=0;
  30. unsigned char fAlarm=0xff;
  31. unsigned char TP1=0xff,TP2=0xff,TP3=0xff,TP4=0xff;
  32. unsigned char Alarm1=0,Alarm2=0,Alarm3=0,Alarm4=0;       
  33. unsigned char tf1=0,tf2=0,tf3=0,tf4=0;       

  34. void delayms(uint ms)                 //延时xx毫秒
  35. {
  36.         uchar i;
  37.         while(ms--)
  38.         {
  39.                  for(i=0;i<120;i++);
  40.         }
  41. }


  42. sbit RS=P2^5;
  43. sbit RW=P2^6;
  44. sbit EN=P2^7;
  45. #define LCD_BUS P0


  46. void command(unsigned int com)         //LCD写指令
  47. {
  48.    RS=0;                                  //RS为0
  49.    LCD_BUS=com;          //装载指令
  50.    delayms(5);                 //延时5ms
  51.    EN=1;                                 //LCD使能
  52.    delayms(5);                //延时5ms
  53.    EN=0;                                //LCD不使能
  54. }

  55. void write_dat(unsigned char dat)          //LCD写数据
  56. {
  57.    RS=1;                                        //RS为1
  58.    LCD_BUS=dat;                //装载数据
  59.    delayms(5);                         //延时5ms
  60.    EN=1;                                         //LCD使能
  61.    delayms(5);                         //延时5ms
  62.    EN=0;                                         //LCD不使能
  63. }

  64. void writestring(unsigned char x,unsigned char y,unsigned char *s) //LCD 写字符串
  65. {     
  66.         if (y == 0)  command(0x80 + x);     //表示第一行
  67.         else         command(0xC0 + x);      //表示第二行
  68.       
  69.         while (*s)                         //判断是否字符串的结尾
  70.         {     
  71.      write_dat( *s);    //显示当前字符
  72.                 s ++;                             //字符串地址加1
  73.         }
  74. }

  75. void writeChar(unsigned char x,unsigned char y,unsigned char s) //LCD 写字符串
  76. {     
  77.         if (y == 0)  command(0x80 + x);     //表示第一行
  78.         else         command(0xC0 + x);      //表示第二行
  79.       
  80.         {     
  81.      write_dat( s);    //显示当前字符
  82.         }
  83. }


  84. void LCD_Initial(void)                //LCD初始化
  85. {

  86.    EN=0;                                  //LCD不使能
  87.    RW=0;                                  //RW为0
  88.    command(0x38);                //发送初始化指令
  89.    command(0x0c);                //发送初始化指令
  90.    command(0x06);          //发送初始化指令
  91.    command(0x01);          //发送初始化指令
  92.    command(0x80+0x02);        //发送LCD初始位置
  93. }


  94. void Alarm(void)
  95. {
  96.         if(TP1!=0xff)
  97.         {
  98.                 if((TP1>(AlarmTempTop))||(TP1<(AlarmTempLow))||(tf1==0x2d))        {Alarm1=1;LED1=0;}
  99.                 else  {Alarm1=0;LED1=1;}
  100.         }
  101.    else  {Alarm1=0;LED1=1;}
  102.    
  103.         if(TP2!=0xff)
  104.         {
  105.                 if((TP2>(AlarmTempTop))||(TP2<(AlarmTempLow))||(tf2==0x2d))        {Alarm2=1;LED2=0;}
  106.                 else  {Alarm2=0;LED2=1;}
  107.         }
  108.    else  {Alarm2=0;LED2=1;}
  109.    
  110.         if(TP3!=0xff)
  111.         {
  112.                 if((TP3>(AlarmTempTop))||(TP3<(AlarmTempLow))||(tf3==0x2d))        {Alarm3=1;LED3=0;}
  113.                 else  {Alarm3=0;LED3=1;}
  114.         }
  115.    else  {Alarm3=0;LED3=1;}
  116.    
  117.         if(TP4!=0xff)
  118.         {
  119.                 if((TP4>(AlarmTempTop))||(TP4<(AlarmTempLow))||(tf4==0x2d))        {Alarm4=1;LED4=0;}
  120.                 else  {Alarm4=0;LED4=1;}
  121.         }
  122.         else  {Alarm4=0;LED4=1;}
  123.    
  124.         if(fAlarm!=0)
  125.         {
  126.                 if((Alarm1==1)||(Alarm2==1)||(Alarm3==1)||(Alarm4==1)) {BEEP=0;}
  127.                 else BEEP=1;
  128.         }
  129.         else BEEP=1;
  130. }


  131. void DispAlData(void)
  132. {
  133.         unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
  134.        
  135.         i1 = AlarmTempLow/100;          //获得温度值的百位
  136.         i2 = AlarmTempLow%100/10;         //获得温度值的十位
  137.         i3 = AlarmTempLow%10;                 //获得温度值的个位
  138.                        
  139.         i4 = AlarmTempTop/100;          //获得温度值的百位
  140.         i5 = AlarmTempTop%100/10;         //获得温度值的十位
  141.         i6 = AlarmTempTop%10;                 //获得温度值的个位
  142.         writestring(5,1,"   ");
  143.         writestring(13,1,"     ");
  144.         if(i1!=0)        writeChar(5,1,i1+'0');
  145.         if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
  146.         if(i1!=0) writeChar(6,1,i2+'0');
  147.         if((i1==0)&&(i2==0))        writeChar(5,1,i3+'0');
  148.         else if((i1==0)&&(i2!=0))        writeChar(6,1,i3+'0');
  149.         if((i1!=0))         writeChar(7,1,i3+'0');
  150.                        
  151.         if(i4!=0)        writeChar(13,1,i4+'0');
  152.         if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');
  153.         if(i4!=0) writeChar(14,1,i5+'0');
  154.         if((i4==0)&&(i5==0))        writeChar(13,1,i6+'0');
  155.         else if((i4==0)&&(i5!=0))        writeChar(14,1,i6+'0');
  156.         if((i4!=0)) writeChar(15,1,i6+'0');
  157. }


  158. void SetFun(void)
  159. {
  160.         if(SetKey==0)
  161.         {
  162.                 delayms(20);
  163.                 if(SetKey==0)
  164.                 {
  165.                         if(Set<2)        {Set++;writestring(0,1," Low=    Top=   ");}
  166.                         else {Set=0;}
  167.                 }
  168.                 DispAlData();
  169.                 switch(Set)
  170.                 {
  171.                         case 0:  writestring(0,1,"C        D      ");break;
  172.                         case 1:        writestring(0,1,">");writestring(8,1," ");break;
  173.                         case 2:        writestring(0,1," ");writestring(8,1,">");break;
  174.                 }
  175.                
  176.                
  177.                 while(SetKey==0);
  178.         }
  179.        
  180.         if((UpKey==0)&&(Set!=0))
  181.         {
  182.                 delayms(20);
  183.                 if(UpKey==0)
  184.                 {
  185.                         switch(Set)
  186.                         {
  187.                                 case 1:        if(AlarmTempLow<125) AlarmTempLow++;else AlarmTempLow=125; break;
  188.                                 case 2:        if(AlarmTempTop<125) AlarmTempTop++;else AlarmTempTop=125; break;
  189.                         }
  190.                         DispAlData();
  191.                         while(UpKey==0);
  192.                 }
  193.         }
  194.        
  195.         if((DnKey==0)&&(Set!=0))
  196.         {
  197.                 delayms(20);
  198.                 if(DnKey==0)
  199.                 {
  200.                         switch(Set)
  201.                         {
  202.                                 case 1:        if(AlarmTempLow>-20) AlarmTempLow--;else AlarmTempLow=-20; break;
  203.                                 case 2:        if(AlarmTempTop>0) AlarmTempTop--;else AlarmTempTop=0; break;
  204.                         }
  205.                         DispAlData();
  206.                         while(DnKey==0);
  207.                 }
  208.         }
  209.        
  210.         if(AlarmK==0)       
  211.         {
  212.                 delayms(20);
  213.                 if(AlarmK==0)
  214.                 {
  215.                         fAlarm=~fAlarm;
  216.                         while(AlarmK==0)        ;
  217.                 }
  218.         }
  219. }


  220. void main(void)
  221. {
  222.         uint k;
  223.         uchar number;
  224.    BEEP=1;
  225.    LCD_Initial();
  226.         //init_lcd();
  227.    writestring(0,0,"  Search Sensor  ");
  228.    delayms(800);
  229.    number=FindDevices(Ds18b20Rom);
  230.    writestring(0,0,"Search    sensors");
  231.         writeChar(7,0,number/10+'0');
  232.    writeChar(8,0,number%10+'0');
  233.    
  234.    for(k=0;k<number;k++)
  235.    {
  236.       StartDs18b20(& Ds18b20Rom[k][0]);
  237.    }
  238.    delayms(800);
  239.    writestring(0,0,"A        B      ");
  240.    writestring(0,1,"C        D      ");
  241.         while(1)
  242.         {
  243.       if(Set==0)
  244.       {
  245.          for(k=0;k<number;k++)
  246.          {
  247.             StartDs18b20(& Ds18b20Rom[k][0]);                  
  248.                        
  249.             ReadDs18b20(& Ds18b20Rom[k][0]);         
  250.             switch(k)
  251.             {
  252.                case 0:
  253.                   TP1=TZ;tf1=tflag;
  254.                   writeChar(1,0,tflag);
  255.                   writeChar(2,0,TZ/100+'0');
  256.                   writeChar(3,0,TZ/10%10+'0');       
  257.                   writeChar(4,0,TZ%10+'0');
  258.                   writeChar(5,0,'.');               
  259.                   writeChar(6,0,TD+'0');
  260.                   break;
  261.                case 1:
  262.                   TP2=TZ;tf2=tflag;
  263.                   writeChar(10,0,tflag);
  264.                   writeChar(11,0,TZ/100+'0');
  265.                   writeChar(12,0,TZ/10%10+'0');       
  266.                   writeChar(13,0,TZ%10+'0');
  267.                   writeChar(14,0,'.');               
  268.                   writeChar(15,0,TD+'0');
  269.                   break;
  270.                case 2:
  271.                   TP3=TZ;tf3=tflag;
  272.                   writeChar(1,1,tflag);
  273.                   writeChar(2,1,TZ/100+'0');
  274.                   writeChar(3,1,TZ/10%10+'0');       
  275.                   writeChar(4,1,TZ%10+'0');
  276.                   writeChar(5,1,'.');               
  277.                   writeChar(6,1,TD+'0');
  278.                   break;
  279.                case 3:
  280.                   TP4=TZ;tf4=tflag;
  281.                   writeChar(10,1,tflag);
  282.                   writeChar(11,1,TZ/100+'0');
  283.                   writeChar(12,1,TZ/10%10+'0');       
  284.                   writeChar(13,1,TZ%10+'0');
  285.                   writeChar(14,1,'.');               
  286.                   writeChar(15,1,TD+'0');
  287.                   break;
  288.             }         
  289.          }
  290.       }
  291.       SetFun();
  292.                 Alarm();

  293.         }
  294. }
复制代码

所有程序仿真51hei提供下载:
仿真.zip (242.92 KB, 下载次数: 164)


评分

参与人数 1黑币 +15 收起 理由
zy0818 + 15

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1015521 发表于 2022-5-29 20:04 | 只看该作者
感谢楼主的讲解
回复

使用道具 举报

板凳
ID:228452 发表于 2022-5-30 03:03 | 只看该作者
Had similiar project 4xDS18B20 and Modbus...
Nice work..

4xDS18B20_modbus.jpg (171.29 KB, 下载次数: 63)

4xDS18B20_modbus.jpg
回复

使用道具 举报

地板
ID:1088947 发表于 2023-7-21 19:46 | 只看该作者
需要用Proteus7.8版本打开dsn文件  不然工程内是空的没有仿真图
回复

使用道具 举报

5#
ID:1088947 发表于 2023-7-22 18:20 | 只看该作者
想要这样的效果,该怎么做?大佬求教。
回复

使用道具 举报

6#
ID:1088947 发表于 2023-7-22 21:12 | 只看该作者
我改了显示元件后,只能显示一个,不知道是为什么。proteus仿真图是我照着图片弄得。可能有毛病
回复

使用道具 举报

7#
ID:1088947 发表于 2023-7-23 09:12 | 只看该作者
搞好了,是自己放的ds18b20没给序列号导致的只能识别一个
回复

使用道具 举报

8#
ID:1083556 发表于 2023-7-23 12:10 | 只看该作者
非常感谢,很需要这方面的资料,,,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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