找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机温度控制上下限 数码管

[复制链接]
跳转到指定楼层
楼主
ID:325974 发表于 2018-5-9 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于单片机的温度控制的设计

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <DS18B20.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define SMGIO P0

  7. sbit SET=P3^2;                   //定义设定上下限键
  8. sbit ADD=P3^4;                   //定义增加键
  9. sbit DEC=P3^5;                   //定义减小限键          
  10. sbit SMG1=P2^0;                   //定义数码管第一位
  11. sbit SMG2=P2^1;                   //定义数码管第二位
  12. sbit SMG3=P2^2;                   //定义数码管第三位
  13. sbit SMG4=P2^3;                   //定义数码管第四位
  14. sbit BEEP=P2^7;                   //定义蜂鸣器报警
  15. sbit LED1=P1^0;                   //风扇降温
  16. sbit LED2=P1^1;                   //加热棒加热
  17. uint tempValue;                   //变量 存储当前温度值
  18. uint HI_Alarm=30;           //初始上限
  19. uint LO_Alarm=25;           //初始下限
  20. uchar SMG_CC[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xff};                  
  21. uchar SMG_CC_DOT[]={0x40,0x79,0x24,0x30,0x19,0x12, 0x02,0x78,0x00,0x10,0xff};          

  22. /********************************************************************/
  23. /*                                                1ms延时                                                                                */
  24. /********************************************************************/

  25. void delayms(uint x)
  26. {
  27. uchar i;
  28. while(x--)
  29. {
  30.   for(i=150;i>0;i--);
  31. }
  32. }

  33. void Display_Temperature()                   //显示温度
  34. {
  35.         char smg1,smg2,smg3,smg4;
  36.         smg1=tempValue/1000;                         //以下表示将温度值拆分开
  37.         smg2=(tempValue-smg1*1000)/100;
  38.         smg3=(tempValue%100)/10;
  39.         smg4=tempValue%10;

  40.         if(tflag==1)                                         //负数显示
  41.                 {
  42.                         SMGIO=SMG_CC[smg4];                //显示小数位
  43.                         SMG4=0;
  44.                         delayms(1);
  45.                         SMG4=1;
  46.                         SMGIO=SMG_CC_DOT[smg3];         //显示个数位
  47.                         SMG3=0;
  48.                         delayms(1);
  49.                         SMG3=1;
  50.                         if(smg2==0)
  51.                         {
  52.                                 SMGIO=0x40;                         //显示十数位
  53.                                 SMG2=0;
  54.                                 delayms(1);
  55.                                 SMG2=1;
  56.                                 SMGIO=0x00;                         //显示百数位
  57.                                 SMG1=0;
  58.                                 delayms(1);
  59.                                 SMG1=1;
  60.                         }
  61.                         else
  62.                         {
  63.                                 SMGIO=SMG_CC[smg2];         //显示十数位
  64.                                 SMG2=0;
  65.                                 delayms(1);
  66.                                 SMG2=1;
  67.                                 SMGIO=0x40;                         //显示十数位
  68.                                 SMG1=0;
  69.                                 delayms(1);
  70.                                 SMG1=1;                                       
  71.                         }
  72.                 }
  73.         else                                //正数显示
  74.                 {
  75.                         SMGIO=SMG_CC[smg4];         //显示小数位
  76.                         SMG4=0;
  77.                         delayms(1);
  78.                         SMG4=1;
  79.                         SMGIO=SMG_CC_DOT[smg3];         //显示个数位
  80.                         SMG3=0;
  81.                         delayms(1);
  82.                         SMG3=1;
  83.                         if(smg1==0)                                  
  84.                         {
  85.                                 SMGIO=0x00;         
  86.                                 SMG1=0;
  87.                                 delayms(1);
  88.                                 SMG1=1;
  89.                                 if(smg2==0)
  90.                                 {
  91.                                         SMGIO=0x00;         
  92.                                         SMG1=0;
  93.                                         delayms(1);
  94.                                         SMG1=1;         
  95.                                 }
  96.                                 else
  97.                                 {
  98.                                         SMGIO=SMG_CC[smg2];         
  99.                                         SMG2=0;
  100.                                         delayms(1);
  101.                                         SMG2=1;               
  102.                                 }
  103.                         }
  104.                         else
  105.                         {
  106.                                 SMGIO=SMG_CC[smg1];
  107.                                 SMG1=0;
  108.                                 delayms(1);
  109.                                 SMG1=1;
  110.                                 SMGIO=SMG_CC[smg2];
  111.                                 SMG2=0;
  112.                                 delayms(1);
  113.                                 SMG2=1;
  114.                         }                       
  115.                 }
  116. }
  117. void Display_HI_Alarm()
  118. {
  119.         SMGIO=~0x76;                //显示H
  120.         SMG1=0;
  121.         delayms(1);
  122.         SMG1=1;
  123.         SMGIO=~0x40;                //显示-
  124.         SMG2=0;
  125.         delayms(1);
  126.         SMG2=1;

  127.         SMGIO=SMG_CC[HI_Alarm/10];        //显示报警高值十位
  128.         SMG3=0;
  129.         delayms(1);
  130.         SMG3=1;
  131.         SMGIO=SMG_CC[HI_Alarm%10];        //显示报警高值个数位
  132.         SMG4=0;
  133.         delayms(1);
  134.         SMG4=1;       
  135. }
  136. void Display_LO_Alarm()
  137. {
  138.         SMGIO=~0x38;                //显示L
  139.         SMG1=0;
  140.         delayms(1);
  141.         SMG1=1;
  142.         SMGIO=~0x40;                //显示-
  143.         SMG2=0;
  144.         delayms(1);
  145.         SMG2=1;

  146.         SMGIO=SMG_CC[LO_Alarm/10];        //显示报警高值十位
  147.         SMG3=0;
  148.         delayms(1);
  149.         SMG3=1;
  150.         SMGIO=SMG_CC[LO_Alarm%10];        //显示报警高值个数位
  151.         SMG4=0;
  152.         delayms(1);
  153.         SMG4=1;       
  154. }
  155. void SET_KEY()
  156. {          bit SET_FLAG=1;
  157.         if(SET==0)                                         //设定按键按下
  158.                 {
  159.                 delayms(40);
  160.                 if(SET==1)                                 //延时去除抖动再次判断是否按下按键
  161.                 {
  162.                         while(SET_FLAG==1)
  163.                         {
  164.                                 Display_HI_Alarm();           //设定上限温度值
  165.                                 if(ADD==0)                                //增加按键
  166.                                         {
  167.                                                 delayms(40);          //延时去除抖动再次判断是否按下按键
  168.                                                 if(ADD==1)
  169.                                                         HI_Alarm++;         //温度值加一
  170.                                         }
  171.                                 if(DEC==0)                                  //减小按键
  172.                                         {
  173.                                                 delayms(40);
  174.                                                 if(DEC==1)                   //延时去除抖动再次判断是否按下按键
  175.                                                         HI_Alarm--;           //温度值减一
  176.                                         }
  177.                                 if(SET==0)                                 //以下表示 再次按下设定按键 进入设定下限程序       
  178.                                         {
  179.                                                 delayms(40);               
  180.                                                 if(SET==1)                                                            //延时去除抖动再次判断是否按下按键
  181.                                                         {
  182.                                                                 while(1)
  183.                                                                 {
  184.                                                                         Display_LO_Alarm();                   //设定下限温度值
  185.                                                                         if(ADD==0)                                   //增加按键
  186.                                                                                 {
  187.                                                                                         delayms(40);
  188.                                                                                         if(ADD==1)                    //延时去除抖动再次判断是否按下按键
  189.                                                                                                 LO_Alarm++;                //温度值加一
  190.                                                                                 }
  191.                                                                         if(DEC==0)                                        //减小按键
  192.                                                                                 {
  193.                                                                                         delayms(40);
  194.                                                                                         if(DEC==1)                    //延时去除抖动再次判断是否按下按键
  195.                                                                                                 LO_Alarm--;                //温度值减一
  196.                                                                                 }
  197.                                                                         if(SET==0)                                        //设定按键按下
  198.                                                                                 {
  199.                                                                                         delayms(40);
  200.                                                                                         if(SET==1)
  201.                                                                                                 {                                 //延时去除抖动再次判断是否按下按键
  202.                                                                                                         SET_FLAG=0;          
  203.                                                                                                         break;                 //上下限设定完成 退出
  204.                                                                                                 }
  205.                                                                                 }                                       
  206.                                                                 }                                                               
  207.                                                         }
  208.                                         }                                               
  209.                         }
  210.                 }
  211. }       
  212. }

  213. void BJ_LED()
  214. {       
  215.         if(tempValue>=HI_Alarm*10)         //如果温度超过上限
  216.            {       
  217.              BEEP=0;LED1=0;        LED2=1;
  218.            }
  219.         if(tempValue<=LO_Alarm*10)         //如果温度低过下限
  220.            {       
  221.              BEEP=0;LED2=0;LED1=1;               
  222.            }                                                                         
  223.         if(tempValue>LO_Alarm*10&&tempValue<HI_Alarm*10)
  224.            {
  225.              BEEP=1;LED1=1;LED2=1;
  226.            }
  227. }


  228. void main()
  229. {       
  230.         BEEP=1;                  
  231.         LED1=1;
  232.         LED2=1;                                                                 //表示先清除报警
  233.         while(1)
  234.         {         
  235.                 tempValue=ReadTemperature();                         //读取温度值
  236.                 Display_Temperature();                                         //显示温度数据
  237.                 BJ_LED();                                                                 //调用报警函数
  238.                 SET_KEY();                                                                 //调用按键读取函数

  239.         }
  240. }
复制代码

所有资料51hei提供下载:
1-程序.zip (61.92 KB, 下载次数: 46)


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

使用道具 举报

沙发
ID:108622 发表于 2018-7-19 10:03 | 只看该作者
能给个电路图吗
回复

使用道具 举报

板凳
ID:535889 发表于 2019-5-25 21:46 来自手机 | 只看该作者
没有图,有图就好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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