久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2827|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)數(shù)字溫度控制器的設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:667803 發(fā)表于 2019-12-19 22:03 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
硬件 :DS18b20 at89c51 lcd1602
三個(gè)按鍵 key1,key2,key3 可分別實(shí)現(xiàn)加一,減一 ,溫度上/下限的選擇。
仿真圖

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code disp[]="0123456789";//定義字符數(shù)組顯示數(shù)字
  5. uchar code disp2[]="Temp:";//說明顯示的是溫度
  6. uchar code disp3[]={0xdf,'C'};//溫度單位
  7. uchar code disp4[]=" L:     H:     ";//溫度上下限顯示
  8. sbit lcden=P2^1;//液晶使能端
  9. sbit lcdrs=P2^0;//液晶命令/數(shù)據(jù)控制端
  10. sbit ds=P1^0;//DS18B20溫度采集信號(hào)端
  11. sbit led=P1^1;
  12. sbit led1=P2^3;
  13. sbit beep=P1^2;
  14. sbit key1=P3^2;//加1鍵
  15. sbit key2=P3^3;//減1鍵
  16. sbit key3=P3^4;//上/下限選擇鍵
  17. bit flag=0;
  18. uint temp; //定義無符號(hào)整型形參
  19. float f_temp;//定義浮點(diǎn)型形參
  20. uint TH=300;
  21. uint TL=200;

  22. void delay(uint z)//延時(shí)500ms程序
  23. { uint x,y;
  24.   for(x=z;x>0;x--)
  25.    for(y=125;y>0;y--);
  26. }

  27. void write_com(unsigned char com)
  28. {
  29. lcdrs=0;
  30. P0=com;
  31. delay(5);
  32. lcden=1;
  33. delay(5);
  34. lcden=0;
  35. delay(5);
  36. }

  37. void write_data(unsigned char data1)
  38. {
  39. lcdrs=1;
  40. P0=data1;
  41. delay(5);
  42. lcden=1;
  43. delay(5);
  44. lcden=0;
  45. delay(5);
  46. }
  47. void lcd_init( )
  48. {
  49. lcden=0;                   //使能端E清零
  50. write_com(0x38);  //顯示模式設(shè)置
  51. write_com(0x0c);  //開顯示,不顯示光標(biāo)
  52. write_com(0x06);  //當(dāng)寫一個(gè)字符后,地址指針自動(dòng)加1,且光標(biāo)加1,字符不動(dòng)
  53. write_com(0x01);  //清屏
  54. }

  55. void temp_dis(uint value)//溫度數(shù)據(jù)顯示
  56. {
  57. uchar ge,shi,bai;
  58. bai=value/100;//十位
  59. shi=value%100/10;//個(gè)位
  60. ge=value%100%10;//小數(shù)位
  61. //write_com(0x80+7);
  62. write_data(disp[bai]);
  63. write_data(disp[shi]);
  64. write_data('.');
  65. write_data(disp[ge]);
  66. }

  67. void ds_init()//DS18B20復(fù)位,初始化
  68. {
  69. uint i;
  70. ds=0;
  71. i=90;//延時(shí)
  72. while(i>0)i--;//主機(jī)發(fā)出一個(gè)480~960μs的低電平脈沖
  73. ds=1;
  74. i=4;//延時(shí)
  75. while(i>0)i--;//釋放總線后,以便從機(jī)18b20通過拉低總線來指示其是否在線,存在檢測(cè)高電平時(shí)間:15~60μs
  76. }

  77. bit ds_read_bit()  //讀一位DS18B20數(shù)據(jù)
  78. {
  79. uint i ;
  80. bit value_bit;
  81. ds=0;
  82. i++;//延時(shí),讀時(shí)隙起始于微處理器將總線拉低至少1μs
  83. ds=1;//拉低總線后接著釋放總線,讓從機(jī)18b20能夠接管總線,輸出有效數(shù)據(jù)
  84. i++;
  85. i++;//小延時(shí)一下,讀取18b20上的數(shù)據(jù),因?yàn)閺膁s18b20上輸出的數(shù)據(jù)在讀“時(shí)間隙”下降沿出現(xiàn)15μs內(nèi)有效
  86. value_bit=ds;
  87. i=8;//延時(shí)
  88. while(i>0)i--;//所有讀“時(shí)間隙”至少需要60μs
  89. return value_bit;
  90. }

  91. uchar ds_read_byte()//讀一個(gè)字節(jié)DS18B20數(shù)據(jù)
  92. {
  93. uchar i,j,value_byte;
  94. value_byte=0;
  95. for(i=1;i<=8;i++)
  96. {
  97.    j=ds_read_bit();
  98.    value_byte=(j<<7)|(value_byte>>1);//將讀取的數(shù)據(jù)位按讀取先后順序低位到高位(從右往左)排列保存到value_byte
  99. }
  100. return value_byte;
  101. }

  102. void ds_write_byte(uchar write_byte)//寫一個(gè)字節(jié)數(shù)據(jù)到DS18B20
  103. {
  104. uint i;
  105. uchar j;
  106. bit write_bit;
  107. for(j=1;j<=8;j++)
  108. {
  109. write_bit=write_byte&0x01;//每次只寫一位數(shù)據(jù)
  110. write_byte=write_byte>>1;
  111. if(write_bit)
  112. {
  113. ds=0;
  114. i++;//延時(shí),至少延時(shí)1μs,才產(chǎn)生寫“時(shí)間隙”
  115. ds=1;//寫時(shí)間隙開始后15μs內(nèi)允許數(shù)據(jù)線拉到高電平
  116. i=8;//延時(shí)
  117. while(i>0)i--;//所有寫時(shí)間隙必須最少持續(xù)60μs
  118. }
  119. else
  120. {
  121. ds=0;
  122. i=8;//延時(shí)
  123. while(i>0)i--;//主機(jī)要生成一個(gè)寫0時(shí)間隙,必須把數(shù)據(jù)線拉到低電平并保持至少60μs
  124. ds=1;//釋放總線
  125. i++;//延時(shí)
  126. i++;
  127. }
  128. }
  129. }
  130. void temp_convert()//DS18B20開始獲取溫度并進(jìn)行轉(zhuǎn)換,先初始化,然后跳過ROM(跳過64位ROM地址,直接向ds18B20發(fā)溫度轉(zhuǎn)換命令),發(fā)送溫度轉(zhuǎn)換命令
  131. {
  132. ds_init();
  133. delay(1);
  134. ds_write_byte(0xcc);//跳過序列號(hào)命令
  135. ds_write_byte(0x44);//發(fā)轉(zhuǎn)換命令44H
  136. }

  137. uint temp_get()//讀取DS18B20寄存器中的溫度數(shù)據(jù)
  138. {
  139. uchar temp_low,temp_high;
  140. ds_init();
  141. delay(1);
  142. ds_write_byte(0xcc);
  143. ds_write_byte(0xbe);
  144. temp_low=ds_read_byte();
  145. temp_high=ds_read_byte();
  146. temp=temp_high;
  147. temp<<=8;
  148. temp=temp|temp_low;
  149. f_temp=temp*0.0625;//精度為12位,所以分辨率為0.0625
  150. temp=f_temp*10+0.5;//乘以10,將實(shí)際溫度擴(kuò)大十倍,小數(shù)部分四舍五入
  151. return temp;//返回的temp是整型數(shù)據(jù)
  152. }

  153. void display()//靜態(tài)文字顯示
  154. {
  155. uchar i,j,k;
  156. write_com(0x80+2);
  157. for(i=0;i<5;i++)
  158. {
  159. write_data(disp2[i]);
  160. }
  161. write_com(0x80+0x0b);
  162. for(j=0;j<2;j++)
  163. {
  164. write_data(disp3[j]);
  165. }
  166. write_com(0x80+0x40);
  167. for(k=0;k<15;k++)
  168. {
  169. write_data(disp4[k]);
  170. }
  171. }

  172. void warn(uint warn)
  173. {
  174. if(warn<TL)
  175. {
  176. beep=1;//蜂鳴器響
  177. delay(1);//調(diào)用延時(shí)
  178. beep=0;//蜂鳴器不響
  179. delay(1);//調(diào)用延時(shí)
  180. led=~led;
  181. led1=0;
  182. }
  183. else if(warn>TH)
  184. {
  185. beep=1;        //蜂鳴器響
  186. delay(1);//調(diào)用延時(shí)
  187. beep=0;//蜂鳴器不響
  188. delay(1);//調(diào)用延時(shí)
  189. led=~led;
  190. led1=1;
  191. }
  192. }

  193. void timer0() interrupt 1
  194. {
  195. flag=~flag;
  196. }

  197. void int0() interrupt 0
  198. {
  199. if(flag==1)
  200. TH++;
  201. else
  202. TL++;
  203. }

  204. void int1() interrupt 2
  205. {
  206. if(flag==1)
  207. TH--;
  208. else
  209. TL--;
  210. }

  211. void main()//主函數(shù)
  212. {
  213. uchar i;
  214. uint wendu;
  215. TMOD=0x06;
  216. TH0=TL0=0xff;
  217. IE=0x87;
  218. IT0=1;
  219. IT1=1;
  220. TR0=1;
  221. lcd_init();
  222. display();
  223. while(1)
  224. {
  225. temp_convert();
  226. wendu=temp_get();
  227. write_com(0x80+7);
  228. temp_dis(temp_get());
  229. write_com(0x80+0x40+3);
  230. temp_dis(TL);
  231. write_com(0x80+0x40+10);
  232. temp_dis(TH);
  233. i=50;
  234. while(i-->0)
  235. warn(wendu);
  236. }
  237. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:803822 發(fā)表于 2020-7-16 18:32 | 只看該作者
您好 我們最近在做這個(gè)設(shè)計(jì),我想問一下您的電路圖上兩個(gè)指示燈分別是高溫指示燈和低溫指示燈嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:868515 發(fā)表于 2020-12-30 15:07 | 只看該作者
嘻嘻嘻! 發(fā)表于 2020-7-16 18:32
您好 我們最近在做這個(gè)設(shè)計(jì),我想問一下您的電路圖上兩個(gè)指示燈分別是高溫指示燈和低溫指示燈嗎

他這個(gè),按道理是的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区欧美 | 在线一区视频 | 中文字幕日韩欧美 | 欧美a区| 国产在线观看一区二区三区 | 国产欧美在线一区 | 亚洲一区二区三区在线视频 | 亚洲国产精品成人久久久 | 91精品国产综合久久婷婷香蕉 | 狠狠爱免费视频 | www.日日干| 国产乱码精品一区二区三区忘忧草 | 久久99精品久久久97夜夜嗨 | 久久久久久高潮国产精品视 | 日韩激情在线 | 丁香久久 | 一区二区三区视频播放 | 视频一区二区国产 | 96av麻豆蜜桃一区二区 | 欧美videosex性极品hd | 成人国产a| 亚洲免费在线观看av | 成人性视频免费网站 | 日本福利片 | 东京av男人的天堂 | 精品久久av | 精品国产成人 | 九九免费观看视频 | 日韩在线资源 | 在线观看av网站 | 国产精品免费观看视频 | 国产亚洲精品久久yy50 | 久久成人一区 | 国产精品久久久久久婷婷天堂 | 黄色大片免费观看 | 亚洲在线一区 | 成人特级毛片 | 成人午夜影院 | 一级美国黄色片 | 久草视频在 | www.日韩系列|