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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機的PID控制DS18B20水溫源代碼+電路原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:92643 發(fā)表于 2018-11-19 15:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機的DS18B20水溫PID控制調(diào)節(jié)系統(tǒng)設(shè)計C語言程序,通過51單片機控制可控硅驅(qū)動加過零檢測電路作為功率控制電路來控制加熱過程,通過鍵盤掃描來設(shè)定水溫,DS18B20實時測量水的溫度,將實際水溫與設(shè)定水溫比較,通過PID控制算法調(diào)節(jié),是實際水溫與設(shè)定水溫接近。從而達(dá)到控制水溫的目的。

電路原理圖如下:


單片機源程序如下:

  1. #include ‘reg52.h’
  2. #include ‘stdio.h’
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit s1=P2^0;
  6. sbit s2=P2^1;
  7. sbit s3=P2^2;
  8. sbit s4=P2^3;
  9. sbit s5=P2^4;
  10. sbit ds=P2^5;
  11. sbit beep=P2^6;
  12. sbit rd=P1^0;
  13. sbit rs=P1^1;
  14. sbit wr=P1^2;
  15. sbit lcden=P1^3;
  16. sbit PWM=P1^6;
  17. sbit led1=P1^4;
  18. sbit led2=P1^5;
  19. uchar set_temp,keytemp;
  20. uint temp;
  21. uchar c;
  22. bit flag,flag1,flag2;
  23. float f_temp,t;
  24. int timecount,z;
  25. float KP,KI,KD;
  26. float e1,e2,e3;
  27. float uk,duk;
  28. uchar HighL,HighH,PWMH;
  29. float k;
  30. uchar code table[]={"設(shè)定溫度:"};
  31. uchar code table1[]={"實測溫度:"};
  32. uchar code table2[]={"加熱"};
  33. uchar code table3[]={"保溫"};
  34. uchar code table4[]={"作者:0903鋒仔@"};
  35. uchar code table5[]={"系統(tǒng)初始化"};
  36. uchar code table6[]={"measured Temperature"};
  37. uchar code table7[]={"水溫控制系統(tǒng)設(shè)計"};
  38. uchar code table8[]={"    "};
  39. void delay(uint z)//延時函數(shù),延時5ms
  40. {
  41. uint x,y;
  42. for(x=z;x>0;x--)
  43. for(y=110;y>0;y--);
  44. }
  45. void keyscan()
  46. {
  47. if(set_temp>=100)//將設(shè)定溫度限定在0-100度之間
  48. set_temp=100;
  49. if(set_temp<=0)
  50. set_temp=0;
  51. if(s5==0)//此鍵按下設(shè)定溫度加5
  52. {
  53. delay(10);
  54. if(s5==0)
  55. {
  56. flag1=0;
  57. set_temp+=5;
  58. if(set_temp>=100)
  59. {
  60. set_temp=100;
  61. beep=0;
  62. delay(1000);
  63. beep=1;
  64. }
  65. }while(s5==0);
  66. }
  67. if(s4==0)//此鍵按下設(shè)定溫度減5
  68. {
  69. delay(10);
  70. if(s4==0)
  71. {
  72. flag1=0;
  73. set_temp-=5;
  74. if(set_temp<=0)
  75. {
  76. set_temp=0;
  77. beep=0;
  78. delay(1000);
  79. beep=1;
  80. }
  81. }while(s4==0);
  82. }
  83. if(s3==0)//此鍵按下設(shè)定溫度加1
  84. {
  85. delay(10);
  86. if(s3==0)
  87. {
  88. flag1=0;
  89. set_temp++;
  90. if(set_temp==100)
  91. {
  92. set_temp=100;
  93. beep=0;
  94. delay(1000);
  95. beep=1;
  96. }
  97. }while(s3==0);
  98. }
  99. if(s2==0)//此鍵按下設(shè)定溫度減1
  100. {
  101. delay(10);
  102. if(s2==0)
  103. {
  104. flag1=0;
  105. set_temp--;
  106. if(set_temp==0)
  107. {
  108. set_temp=0;
  109. beep=0;
  110. delay(1000);
  111. beep=1;
  112. }
  113. }while(s2==0);
  114. }
  115. if(s1==0)//確定加熱狀態(tài)(加熱與不加熱)
  116. {
  117. delay(10);
  118. if(s1==0)
  119. {
  120. flag1=1;
  121. }
  122. while(s1==0);
  123. }
  124. }
  125. void dsreset()//DS18B20復(fù)位函數(shù)
  126. {
  127. uint i;
  128. ds=0;
  129. i=103;
  130. while(i>0)i--;
  131. ds=1;
  132. i=4;
  133. while(i>0)i--;
  134. }
  135. bit tempreadbit()//從DS18B20 RAM讀一位數(shù)據(jù)
  136. {
  137. uint i;
  138. bit dat;
  139. ds=0;i++;
  140. ds=1;i++;i++;
  141. dat=ds;
  142. i=8;while(i>0)i--;
  143. return(dat);
  144. }
  145. uchar tempread()//從DS18B20 RAM讀一字節(jié)數(shù)據(jù)
  146. {
  147. uchar i,j,dat;
  148. dat=0;
  149. for(i=1;i<=8;i++)
  150. {
  151. j=tempreadbit();
  152. dat=(j<<7)|(dat>>1);
  153. }
  154. return(dat);
  155. }
  156. void tempwritebyte(uchar dat)//向DS18B20寫以字節(jié)的數(shù)據(jù)
  157. {
  158. uint i,j;
  159. bit testb;
  160. for(j=1;j<=8;j++)
  161. {
  162. testb=dat&0x01;
  163. dat=dat>>1;
  164. if(testb)//寫1
  165. {
  166. ds=0;
  167. i++;i++;
  168. ds=1;
  169. i=8;while(i>0)i--;
  170. }
  171. else//寫0
  172. {
  173. ds=0;
  174. i=8;while(i>0)i--;
  175. ds=1;
  176. i++;i++;
  177. }
  178. }
  179. }
  180. void tempchange()//啟動溫度轉(zhuǎn)換
  181. {
  182. dsreset();
  183. delay(1);
  184. tempwritebyte(0xcc);
  185. tempwritebyte(0x44);
  186. }
  187. float get_temp()//溫度值讀取與處理函數(shù)
  188. {
  189. uchar a,b;
  190. dsreset();
  191. delay(1);
  192. tempwritebyte(0xcc);
  193. tempwritebyte(0xbe);
  194. a=tempread();
  195. b=tempread();
  196. temp=b;
  197. temp<<=8;
  198. temp=temp|a;
  199. f_temp=(float)(temp*0.0625);
  200. f_temp=f_temp*10;
  201. return(f_temp);
  202. }
  203. void write_com(uchar com)//向12864寫指令
  204. {
  205. rs=0;
  206. wr=0;
  207. delay(1);
  208. P0=com;
  209. lcden=1;
  210. delay(1);
  211. lcden=0;
  212. delay(1);
  213. }
  214. void write_date(uchar date)//向12864寫數(shù)據(jù)
  215. {
  216. rs=1;
  217. wr=0;
  218. delay(1);
  219. P0=date;
  220. lcden=1;
  221. delay(1);
  222. lcden=0;
  223. delay(1);
  224. }
  225. void display(float m,uchar n)//顯示設(shè)定溫度、實測溫度、加熱狀態(tài)
  226. {
  227. uint i,j;
  228. float b;
  229. float p;
  230. uchar a1,a2,a3;
  231. uchar b1,b2,b3,b4;
  232. if(n<100)
  233. {
  234. a1=0;
  235. a2=n/10;
  236. a3=n;
  237. }
  238. else
  239. {
  240. a1=1;
  241. a2=0;
  242. a3=0;
  243. }
  244. p=m;
  245. j=(uint)(p*10);
  246. b1=(uchar)(j/1000);
  247. b2=(uchar)(j00/100);
  248. b3=(uchar)(j0/10);
  249. b4=(uchar)(j);
  250. write_com(0x90+5);//顯示設(shè)定溫度
  251. write_date(0x30+a1);
  252. write_date(0x30+a2);
  253. write_date(0x30+a3);
  254. write_com(0x88+5);//顯示實測溫度
  255. write_date(0x30+b1);
  256. write_date(0x30+b2);
  257. write_date(0x2e);
  258. write_date(0x30+b3);
  259. write_date(0x30+b4);
  260. b=((float)(b1*100+b2*10+b3))/10.0;
  261. i=0;
  262. if((b+0.2)
  263. {
  264. led1=0;
  265. write_com(0x98+1);
  266. while(table2[i]!='\0')
  267. {
  268. write_date(table2[i]);
  269. i++;
  270. }
  271. flag2=1;
  272. }
  273. else
  274. {
  275. led1=1;
  276. i=0;
  277. write_com(0x98+1);
  278. while(table8[i]!='\0')
  279. {
  280. write_date(table8[i]);
  281. i++;
  282. }
  283. i=0;
  284. if((b=n)||((b>n)&&((b-0.2)<=n))||((b=n)))
  285. {
  286. led2=0;
  287. write_com(0x98+4);
  288. while(table3[i]!='\0')
  289. {
  290. write_date(table3[i]);
  291. i++;
  292. }
  293. }
  294. }
  295. if(flag2==1)
  296. {
  297. flag2=0;
  298. led2=1;
  299. i=0;
  300. write_com(0x98+4);
  301. while(table8[i]!='\0')
  302. {
  303. write_date(table8[i]);
  304. i++;
  305. }
  306. }
  307. }
  308. void conversion()//定時器2初值處理函數(shù)
  309. {
  310. uint temp2;
  311. temp2=65536-PWMH*10;
  312. HighH=temp2/256;
  313. HighL=temp2%6;
  314. }
  315. void senddate(float y)
  316. {
  317. // uint i;
  318. if(flag==1)
  319. {
  320. ES=0;
  321. flag=0;
  322. c=0;
  323. TI=1;
  324. printf("The measured temp:%f",y);
  325. // SBUF=1;
  326. while(!TI);
  327. TI=0;
  328. ES=1;
  329. }
  330. }
  331. void init()//初始化函數(shù)
  332. {
  333. uint i,j;
  334. TMOD=0x21;
  335. TH1=0xfd;
  336. TL1=0xfd;
  337. TH0=(65536-50000)/256;
  338. TL0=(65536-50000)%6;
  339. PWMH=0;
  340. conversion();
  341. TH2=(65536-50000)/256;
  342. TL2=(65536-50000)%6;
  343. rd=1;
  344. lcden=0;
  345. write_com(0x30);
  346. write_com(0x0c);
  347. write_com(0x01);
  348. write_com(0x90);
  349. while(table5[i]!='\0')//系統(tǒng)初始化
  350. {
  351. write_date(table5[i]);
  352. i++;
  353. delay(20);
  354. }
  355. for(j=0;j<=1;j++)//6個點的三次循環(huán)
  356. {
  357. write_com(0x88+4);
  358. for(i=0;i<=5;i++)
  359. {
  360. write_date(0x2e);
  361. delay(200);
  362. }
  363. delay(100);
  364. write_com(0x88+4);
  365. for(i=0;i<=5;i++)
  366. {
  367. write_date(0x20);
  368. }
  369. delay(100);
  370. }
  371. i=0;
  372. write_com(0x80);//顯示 水溫控制系統(tǒng)設(shè)計標(biāo)題
  373. while(table7[i]!='\0')
  374. {
  375. write_date(table7[i]);
  376. i++;
  377. }
  378. i=0;
  379. write_com(0x90);//顯示 設(shè)定溫度
  380. while(table[i]!='\0')
  381. {
  382. write_date(table[i]);
  383. i++;
  384. }
  385. i=0;
  386. write_com(0x88);//顯示 實測溫度
  387. while(table1[i]!='\0')
  388. {
  389. write_date(table1[i]);
  390. i++;
  391. }
  392. // tempwritebyte(0x4e);//設(shè)定DS18B20的分辨率為11位
  393. // tempwritebyte(0x5f);
  394. PWM=0;
  395. e1=0;
  396. e2=0;
  397. e3=0;
  398. duk=0;
  399. uk=0;
  400. KP=20;//PID控制算法參數(shù)
  401. KI=0.061;
  402. KD=30;
  403. REN=1;//串口通信設(shè)置
  404. SM0=0;
  405. SM1=1;
  406. ET0=1;
  407. ET2=1;
  408. TR0=1;
  409. TR1=1;
  410. TR2=1;//啟動定時器2
  411. EA=1;
  412. ES=1;
  413. }
  414. void main()
  415. {
  416. init();
  417. while(1)
  418. {
  419. keyscan();//調(diào)用鍵盤掃描函數(shù)
  420. tempchange();//啟動溫度轉(zhuǎn)換
  421. t=get_temp();//提取實測溫度
  422. display(t,set_temp);//顯示設(shè)定溫度和實測溫度
  423. senddate(t);//向上位機發(fā)送數(shù)據(jù)函數(shù)
  424. if((flag1==1))
  425. {
  426.    if(timecount>=375)
  427. {
  428. timecount=0;
  429. e1=set_temp-t;
  430. duk=(KP*(e1-e2)+KI*e1+KD*(e1-2*e2+e3));//PID控制算法式
  431.    uk=uk+duk;
  432. if(e1>=75)
  433. {
  434. z=4;
  435. }
  436. else if(e1>=50)
  437. {
  438. z=3;
  439. }
  440. else if(e1>=10)
  441. {
  442. z=2;
  443. }
  444. else
  445. z=1;
  446. }
  447. if(uk>=2500)uk=2500;
  448.    if(uk<=0)uk=0;
  449. if(uk<=0)
  450. {
  451. ET0=0;
  452. ET2=0;
  453. PWM=0;
  454. }
  455. else
  456. {
  457. ET0=1;
  458. ET2=1;
  459. PWMH=(uchar)uk;
  460. k=(float)uk;
  461. }
  462. e3=e2;
  463.    e2=e1;
  464. conversion();//調(diào)用定時器2初值處理函數(shù)
  465. }
  466. else
  467. {
  468. ET0=0;
  469. ET2=0;
  470. PWM=0;
  471. }
  472. }
  473. }
  474. void timer0() interrupt 1//定時器1中斷
  475. {
  476. TH1=(65536-50000)/256;
  477. TL1=(65536-50000)%6;
  478. timecount++;
  479. TH2=HighH;
  480. TL2=HighL;
  481. PWM=1;
  482. }
  483. void ser() interrupt 4//串口中斷
  484. {
  485. RI=0;
  486. c=SBUF;
  487. flag=1;
  488. }
  489. void Timer2() interrupt 5//用定時器2控制PWM占空比
  490. {
  491. TF2=0;
  492. PWM=0;
  493. }
復(fù)制代碼

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:504053 發(fā)表于 2019-4-13 00:24 來自手機 | 只看該作者
程序和原理圖不符
回復(fù)

使用道具 舉報

板凳
ID:666029 發(fā)表于 2019-12-17 13:44 | 只看該作者

可能是元器件不對
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜精品福利 | 国产不卡在线播放 | 欧美黄色网络 | 亚洲黄色网址视频 | 亚洲成网站 | av网址在线 | 99精品欧美一区二区蜜桃免费 | 国产精品日本一区二区在线播放 | 国产精品免费在线 | 国产精品久久久久无码av | 日韩精品久久一区二区三区 | 久久久久国产精品一区 | 国产精品黄 | 激情三区| 欧美日日 | 少妇淫片aaaaa毛片叫床爽 | 在线只有精品 | 天天操狠狠操 | 香蕉一区| 久久欧美精品 | 欧美一区二区三区在线 | 日韩三区 | 亚洲成人日韩 | 色婷婷综合久久久中字幕精品久久 | 欧美黄色一区 | 国产精品亚洲二区 | 国产伦精品一区二区三区视频金莲 | 久久久123| 911网站大全在线观看 | 偷拍自拍第一页 | 国产成人高清在线观看 | 国产麻豆一区二区三区 | 国产色片在线 | 久久久久久黄 | 国产精品国产精品国产专区不片 | 91在线精品一区二区 | 日韩在线观看一区二区三区 | 日韩欧美亚洲一区 | 精品久久久久久久久久久 | 久久人人网| 日本小电影在线 |