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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機智能水溫控制系統程序

[復制鏈接]
ID:527973 發表于 2019-12-15 18:57 | 顯示全部樓層 |閱讀模式
智能水溫控制系統的相關文件

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. /*LCD1602顯示模塊*/
  6. #define LCD1602_DATAPINS P0
  7. sbit LCD1602_RS=P2^6;
  8. sbit LCD1602_RW=P2^5;                                                                           
  9. sbit LCD1602_E=P2^7;
  10. /*按鍵調節模塊*/
  11. sbit k1=P1^1;//功能鍵
  12. sbit k2=P1^2;//加
  13. sbit k3=P1^3;//減
  14. void keyscan();
  15. void key1_switch();
  16. void key2_add();
  17. void key3_minus();
  18. uchar k_num;
  19. void LCD1602_SetTemp(uchar add,uchar dat);
  20. uchar high=90,low=10,set_t=30,set_d=2;//這里的數據類型可能有問題!!
  21. /*其他模塊接口*/
  22. sbit DSPORT=P3^7; //溫度傳感器單總線端
  23. sbit RELAY=P1^4;//繼電器
  24. sbit COOLER=P1^7;//降溫裝置
  25. /*LCD1602相關函數*/
  26. void Delay1us(uint a);
  27. void LCD1602_WriteCom(uchar com);//LCD1602寫入8位命令子函數      
  28. void LCD1602_WriteData(uchar dat);               
  29. void LCD1602_Init();//LCD1602初始化子程序                                                  
  30. void LCD1602_ShowTemp(int temp);
  31. /*DS18B20溫度傳感器相關函數*/
  32. void  Delay15us(uchar aa);
  33. uchar Ds18b20Init();
  34. void  Ds18b20WriteByte(uchar dat);
  35. uchar Ds18b20ReadByte();
  36. void  Ds18b20SwitchTemp();
  37. int   Ds18b20ReadTemp();
  38. float temp_max=125.00,temp_min=-55.00;
  39. uchar ii=0,jj=0,kk=0;
  40. uchar words_h[2]={"H="};
  41. uchar words_l[2]={"L="};
  42. uchar words_s[4]={"Set="};
  43. void Sound();
  44. void Temp_control(int temp);uchar count=0;//用來解決主程序執行太快,按鍵光標來不及顯示的問題
  45. void Temp_control(int temp)
  46. {               
  47. unsigned int kk=400;      
  48. uchar set_h,set_l;      
  49. set_h=set_t+set_d;      
  50. set_l=set_t-set_d;                       
  51. if (temp<=set_h&&temp>=set_l) //設定溫度范圍之內               
  52. {                        
  53. RELAY = 0; //繼電器斷開                       
  54. COOLER=0;//風扇關閉               
  55. }               
  56. else               
  57. {                              
  58. TR0=0;                                                      
  59. RELAY = 1; //繼電器打開,外電路(常開觸電)閉合加熱                       
  60. if (temp>=set_h)//溫度過高                       
  61. {                              
  62. RELAY = 0; //繼電器斷開                              
  63. COOLER=1;//打開                       
  64. }                       
  65. TR0=1;                }}
  66. /*其他模塊相關函數*/
  67. void Delay1us(uint a)
  68. {      
  69. uint b,c;
  70.         for(c=a;c>0;c--)               
  71. for(b=110;b>0;b--);
  72. }
  73. void LCD1602_WriteCom(uchar com)          //寫入命令
  74. {      
  75. LCD1602_E=0;      
  76. LCD1602_RS=0;//0就寫指令
  77.         LCD1602_RW=0; //0就是寫
  78.         LCD1602_DATAPINS=com;      
  79. Delay1us(10);      
  80. LCD1602_E=1;      
  81. Delay1us(10);      
  82. LCD1602_E=0;}                  
  83. void LCD1602_WriteData(uchar dat)                        //寫入數據
  84. {      
  85. LCD1602_E=0;      
  86. LCD1602_RS=1;      
  87. LCD1602_RW=0;      
  88. LCD1602_DATAPINS=dat;      
  89. Delay1us(10);      
  90. LCD1602_E=1;      
  91. Delay1us(10);      
  92. LCD1602_E=0;
  93. }
  94. void LCD1602_Init()                         //LCD初始化子程序
  95. {
  96. //        uint num;        
  97. LCD1602_WriteCom(0x38);  //開顯示
  98.         LCD1602_WriteCom(0x0f);  //開顯示不顯示光標      
  99. LCD1602_WriteCom(0x06);  //寫一個指針加1
  100.         LCD1602_WriteCom(0x01);  //清屏      
  101. LCD1602_WriteCom(0x80);  //設置數據指針起點        
  102. LCD1602_WriteCom(0x80+0x0B);      
  103. for (ii=0;ii<2;ii++)      
  104. {                              
  105. LCD1602_WriteData(words_h[ii]);
  106.         }      
  107. LCD1602_SetTemp(13,high);
  108.         LCD1602_WriteCom(0x80+0x40);      
  109. for (kk=0;kk<4;kk++)      
  110. {                              
  111. LCD1602_WriteData(words_s[kk]);      
  112. }      
  113. LCD1602_SetTemp(4+0x40,set_t);      
  114. LCD1602_WriteCom(0x80+0x47);        
  115. LCD1602_WriteData(0x23);  //顯示正負號        
  116. LCD1602_WriteCom(0x80+0x48);      
  117. LCD1602_WriteData(0x30+set_d);                              
  118. LCD1602_WriteCom(0x80+0x4B);      
  119. for (jj=0;jj<2;jj++)
  120.         {               
  121. LCD1602_WriteData(words_l[jj]);      
  122. }      
  123. LCD1602_SetTemp(13+0x40,low);               
  124. TMOD=0X01;      
  125. TH0=(65536-50000)/256;      
  126. TL0=(65536-50000)%256;      
  127. EA=1;//總中斷      
  128. ET0=1;        TR0=1;
  129. }
  130. void  Delay15us(uchar aa)
  131. {      
  132. do{        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();        aa--;      
  133. }
  134. while(aa);      
  135. }
  136. /*DS18B20溫度傳感器相關函數*/
  137. uchar Ds18b20Init()
  138. {      
  139. uchar flag;      
  140. DSPORT=0;          //總線拉低
  141.         Delay15us(40);//延時480~960us      
  142. DSPORT=1;      
  143. Delay15us(2);      
  144. flag=DSPORT;      
  145. Delay15us(6);//Ds18b20發出應答信號,延時60~240us      
  146. Delay15us(25);      
  147. return         flag;
  148. }   
  149. uchar Ds18b20ReadByte()
  150. {      
  151. uchar byte,bi;        
  152. uint i;      
  153. for (i=0;i<8;i++)      
  154. {               
  155. DSPORT=0;               
  156. _nop_();_nop_();_nop_();_nop_(); //保持低電平至少1us,但不能低于15us               
  157. DSPORT=1;               
  158. bi=        DSPORT;//讀取一位數據,循環8次為一個字節               
  159. byte = (byte >> 1) | (bi << 7);//將byte左移一位,然后與上右移7位后的bi,8次合成一個字節                Delay15us(4);        
  160. }      
  161. return         byte;
  162. }  
  163. void  Ds18b20WriteByte(uchar dat)
  164. {      
  165. uint i;      
  166. for (i=0;i<8;i++)      
  167. {               
  168. DSPORT=0;
  169. _nop_();               
  170. DSPORT=dat&0x01;//一位一位得讀,從最低位開始               
  171. Delay15us(5);               
  172. DSPORT=1;_nop_();               
  173. dat>>=1;         
  174. }}
  175. void  Ds18b20SwitchTemp()
  176. {               
  177. Ds18b20Init();               
  178. Delay15us(7);               
  179. Ds18b20WriteByte(0xcc);//跳過ROM指令               
  180. Ds18b20WriteByte(0x44);//啟動溫度轉換指令
  181. }
  182. int   Ds18b20ReadTemp()
  183. {      
  184. int temp=0;      
  185. uchar temp_h,temp_l;               
  186. Ds18b20SwitchTemp();      
  187. Ds18b20Init();        Delay1us(1);      
  188. Ds18b20WriteByte(0xcc);         //跳過ROM操作命令      
  189. Ds18b20WriteByte(0xbe);         //發送讀取溫度命令      
  190. temp_l = Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節
  191.         temp_h = Ds18b20ReadByte();                       
  192. temp= temp_h;      
  193. temp<<=8;      
  194. temp|= temp_l;      
  195. return temp;}  
  196. void LCD1602_ShowTemp(int temp)
  197. {      
  198. float tt;
  199.         uchar show[5]={0,0,0,0,0};      
  200. if (temp<0)//溫度為負
  201.         {               
  202. LCD1602_WriteCom(0x80);                //寫地址 80表示初始地址            
  203. LCD1602_WriteData('-');                  //顯示負               
  204. temp=temp-1;
  205. temp=~temp;tt=temp;      
  206. temp=tt*0.0625*100;                       
  207. }      
  208. else//溫度為正      
  209. {               
  210. LCD1602_WriteCom(0x80);                //寫地址 80表示初始地址         
  211. LCD1602_WriteData('+');                  //顯示正               
  212. tt=temp;                                       
  213. temp=tt*0.0625*100;                       
  214. }               
  215. show[0]=temp/10000;
  216.         show[1]=temp%10000/1000;      
  217. show[2]=temp%1000/100;      
  218. how[3]=temp%100/10;        show[4]=temp%10;        
  219. LCD1602_WriteCom(0x82);      
  220. LCD1602_WriteData('0'+show[0]); //百位  
  221.         LCD1602_WriteCom(0x83);
  222.         LCD1602_WriteData('0'+show[1]); //十位  
  223.         LCD1602_WriteCom(0x84);      
  224. LCD1602_WriteData('0'+show[2]); //個位  
  225.         LCD1602_WriteCom(0x85);      
  226. LCD1602_WriteData('.');        
  227. LCD1602_WriteCom(0x86);      
  228. LCD1602_WriteData('0'+show[3]); //十分位        
  229. LCD1602_WriteCom(0x87);      
  230. LCD1602_WriteData('0'+show[4]); //百分位        
  231. LCD1602_WriteCom(0x88);               
  232. LCD1602_WriteData(0xdf);        
  233. LCD1602_WriteCom(0x89);               
  234. LCD1602_WriteData('C');      
  235. LCD1602_WriteCom(0x0C);        
  236. temp=temp/100;      
  237. Temp_control(temp);      
  238. }
  239. void key1_switch()//功能切換
  240. {      
  241. uchar set_h,set_l;      
  242. set_h=set_t+set_d;
  243. set_l=set_t-set_d;      
  244. //k1鍵指令      
  245. if(k1==0)               
  246. {               
  247. Delay1us(10);//延時消抖                       
  248. if(k1==0)                       
  249. {                                       
  250. k_num++;                              
  251. while(!k1);        //按鍵沒有松開                                
  252. if(k_num==1)                              
  253. {                                       
  254. TR0=0; //關掉計時器,使得光標得以顯示                                       
  255. LCD1602_WriteCom(0x80+0x46);                                       
  256. LCD1602_WriteCom(0x0f);                                               
  257. Delay15us(6);                              
  258. }                              
  259. if(k_num==2)                              
  260. {                                       
  261. LCD1602_WriteCom(0x80+0x48);                                       
  262. LCD1602_WriteCom(0x0f);                                               
  263. Delay15us(6);                              
  264. }                              
  265. if(k_num==3)                              
  266. {                                       
  267. LCD1602_WriteCom(0x80+0x0F);                                       
  268. LCD1602_WriteCom(0x0f);                                               
  269. Delay15us(6);                              
  270. }                              
  271. if(k_num==4)                              
  272. {                                       
  273. LCD1602_WriteCom(0x80+0x4F);                                       
  274. LCD1602_WriteCom(0x0f);                                               
  275. Delay15us(6);                              
  276. }                              
  277. if(k_num==5)                              
  278. {                                       
  279. k_num=0;                                                                              
  280. LCD1602_WriteCom(0x0C);//光標不顯示                                                                              
  281. if (high<low)  //用來default                                       
  282. {                                               
  283. high=90;                                               
  284. low=40;//恢復默認值                                       
  285. }                                       
  286. if(set_h>high||set_l<low)                                       
  287. {                                                
  288. high=90;                                               
  289. low=10;//恢復默認值                                                         
  290. set_t=30;                                                
  291. set_d=2;//恢復默認值                                       
  292. }                                       
  293. TR0=1;//計時器重新打開,使得屏幕得以刷新                              
  294. }                       
  295. }        
  296. }}
  297. void key2_add()//功能加
  298. {               
  299. if(k_num!=0)               
  300. {                       
  301. if(k2==0)                       
  302. {                              
  303. Delay1us(5);                              
  304. if(k2==0)                              
  305. {                                       
  306. while(!k2);                                       
  307. if(k_num==1)                                       
  308. {                                               
  309. set_t++;                                               
  310. if (set_t>=high)                                                
  311. set_t=high;                                                
  312. LCD1602_SetTemp(4+0x40,set_t);                                                  LCD1602_WriteCom(0x80+0x46);                                                                                                                        }                                       
  313. if(k_num==2)                                       
  314. {                                               
  315. set_d++;                                               
  316. if (set_d>9)                                                
  317. set_d=0;                                               
  318. LCD1602_WriteCom(0x80+0x48);                                               
  319. LCD1602_WriteData(0x30+set_d);                                               
  320. LCD1602_WriteCom(0x80+0x48);                                                                                                                        }                                       
  321. if(k_num==3)                                       
  322. {                                               
  323. high++;                                               
  324. if (high>=temp_max)                                                
  325. high=0;                                                  
  326. LCD1602_SetTemp(13,high);                                                
  327. LCD1602_WriteCom(0x80+0x0F);//                                                  LCD1602_WriteCom(0x80+0x40+8);                                                                                                                        }                                       
  328. if(k_num==4)                                       
  329. {                                               
  330. low++;                                               
  331. if (low>=temp_max)                                               
  332. low=0;                                                
  333. LCD1602_SetTemp(13+0x40,low);                                                  LCD1602_WriteCom(0x80+0x4F);//                                                  LCD1602_WriteCom(0x80+0x40+13);                                                                                               
  334. }                              
  335. }                       
  336. }               
  337. }}
  338. void key3_minus()//功能減
  339. {               
  340. if(k_num!=0)               
  341. {                       
  342. if(k3==0)                       
  343. {                              
  344. Delay1us(5);                              
  345. if(k3==0)                              
  346. {                                       
  347. while(!k3);                                       
  348. if(k_num==1)                                       
  349. {                                               
  350. if (set_t<=0)                                               
  351. set_t=high+1;                                               
  352. set_t--;                                                  
  353. LCD1602_SetTemp(4+0x40,set_t);                                                  LCD1602_WriteCom(0x80+0x46);                                                                                                                        }                                       
  354. if(k_num==2)                                       
  355. {                                               
  356. if (set_d<=0)                                               
  357. set_d=10;                                               
  358. set_d--;                                                
  359. LCD1602_WriteCom(0x80+0x48);                                               
  360. LCD1602_WriteData(0x30+set_d);                                               
  361. LCD1602_WriteCom(0x80+0x48);                                                                                                                        }                                       
  362. if(k_num==3)                                       
  363. {                                               
  364. if (high<0)                                               
  365. high=temp_max;                                               
  366. high--;                                                  
  367. LCD1602_SetTemp(13,high);                                                
  368. LCD1602_WriteCom(0x80+0x0F);//                                                  LCD1602_WriteCom(0x80+0x40+8);                                                                                                                        }                                       
  369. if(k_num==4)                                       
  370. {                                               
  371. if (low<=0)                                               
  372. low=high;                                               
  373. low--;                                                  
  374. LCD1602_SetTemp(13+0x40,low);                                                  LCD1602_WriteCom(0x80+0x4F);//                                                  LCD1602_WriteCom(0x80+0x40+16);                                                                                                }                                }                       
  375. }               
  376. }
  377.         }
  378. void keyscan()//按鍵檢測
  379. {          key1_switch();         
  380. key2_add();         
  381. key3_minus();}
  382. void LCD1602_SetTemp(uchar add,uchar dat)//數碼管制定位置顯示
  383. {         
  384. uchar head,body,end;         
  385. head=dat/100;         
  386. body=dat%100/10;         
  387. end=dat%10;         
  388. LCD1602_WriteCom(0x80+add);         
  389. LCD1602_WriteData(0x30+head);         
  390. LCD1602_WriteData(0x30+body);         
  391. LCD1602_WriteData(0x30+end);}
  392. void main(
  393. ){        
  394. LCD1602_Init();      
  395. while(1)      
  396. {         
  397.         keyscan();                                          
  398. }
  399. }
  400. void timer0() interrupt 1
  401. {         
  402. TH0=(65536-50000)/256;      
  403. TL0=(65536-50000)%256;      
  404. count++;               
  405. if (count==10)//讓溫度每0.5s刷新一次               
  406. {                        count=0;                  
  407.         LCD1602_ShowTemp(Ds18b20ReadTemp());               
  408. }}
復制代碼

新建文件夾.zip

157.53 KB, 下載次數: 8, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:689290 發表于 2021-5-27 23:31 | 顯示全部樓層
這個有原理圖嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av黄色在线 | 欧美亚洲视频在线观看 | 久久久久久国产精品免费免费狐狸 | 欧美成人一区二区 | 欧美精品在线播放 | 日韩一区二区三区在线播放 | 一区二区久久 | 婷婷久久网 | 国产精品美女www爽爽爽视频 | 中文字幕免费在线 | 九九热免费视频在线观看 | 91高清免费 | 中文字幕亚洲精品 | 久久99精品久久 | 成人av免费在线观看 | 九九热精品视频 | 亚洲一区二区三区四区五区中文 | 中文字幕日韩一区二区 | 国产男人的天堂 | 97精品视频在线 | 精品欧美一区二区三区久久久 | 黄免费观看 | 久久一二三区 | 国产成人精品一区二区三区四区 | 亚洲热在线视频 | 91在线导航 | 午夜免费福利影院 | 欧美a在线| 九九久久精品视频 | 精品久久久久久久人人人人传媒 | 午夜小视频在线播放 | 国产日韩欧美一区二区 | 亚洲精品久久久久久久久久久久久 | 一区二区在线不卡 | 成人免费视频网站在线观看 | 色吧久久 | 日韩和的一区二在线 | 欧美日韩久久精品 | 精品一区二区三区在线观看 | 午夜精品在线 | 亚洲国产日本 |