找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2987|回复: 1
收起左侧

基于stc89c52的智能温控器Proteus仿真程序

[复制链接]
ID:591042 发表于 2020-6-11 21:42 | 显示全部楼层 |阅读模式
该系统为基于51单片机的智能温控器,采用了DS18b20温度传感器和4位数码管显示。
捕获.JPG 低温报警.JPG 捕获1.JPG

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "absacc.h"

  3. unsigned char code tab[]={0X3F,0X24,0X5D,0X75,0X66,0X73,0X7B,0X25,0X7F,0X77,0X40};           //共阴 (cc)


  4. sbit DQ=0xb7;        //c51与DS18B20通信口
  5. sbit P07=0x87;        //小数点
  6. sbit RED=0x97;          //高温报警灯
  7. sbit GREEN=0x96;  //低温报警灯
  8. sbit SET=0x90;          //以下按钮设置
  9. sbit NEXT=0x91;
  10. sbit REDUCE=0x92;
  11. sbit ADD=0x93;

  12. unsigned char tempL=0;        //温度低八位
  13. unsigned char tempH=0;         //温度高八位
  14. float temperature;         //显示温度值
  15. float temperatureH=30,temperatureL=10;  //报警温度
  16. int tH=0,tL=0;//报警状态,1为关闭
  17. int m,k=1,l,keyon,keytype,out=0;//设置报警温度时使用的中间变量

  18. void delay(unsigned int time)
  19. {
  20. while(time--);
  21.   
  22. }

  23. void display(float k)         //显示温度
  24. {
  25.   if(k>=0)                //正温度显示
  26.   {
  27.     P2=0xfe;
  28.     P0=tab[(int)(k/100)];
  29.     delay(260);
  30.     P0=0x00;
  31.   }
  32.   else                        //负温度显示负号
  33.   {
  34.     k=-k;
  35.         P2=0xfe;
  36.         P0=0x40;
  37.         delay(260);
  38.         P0=0x00;
  39.   }

  40.   P2=0xfd;                  //温度十位显示
  41.   P0=tab[(((int)k)%100)/10];
  42.   delay(260);
  43.   P0=0x00;

  44.   P2=0xfb;                 //温度个位显示
  45.   P0=tab[((int)k)%10];
  46.   P07=1;
  47.   delay(260);
  48.   P0=0x00;

  49.   P2=0xf7;                   //温度一位小数显示
  50.   P0=tab[((int)(k*10))%10];
  51.   delay(260);
  52.   P0=0x00;

  53. }

  54. Init_DS18B20(void)
  55. {
  56.   unsigned char x=0;
  57.   DQ=1;
  58.   delay(8);
  59.   DQ=0;
  60.   delay(85);
  61.   DQ=1;
  62.   delay(14);
  63.   x=DQ;

  64.   delay(20);
  65. }

  66. ReadOneChar(void)
  67. {
  68. /* unsigned char i=0;
  69.   unsigned  char dat=0;
  70.   for (i=8;i>0;i--)
  71.   {
  72.     DQ=1;
  73.         delay(1);
  74.         DQ=0;
  75.         dat>>=1;
  76.         DQ=1;
  77.         if(DQ) dat|=0x80;
  78.         delay(4);
  79.   }
  80.   return(dat);*/
  81.        
  82. unsigned char i,dat=0;
  83.         DQ = 1;
  84.         //_nop_();
  85.         delay(1);
  86.         for(i=0;i<8;i++)
  87.         {
  88.                  DQ = 0;
  89.                delay(1);
  90.                 dat >>= 1;
  91.                 DQ = 1;
  92.               delay(1);
  93.                 if(DQ)
  94.                         dat |= 0X80;
  95.                 delay(30);
  96.                 DQ = 1;
  97.         }
  98.         return dat;
  99.        
  100.        
  101. }

  102. WriteOneChar(unsigned char dat)
  103. {
  104.   unsigned char i=0;
  105.   for (i=8;i>0;i--)
  106.   {                                                               
  107.     DQ=0;
  108.         DQ=dat&0x01;
  109.         delay(5);
  110.         DQ=1;
  111.         dat>>=1;
  112.                
  113.   }
  114.   delay(4);
  115. }
  116. ConversionTemperature()
  117. {
  118.   Init_DS18B20();
  119.   WriteOneChar(0xcc);
  120.   WriteOneChar(0x44);
  121.   delay(20);
  122. }

  123. ReadTemperature(void)
  124. {
  125.   char ctempL,ctempH;
  126.        
  127.   Init_DS18B20();
  128.   WriteOneChar(0xcc);
  129.   WriteOneChar(0xbe);

  130.   tempL=ReadOneChar();                    
  131.   tempH=ReadOneChar();

  132.   if(tempH<0xf8) //温度是否小于零
  133.     temperature=((tempH*256)+tempL)* 0.0625;//大于零
  134.          if  (temperature>temperatureH,tH=-1);
  135.          if  (temperature<temperatureL,tL=-1);
  136.   else          
  137.     {
  138.           ctempL=tempL;
  139.       ctempH=tempH;          
  140.           temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
  141.           temperature=-temperature;
  142.         }
  143.   delay(200);
  144.   return(temperature);
  145. }

  146. ///////////////////////////报警设置显示/////////////////////////

  147. void Display2()
  148. { ///////////////////高温报警显示////////////////////
  149.   if(m==0||m==1)
  150.    {
  151.      P2=0xfe;
  152.      P0=0x6e;
  153.      delay(70);
  154.      P0=0x00;
  155.             if(m==0&&k==-1) delay(70);
  156.      else
  157.            {
  158.               if(tH==1)
  159.                     {
  160.                            P2=0xfd;                  
  161.                P0=0x4b;
  162.                delay(70);
  163.                P0=0x00;
  164.                         }
  165.                   else
  166.                     {
  167.                        P2=0xfd;                 
  168.                P0=0x3f;
  169.                delay(70);
  170.                P0=0x00;
  171.                     }
  172.            }
  173.          if(m==1&&k==-1) delay(100);
  174.      else
  175.            {
  176.               if(temperatureH>=0)
  177.                     {
  178.                            P2=0xfb;                  
  179.                P0=tab[(int)(temperatureH/10)];
  180.                delay(70);
  181.                P0=0x00;
  182.                            P2=0xf7;                  
  183.                P0=tab[(int)(temperatureH)%10];
  184.                delay(70);
  185.                P0=0x00;
  186.                          }
  187.                   else
  188.                     {
  189.                        P2=0xfb;                  
  190.                P0=0x40;                        //////显示负号
  191.                delay(70);
  192.                P0=0x00;
  193.                            P2=0xf7;                  
  194.                P0=tab[(int)(-temperatureH)%10];
  195.                delay(70);
  196.                P0=0x00;
  197.                     }

  198.            }
  199.     }
  200.   //////////////////////////////////////////////////
  201.   ///////////////////低温报警显示//////////////////
  202.   else if(m==2||m==3)
  203.    {
  204.      P2=0xfe;
  205.      P0=0x1a;
  206.      delay(70);
  207.      P0=0x00;
  208.             if(m==2&&k==-1) delay(70);
  209.      else
  210.            {
  211.               if(tL==1)
  212.                     {
  213.                            P2=0xfd;                  
  214.                P0=0x4b;
  215.                delay(70);
  216.                P0=0x00;
  217.                         }
  218.                   else
  219.                     {
  220.                        P2=0xfd;                 
  221.                P0=0x3f;
  222.                delay(70);
  223.                P0=0x00;
  224.                     }
  225.            }
  226.          if(m==3&&k==-1) delay(100);
  227.      else
  228.            {
  229.               if(temperatureL>=0)
  230.                     {
  231.                            P2=0xfb;                  
  232.                P0=tab[(int)(temperatureL/10)];
  233.                delay(70);
  234.                P0=0x00;       
  235.                            P2=0xf7;                  
  236.                P0=tab[(int)(temperatureL)%10];
  237.                delay(70);
  238.                P0=0x00;
  239.                          }
  240.                   else
  241.                     {
  242.                        P2=0xfb;                  
  243.                P0=0x40;                         ////显示负号
  244.                delay(70);
  245.                P0=0x00;
  246.                            P2=0xf7;                  
  247.                P0=tab[(int)(-temperatureL)%10];
  248.                delay(70);
  249.                P0=0x00;
  250.                     }
  251.                   
  252.            }
  253.    }
  254.   ///////////////////////////////////////////////////////
  255.   if(l==200){k=-k;l=0;}
  256.   l++;
  257. }
  258. /////////////////////////////报警设置显示结束///////////////////////////////////


  259. ////////////////////////////////报警设置/////////////////////////////////////////
  260. void seting()
  261. {
  262.    if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1);          //无键盘按下
  263.    else                                                 /////有键盘按下时
  264.     {
  265.           keyon=1;
  266.           if(SET==0)keytype=0;
  267.           if(NEXT==0)keytype=1;
  268.           if(REDUCE==0)keytype=2;
  269.           if(ADD==0)keytype=3;
  270.         }
  271.    if(keyon==1&&SET==1&&NEXT==1&&REDUCE==1&&ADD==1)                 //键盘松开后判断键盘状态
  272.     {
  273.           if(keytype==1)////////////////菜单下翻
  274.             {
  275.                   if(m>=3)m=0;
  276.               else m++;
  277.                  }
  278.           if(keytype==2)        ////////////////加操作
  279.             {
  280.                   if(m==0)tH=-tH;
  281.                   if(m==1)
  282.                     {
  283.                           if(temperatureH>(temperatureL+1)) temperatureH--;
  284.                           else temperatureH=99;
  285.                         }
  286.                   if(m==2)tL=-tL;
  287.                   if(m==3)
  288.                     {
  289.                           if(temperatureL>-9) temperatureL--;
  290.                           else temperatureL=(temperatureH-1);
  291.                         }
  292.                 }
  293.           if(keytype==3)                 ////////////////减操作
  294.             {
  295.                   if(m==0)tH=-tH;
  296.                   if(m==1)
  297.                     {
  298.                           if(temperatureH<99) temperatureH++;
  299.                           else temperatureH=(temperatureL+1);
  300.                         }
  301.                   if(m==2)tL=-tL;
  302.                   if(m==3)
  303.                     {
  304.                           if(temperatureL<(temperatureH-1)) temperatureL++;
  305.                           else temperatureL=-9;
  306.                         }
  307.                 }
  308.           if(keytype==0)                          ///////////跳出温度设置
  309.             {
  310.               keyon=0;
  311.               keytype=4;
  312.                   out=1;               
  313.                 }
  314.           keyon=0;
  315.           keytype=4;
  316.         }
  317. }
  318. /////////////////////////////报警设置结束/////////////////////////////////////////
  319. void main()                                       
  320. {
  321.   P1=0XFF;
  322.   while(1)
  323.   {
  324.     ConversionTemperature();//开始温度转换
  325.                 ReadTemperature( );
  326.                
  327.           display(temperature);//显示温度
  328.         if(SET==0)        /////////////////////////进入报警温度设定
  329.           {
  330.             out=0;
  331.             delay(300);
  332.                 while(SET==0);
  333.                 m=0;
  334.                 l=0;
  335.                 keyon=0;
  336.                 keytype=4;
  337.                 while(1)
  338.                   {
  339.                     Display2();
  340.                         seting();
  341.                         if (out==1)break;
  342.                   }
  343.                 delay(200);
  344.                 while(SET==0);
  345.           }
  346.         if(tH==1)RED=1;
  347.         else if(tH==-1&&temperature>=temperatureH) RED=0;  //////满足条件是开启高温报警
  348.         else if(temperature<(temperatureH-0.9))RED=1;
  349.         if(tL==1)GREEN=1;
  350.         if(tL==-1&&temperature<=temperatureL) GREEN=0;//////满足条件时开启低温报警
  351.         else if(temperature>(temperatureL+1)) GREEN=1;
  352.         ReadTemperature();//读取温度
  353.         display(temperature);//显示温度
  354.        
  355.   }
  356. }
复制代码

所有资料51hei提供下载:
仿真图.zip (31.78 KB, 下载次数: 37)

评分

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

查看全部评分

回复

使用道具 举报

ID:512926 发表于 2020-6-16 10:20 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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