找回密码
 立即注册

QQ登录

只需一步,快速开始

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

测控仪器项目,单片机温度测量控制系统程序仿真 可调上下限

[复制链接]
ID:875119 发表于 2021-7-8 15:47 | 显示全部楼层 |阅读模式
综合运用测控仪器设计相关章节基础知识,设计一套温度测量控制装置。

2.思路分析
设计单片机(AT89C52)最小系统,并在此基础上完成对温度传感器DS18B20的读写操作,实现温度测量功能和实时显示功能,并通过设计外部电路使系统具备温度上下限设置、对超过(低于)设置温度值的状态进行报警和相应控制操作。
3.系统功能
  (1)采集温度,并通过LED数码管显示当前温度。LED数码管显示温度格式为四位,精确度可达±0.1℃。例如:27℃显示为27.0。
(2)通过按键可自由设定温度的上下限,并能在LED数码管显示设定的温度上下限值。
(3)通过控制三极管的导通与否来控制继电器的通断,继而控制外部加热(电烙铁升温)和制冷(电风扇降温)装置,使环境温度保持在设定温度范围内。
(4)具有温度报警装置。当温度高于上限值,红灯亮起;或者低于下限值,黄灯亮起,并发出报警声。

4.protues原理图
protues原理图.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit DQ=P3^0;
  5. sbit en=P1^0;
  6. sbit add=P1^1;      //加1
  7. sbit jian=P1^2;      //减1
  8. sbit warm=P1^5;      //加热
  9. sbit cool=P1^7;      //制冷
  10. uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //共阳极
  11. uchar code smg_we[]={0x08,0x04,0x02,0x01};
  12. uchar uflag,max=35,min=20,k;
  13. uint value,b_value;
  14. /***  小延时函数  ***/
  15. void delay(uint i)
  16. {
  17. while(i--);
  18. }
  19. /*** 延时函数  ***/
  20. void delay_ms(uint z)
  21. {
  22. uint x,y;
  23. for(x=z;x>0;x--)
  24. for(y=110;y>0;y--);
  25. }
  26. /***  DS18B20初始化函数  ***/
  27. void init_ds18b20()
  28. {
  29. uchar presence;
  30. DQ=0;
  31. delay(60);
  32. DQ=1;
  33. delay(5);
  34. presence=DQ;
  35. delay(20);   
  36. }
  37. /***  写入一个字节  ***/
  38. void write_ds18b20(uchar value)
  39. {
  40. uchar i;
  41. for(i=0;i<8;i++)
  42. {
  43. DQ=0;
  44. DQ=value&0x01;
  45. delay(5);
  46. DQ=1;
  47. value>>=1;
  48. }
  49. delay(4);
  50. }
  51. /***  读出一个字节函数 ***/
  52. uchar read_ds18b20()
  53. {
  54. uchar j,val;
  55. for(j=0;j<8;j++)
  56. {
  57. DQ=0;
  58. val>>=1;          //读数先读最低位,故右移
  59. DQ=1;   
  60. if(DQ)            
  61. val|=0x80;     
  62. delay(4);      
  63. }
  64. return val;   
  65. }
  66. /***  读温度函数  ***/
  67. uint read_temperature()
  68. {
  69. uchar a,a0,flag;
  70. uint b;
  71. uint temp;
  72. init_ds18b20();                //开始转化数据
  73. write_ds18b20(0xcc);
  74. write_ds18b20(0x44);
  75. delay(300);
  76. init_ds18b20();      //每操作一次都初始化并且至少有一条ROM指令
  77. write_ds18b20(0xcc);
  78. write_ds18b20(0xbe);          //读数据允许
  79. a=read_ds18b20();          //低8位
  80. a0=read_ds18b20();            //高8位
  81. flag=a0&0xf8;
  82. b=a0*256+a;
  83. if(flag==0xf8)
  84. {
  85. uflag=0;      
  86. temp=(~b+1)*0.625; // 负数取反再加1
  87. }
  88. else
  89. {
  90. uflag=1;
  91. temp=b*0.625;
  92. }
  93. return temp;
  94. }
  95. /***    显示当前温度  ***/
  96. void display()
  97. {
  98. uchar i;
  99. value=read_temperature();
  100. b_value=value/10;            //实时温度
  101. if(uflag==1)
  102. {
  103. for(i=0;i<4;i++)
  104. {
  105. P2=smg_we[i];
  106. delay(10);
  107. switch(i)     
  108. {
  109. case 0:P0=smg_du[value/1000];break;
  110. case 1:P0=smg_du[value%1000/100];break;
  111. case 2:P0=smg_du[value%100/10]&0x7f;break;
  112. case 3:P0=smg_du[value%10];break;
  113. default: break;
  114. }
  115. delay(950);
  116. }   
  117. }
  118. else
  119. {
  120. for(i=0;i<4;i++)
  121. {
  122. P2=smg_we[i];
  123. delay(10);
  124. switch(i)
  125. {
  126. case 0:P0=smg_du[10];break;            //写“-”号
  127. case 1:P0=smg_du[value%1000/100];break;
  128. case 2:P0=smg_du[value%100/10]&0x7f;break;
  129. case 3:P0=smg_du[value%10];break;
  130. default: break;
  131. }
  132. delay(950);
  133. }
  134. }
  135. if(b_value>max)    cool=0;      //降温
  136. else cool=1;
  137. if(b_value<min)    warm=0;      //加热
  138. else warm=1;
  139. }
  140. /***  按键处理  ***/
  141. void keyscan()
  142. {
  143. en=1;
  144. if(en==0)
  145. {
  146. delay_ms(6);        //5~10ms
  147. if(en==0)
  148. {
  149. k++;
  150. if(k==3) k=0;
  151. while(!en);   
  152. }
  153. }
  154. }
  155. /***  调节上下限时的显示  ***/
  156. void con_display(uchar dat)
  157. {
  158. uchar i;
  159. for(i=2;i<4;i++)
  160. {
  161. P2=smg_we[i];
  162. delay(10);
  163. switch(i)     
  164. {
  165. case 2:P0=smg_du[dat/10];break;
  166. case 3:P0=smg_du[dat%10];break;
  167. default: break;
  168. }
  169. delay(950);
  170. }      
  171. }
  172. /***  加热与降温  ***/
  173. void control()
  174. {
  175. if(k==1)                           //控制MAX
  176. {
  177. con_display(max);
  178. add=1;                  //+1
  179. if(add==0)
  180. {
  181. delay_ms(6);    //5~10ms
  182. if(add==0)
  183. {
  184. max++;
  185. while(!add);
  186. }
  187. }
  188. jian=1;                  //-1
  189. if(jian==0)
  190. {
  191. delay_ms(6);    //5~10ms
  192. if(jian==0)
  193. {
  194. max--;
  195. while(!jian);
  196. }
  197. }
  198. }
  199. if(k==2)                               //控制MIN
  200. {
  201. con_display(min);
  202. add=1;                  //+1
  203. if(add==0)
  204. {
  205. delay_ms(6);          //5~10ms
  206. if(add==0)
  207. {
  208. min++;
  209. while(!add);
  210. }
  211. }
  212. jian=1;                  //-1
  213. if(jian==0)
  214. {
  215. delay_ms(6);    //5~10ms
  216. if(jian==0)
  217. {
  218. min--;
  219. while(!jian);
  220. }
  221. }
  222. }
  223. }
  224. /***  主函数  ***/
  225. void main()
  226. {
  227. while(1)
  228. {
  229. keyscan();
  230. if(k==0)
  231. display();            //显示当前温度
  232. else control();            //控制时显示               
  233. }
  234. }
复制代码

仿真程序51hei下载地址:
温度测量控制.zip (146.09 KB, 下载次数: 36)

评分

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

查看全部评分

回复

使用道具 举报

ID:1035250 发表于 2022-6-18 08:56 来自手机 | 显示全部楼层
为什么我做的仿真 超温了也不报警是怎么回事呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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