欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2665|回復: 1
收起左側

測控儀器項目,單片機溫度測量控制系統(tǒng)程序仿真 可調上下限

[復制鏈接]
ID:875119 發(fā)表于 2021-7-8 15:47 | 顯示全部樓層 |閱讀模式
綜合運用測控儀器設計相關章節(jié)基礎知識,設計一套溫度測量控制裝置。

2.思路分析
設計單片機(AT89C52)最小系統(tǒng),并在此基礎上完成對溫度傳感器DS18B20的讀寫操作,實現(xiàn)溫度測量功能和實時顯示功能,并通過設計外部電路使系統(tǒng)具備溫度上下限設置、對超過(低于)設置溫度值的狀態(tài)進行報警和相應控制操作。
3.系統(tǒng)功能
  (1)采集溫度,并通過LED數(shù)碼管顯示當前溫度。LED數(shù)碼管顯示溫度格式為四位,精確度可達±0.1℃。例如:27℃顯示為27.0。
(2)通過按鍵可自由設定溫度的上下限,并能在LED數(shù)碼管顯示設定的溫度上下限值。
(3)通過控制三極管的導通與否來控制繼電器的通斷,繼而控制外部加熱(電烙鐵升溫)和制冷(電風扇降溫)裝置,使環(huán)境溫度保持在設定溫度范圍內。
(4)具有溫度報警裝置。當溫度高于上限值,紅燈亮起;或者低于下限值,黃燈亮起,并發(fā)出報警聲。

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. /***  小延時函數(shù)  ***/
  15. void delay(uint i)
  16. {
  17. while(i--);
  18. }
  19. /*** 延時函數(shù)  ***/
  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初始化函數(shù)  ***/
  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. /***  寫入一個字節(jié)  ***/
  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. /***  讀出一個字節(jié)函數(shù) ***/
  52. uchar read_ds18b20()
  53. {
  54. uchar j,val;
  55. for(j=0;j<8;j++)
  56. {
  57. DQ=0;
  58. val>>=1;          //讀數(shù)先讀最低位,故右移
  59. DQ=1;   
  60. if(DQ)            
  61. val|=0x80;     
  62. delay(4);      
  63. }
  64. return val;   
  65. }
  66. /***  讀溫度函數(shù)  ***/
  67. uint read_temperature()
  68. {
  69. uchar a,a0,flag;
  70. uint b;
  71. uint temp;
  72. init_ds18b20();                //開始轉化數(shù)據(jù)
  73. write_ds18b20(0xcc);
  74. write_ds18b20(0x44);
  75. delay(300);
  76. init_ds18b20();      //每操作一次都初始化并且至少有一條ROM指令
  77. write_ds18b20(0xcc);
  78. write_ds18b20(0xbe);          //讀數(shù)據(jù)允許
  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; // 負數(shù)取反再加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. /***  調節(jié)上下限時的顯示  ***/
  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. /***  主函數(shù)  ***/
  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, 下載次數(shù): 36)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1035250 發(fā)表于 2022-6-18 08:56 來自觸屏版 | 顯示全部樓層
為什么我做的仿真 超溫了也不報警是怎么回事呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表