找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5401|回复: 9
收起左侧

单片机数字温度控制系统设计资料

  [复制链接]
ID:372407 发表于 2018-7-16 12:27 | 显示全部楼层 |阅读模式
基于51单片机控制的数字温度控制系统 03.jpg 03、温度过高.jpg 04、温度过低.jpg 02、温度检测.jpg 01、未上电.jpg

单片机源程序如下:

  1. #include <reg52.h>                        // 包含头文件
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替

  5. sbit DQ = P1^1;                                                // DS18B20传感器的引脚定义
  6. sbit w1 = P2^4;                                         // 数码管第1位的控制引脚
  7. sbit w2 = P2^5;                                                // 数码管第2位的控制引脚
  8. sbit w3 = P2^6;                                                // 数码管第3位的控制引脚
  9. sbit w4 = P2^7;                                                 // 数码管第4位的控制引脚
  10. sbit Buzzer  = P1^0;                        // 蜂鸣器引脚
  11. sbit JdqLow  = P2^0;                        // 温度过低继电器控制(加热)
  12. sbit JdqHig  = P2^1;                        // 温度过高继电器控制(降温)
  13. sbit LedLow  = P2^2;                        // 温度低指示灯
  14. sbit LedHig  = P2^3;                        // 温度高指示灯
  15. sbit KeySet  = P3^2;                        // 设置按键
  16. sbit KeyDown = P3^3;                        // 减按键
  17. sbit KeyUp   = P3^4;                        // 加按键



  18. /*   数码管的显示值:  0    1    2    3    4    5     6   7    8    9    -   */
  19. uchar code Array1[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };

  20. /*                     0.   1.   2.   3.   4.   5.    6.  7.   8.   9.  */
  21. uchar code Array2[]={ 0xBf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };


  22. uchar Buff[4];                                        // 显示缓冲区
  23. uchar ShowID=1;                                        // 当前显示的是哪一个数码管

  24. int AlarmLow=150;                                // 默认报警的温度下限值是15度
  25. int AlarmHig=300;                                // 默认报警的温度上限值是30度


  26. /*********************************************************/
  27. // 毫秒级的延时函数,time是要延时的毫秒数
  28. /*********************************************************/
  29. void DelayMs(uint time)
  30. {
  31.         uint i,j;
  32.         for(i=0;i<time;i++)
  33.                 for(j=0;j<112;j++);
  34. }


  35. /*********************************************************/
  36. // 延时15微秒
  37. /*********************************************************/
  38. void Delay15us(void)
  39. {
  40.         _nop_();
  41.         _nop_();
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         _nop_();
  47.         _nop_();
  48.         _nop_();
  49.         _nop_();
  50.         _nop_();
  51.         _nop_();
  52.         _nop_();
  53.         _nop_();
  54.         _nop_();
  55. }


  56. /*********************************************************/
  57. // 复位DS18B20(初始化)
  58. /*********************************************************/
  59. void DS18B20_ReSet(void)
  60. {
  61.         uchar i;
  62.         DQ=0;

  63.         i=240;
  64.         while(--i);

  65.         DQ=1;

  66.         i=30;
  67.         while(--i);

  68.         while(~DQ);

  69.         i=4;
  70.         while(--i);
  71. }


  72. /*********************************************************/
  73. // 向DS18B20写入一个字节
  74. /*********************************************************/
  75. void DS18B20_WriteByte(uchar dat)
  76. {
  77.         uchar j;
  78.         uchar btmp;
  79.         
  80.         for(j=0;j<8;j++)
  81.         {
  82.                 btmp=0x01;
  83.                 btmp=btmp<<j;
  84.                 btmp=btmp&dat;
  85.                
  86.                 if(btmp>0)                // 写1
  87.                 {
  88.                         DQ=0;
  89.                         Delay15us();
  90.                         DQ=1;
  91.                         Delay15us();
  92.                         Delay15us();
  93.                         Delay15us();
  94.                         Delay15us();
  95.                 }
  96.                 else                        // 写0
  97.                 {
  98.                         DQ=0;
  99.                         Delay15us();
  100.                         Delay15us();
  101.                         Delay15us();
  102.                         Delay15us();
  103.                         DQ=1;
  104.                         Delay15us();
  105.                 }
  106.         }
  107. }


  108. /*********************************************************/
  109. // 读取温度值
  110. /*********************************************************/
  111. int DS18B20_ReadTemp(void)
  112. {
  113.         uchar j;
  114.         int b,temp=0;        

  115.         DS18B20_ReSet();                                                        // 产生复位脉
  116.         DS18B20_WriteByte(0xcc);                        // 忽略ROM指令
  117.         DS18B20_WriteByte(0x44);                        // 启动温度转换指令

  118.         DS18B20_ReSet();                                                        // 产生复位脉
  119.         DS18B20_WriteByte(0xcc);                        // 忽略ROM指令
  120.         DS18B20_WriteByte(0xbe);                        // 读取温度指令

  121.         for(j=0;j<16;j++)                                                        // 读取温度数量
  122.         {                                                
  123.                 DQ=0;
  124.                 _nop_();
  125.                 _nop_();
  126.                 DQ=1;        
  127.                 Delay15us();
  128.                 b=DQ;
  129.                 Delay15us();
  130.                 Delay15us();
  131.                 Delay15us();
  132.                 b=b<<j;
  133.                 temp=temp|b;
  134.         }
  135.         
  136.         temp=temp*0.0625*10;                                        // 合成温度值并放大10倍                                       
  137.         
  138.         return (temp);                                                                // 返回检测到的温度值
  139. }


  140. /*********************************************************/
  141. // 定时器初始化
  142. /*********************************************************/
  143. void TimerInit()
  144. {
  145.         TMOD = 0x01;                                        // 使用定时器0,工作方式1         
  146.         TH0  = 248;                                                // 给定时器0的TH0装初值
  147.         TL0  = 48;                                                // 给定时器0的TL0装初值
  148.         ET0  = 1;                                                        // 定时器0中断使能
  149.         EA   = 1;                                                        // 打开总中断
  150.         TR0         = 1;                                                        // 启动定时器0
  151. }


  152. /*********************************************************/
  153. // 显示温度值
  154. /*********************************************************/
  155. void ShowTemp(int dat)
  156. {
  157.         if(dat<0)                                                                                                // 负号
  158.         {
  159.                 Buff[0]=Array1[10];
  160.                 dat=0-dat;
  161.         }
  162.         else                                                                                                                // 百位
  163.         {
  164.                 Buff[0]=Array1[dat/1000];
  165.         }
  166.         
  167.         Buff[1]=Array1[dat%1000/100];                // 十位
  168.         Buff[2]=Array2[dat%100/10];                        // 个位
  169.         Buff[3]=Array1[dat%10];                                        // 小数后一位
  170. }


  171. /*********************************************************/
  172. // 报警判断
  173. /*********************************************************/
  174. void AlarmJudge(int dat)
  175. {
  176.         if(dat<AlarmLow)                                // 判断温度是否过低
  177.         {
  178.                 LedLow=0;                                                        // 温度低指示灯亮
  179.                 LedHig=1;                                                        // 温度高指示灯灭
  180.                 JdqLow=0;                                                        // 温度过低的继电器闭合(开始加热)
  181.                 JdqHig=1;                                                        // 温度过高的继电器断开(停止降温)
  182.                 Buzzer=0;                                                        // 蜂鸣器报警
  183.         }
  184.         else if(dat>AlarmHig)                // 判断温度是否过高
  185.         {
  186.                 LedLow=1;                                                        // 温度低指示灯灭
  187.                 LedHig=0;                                                        // 温度高指示灯亮
  188.                 JdqLow=1;                                                        // 温度过低的继电器断开(停止加热)
  189.                 JdqHig=0;                                                        // 温度过高的继电器闭合(开始降温)
  190.                 Buzzer=0;                                                        // 蜂鸣器报警
  191.         }
  192.         else                                                                                // 温度正常
  193.         {
  194.                 LedLow=1;                                                        // 温度低指示灯灭
  195.                 LedHig=1;                                                        // 温度高指示灯灭
  196.                 JdqLow=1;                                                        // 温度过低的继电器断开(停止加热)
  197.                 JdqHig=1;                                                        // 温度过高的继电器断开(停止降温)
  198.                 Buzzer=1;                                                        // 蜂鸣器停止报警
  199.         }
  200. }


  201. /*********************************************************/
  202. // 按键扫描
  203. /*********************************************************/
  204. void KeyScanf()
  205. {
  206.         if(KeySet==0)                                                                        // 如果设置按键被按下
  207.         {
  208.                 /* 设置温度下限 */
  209.                 LedLow=0;                                                                                // 点亮绿色灯(代表当前正在设置温度下限)
  210.                 LedHig=1;                                                                                // 熄灭红色灯
  211.                 Buzzer=1;                                                                                // 关闭蜂鸣器
  212.                 ShowTemp(AlarmLow);                                        // 显示温度下限值
  213.                 DelayMs(10);                                                                // 延时去抖
  214.                 while(!KeySet);                                                        // 等待按键释放
  215.                 DelayMs(10);                                                                // 延时去抖
  216.                
  217.                 while(1)
  218.                 {
  219.                         if(KeyDown==0)                                                                // 如果“减”按键被按下
  220.                         {
  221.                                 if(AlarmLow>-550)                                                // 判断当前温度下限是否大于-55度
  222.                                 {
  223.                                         AlarmLow--;                                                                // 温度下限值减去0.1度
  224.                                         ShowTemp(AlarmLow);                                // 刷新显示改变后的温度下限值
  225.                                         DelayMs(200);                                                        // 延时
  226.                                 }
  227.                         }
  228.                         
  229.                         if(KeyUp==0)                                                                        // 如果“加”按键被按下                                       
  230.                         {
  231.                                 if(AlarmLow<1250)                                                // 判断当前温度下限是否小于125度
  232.                                 {
  233.                                         AlarmLow++;                                                                // 温度下限值加上0.1度
  234.                                         ShowTemp(AlarmLow);                                // 刷新显示改变后的温度下限值
  235.                                         DelayMs(200);                                                        // 延时
  236.                                 }
  237.                         }
  238.                         
  239.                         if(KeySet==0)                                                                        // 如果“设置”按键被按下
  240.                         {
  241.                                 break;                                                                                        // 退出温度下限值的设置,准备进入上限值的设置
  242.                         }
  243.                 }
  244.                
  245.                 /* 设置温度上限 */
  246.                 LedLow=1;                                                                                // 熄灭绿色灯
  247.                 LedHig=0;                                                                                // 点亮红色灯(代表当前正在设置温度上限)
  248.                 ShowTemp(AlarmHig);                                        // 显示温度上限值
  249.                 DelayMs(10);                                                                // 延时去抖
  250.                 while(!KeySet);                                                        // 等待按键释放
  251.                 DelayMs(10);                                                                // 延时去抖
  252.                
  253.                 while(1)
  254.                 {
  255.                         if(KeyDown==0)                                                        // 如果“减”按键被按下                                                        
  256.                         {
  257.                                 if(AlarmHig>-550)                                        // 判断当前温度上限是否大于-55度
  258.                                 {
  259.                                         AlarmHig--;                                                        // 温度上限值减去0.1度
  260.                                         ShowTemp(AlarmHig);                        // 刷新显示改变后的温度上限值
  261.                                         DelayMs(200);                                                // 延时
  262.                                 }
  263.                         }
  264.                         
  265.                         if(KeyUp==0)                                                                // 如果“加”按键被按下                                       
  266.                         {
  267.                                 if(AlarmHig<1250)                                        // 判断当前温度上限是否小于125度
  268.                                 {
  269.                                         AlarmHig++;                                                        // 温度上限值加上0.1度
  270.                                         ShowTemp(AlarmHig);                        // 刷新显示改变后的温度上限值
  271.                                         DelayMs(200);
  272.                                 }
  273.                         }
  274.                         
  275.                         if(KeySet==0)                                                                // 如果“设置”按键被按下
  276.                         {
  277.                                 break;                                                                                // 准备退出设置模式
  278.                         }
  279.                 }
  280.                
  281.                 /* 退出设置模式 */
  282.                 LedLow=1;                                                                        // 熄灭绿灯
  283.                 LedHig=1;                                                                        // 熄灭红灯
  284.                 DelayMs(10);                                                        // 延时去抖
  285.                 while(!KeySet);                                                // 等待按键释放
  286.                 DelayMs(10);                                                        // 延时去抖
  287.         }
  288. }


  289. /*********************************************************/
  290. // 主函数
  291. /*********************************************************/
  292. void main()
  293. {
  294.         int temp;
  295.         uchar i;
  296.         
  297.         TimerInit();                                                                                // 定时器0的初始化(数码管的动态扫描)
  298.         
  299.         Buff[0]=Array1[0];                                                        // 刚上电显示4个0
  300.         Buff[1]=Array1[0];
  301.         Buff[2]=Array1[0];
  302.         Buff[3]=Array1[0];
  303.         
  304.         for(i=0;i<8;i++)                                                                // 由于传感器刚上电读出的温度不稳定,因此先进行几次温度的读取并丢弃
  305.         {
  306.                 DS18B20_ReadTemp();
  307.                 DelayMs(120);
  308.         }
  309.         
  310.         while(1)
  311.         {
  312.                 EA=0;                                                                                                        // 屏蔽中断
  313.                 temp=DS18B20_ReadTemp();                        // 读取温度值
  314.                 EA=1;                                                                                                        // 恢复中断
  315.                
  316.                 ShowTemp(temp);                                                                // 显示温度值
  317.                
  318.                 AlarmJudge(temp);                                                        // 判断是否需要报警
  319.                
  320.                 for(i=0;i<100;i++)                                                // 延时并进行按键扫描
  321.                 {
  322.                         KeyScanf();                                       
  323.                         DelayMs(10);                                                               
  324.                 }
  325.         }
  326. }
  327. ……………………

  328. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
程序(Keil版).zip (47.54 KB, 下载次数: 117)

评分

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

查看全部评分

回复

使用道具 举报

ID:108622 发表于 2018-7-17 20:53 | 显示全部楼层
这个下载试试好用不,论坛下载过2个都点有问题不完美
回复

使用道具 举报

ID:108622 发表于 2018-7-19 15:46 | 显示全部楼层
这个没有记忆功能
回复

使用道具 举报

ID:393819 发表于 2018-9-5 16:08 来自手机 | 显示全部楼层
楼主有高清图吗,看清引脚就行
回复

使用道具 举报

ID:369315 发表于 2018-9-6 11:12 | 显示全部楼层
这个没有记忆功能
回复

使用道具 举报

ID:396811 发表于 2018-9-12 09:13 | 显示全部楼层
非常不错
回复

使用道具 举报

ID:462745 发表于 2019-1-7 17:29 | 显示全部楼层
不错哦
回复

使用道具 举报

ID:511662 发表于 2019-4-20 14:57 | 显示全部楼层
请问仿真还在吗,学习下,师兄
回复

使用道具 举报

ID:511662 发表于 2019-4-20 15:20 | 显示全部楼层
请问有仿真吗,参考学习下
回复

使用道具 举报

ID:753799 发表于 2020-5-18 10:23 | 显示全部楼层

有仿真么,可以参考一下么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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