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

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

QQ登錄

只需一步,快速開始

搜索
查看: 9669|回復(fù): 17
收起左側(cè)

電阻爐溫度控制系統(tǒng)設(shè)計(jì) 詳細(xì)資料 含仿真 源碼 教程

  [復(fù)制鏈接]
ID:129350 發(fā)表于 2017-5-7 09:26 | 顯示全部樓層 |閱讀模式
內(nèi)含程序,原理圖和參考文件

溫度設(shè)定部分
設(shè)定部分主要是鍵盤輸入,此部分主要由三個(gè)按鍵組成,PLAS為加,SUBS為減,START為開始。當(dāng)系統(tǒng)啟動(dòng)時(shí),默認(rèn)設(shè)定溫度為30℃,當(dāng)按下PLAS時(shí)設(shè)置水溫增加,按下SUBS時(shí)設(shè)置水溫減小,當(dāng)按下START時(shí)為開始加熱。
此部分按鍵為常開按鈕,當(dāng)不觸發(fā)時(shí)為斷開狀態(tài),按鍵按下之后與地連接,故為低電平,單片機(jī)讀取按鍵數(shù)據(jù)為低電平時(shí)有效。
仿真說(shuō)明
由于單片機(jī)端口的驅(qū)動(dòng)能力有限,所以令其低電平觸發(fā)光電耦合器,故當(dāng)P1.5口輸出低電平時(shí)電熱絲加熱。
當(dāng)設(shè)定溫度與實(shí)際溫度之差大于10℃時(shí)屬于粗調(diào),即令電熱絲持續(xù)加熱,無(wú)PWM控制;當(dāng)設(shè)定溫度與實(shí)際溫度之差小于10℃時(shí)屬于微調(diào),即電熱絲加熱時(shí)受PWM控制。
仿真結(jié)果
對(duì)各溫度仿真結(jié)果如下:
(1)實(shí)際溫度19℃,設(shè)定溫度30℃
當(dāng)差值大于10℃時(shí),輸出為低電平,電熱絲持續(xù)加熱,如圖5.1所示:
0.png


(2)實(shí)際溫度21℃,設(shè)定溫度30℃當(dāng)差值小于10℃,控制算法開始起作用,由低電平部分控制加熱,如圖5.2所示:
0.png

(3)實(shí)際溫度24℃,設(shè)定溫度30℃當(dāng)差值逐漸縮小,低電平時(shí)間減少,電熱絲功率降低,如圖5.3所示:
0.png

(4)實(shí)際溫度28℃,設(shè)定溫度30℃當(dāng)差值逐漸縮小,低電平時(shí)間減少,電熱絲功率降低,如圖5.4所示: 0.png

(5)實(shí)際溫度32℃,設(shè)定溫度30℃當(dāng)設(shè)定溫度小于實(shí)際溫度時(shí),PWM輸出高電平,電熱絲不工作,如圖5.5所示:
0.png



1.1 結(jié)論(1)當(dāng)設(shè)定溫度與實(shí)際溫度之差小于10℃時(shí),P1.5輸出PWM方波控制電熱絲加熱功率,以達(dá)到精確調(diào)溫的目的。(2)當(dāng)差值大于10℃時(shí),電熱絲持續(xù)加熱,使其盡快進(jìn)入到PWM調(diào)節(jié)階段(3)當(dāng)設(shè)定溫度小于實(shí)際溫度,說(shuō)明溫度已超調(diào),故電熱絲不工作,使其降溫。

0.png 0.png

  1. //包含的頭文件
  2. #include<REG51.H>                                                                                                                                                  
  3. #include<math.h>
  4. #include<INTRINS.H>
  5. #include<string.h>
  6. //定義宏定義
  7. #define CIRCLE 100
  8. #define uchar unsigned char
  9. #define uint   unsigned int;

  10. struct PID {  
  11. unsigned int SetPoint; // 設(shè)定目標(biāo) Desired Value  
  12. unsigned int Proportion; // 比例常數(shù) Proportional Const  
  13. unsigned int Integral; // 積分常數(shù) Integral Const  
  14. unsigned int Derivative; // 微分常數(shù) Derivative Const  
  15. unsigned int LastError; // Error[-1]  
  16. unsigned int PrevError; // Error[-2]  
  17. unsigned int SumError; // Sums of Errors  
  18. };  
  19. struct PID spid; // PID Control Structure  
  20. unsigned int rout; // PID Response (Output)  
  21. unsigned int rin; // PID Feedback (Input)  
  22. typedef unsigned char BYTE;
  23. typedef unsigned int WORD;
  24. typedef bit BOOL ;

  25. sbit key1=P3^2;   //定義按鍵位置
  26. sbit key2=P3^3;
  27. sbit key3=P3^4;

  28. sbit rs = P1^0;
  29. sbit rw = P1^1;
  30. sbit ep = P1^2;
  31. sbit pwm=P1^5; //PWM輸出端設(shè)置為P1.5輸出
  32. sbit DQ=P1^3;//ds18b20 信號(hào)引腳即DQ
  33. sfr dataled=0x80;//顯示數(shù)據(jù)端口 即P2口為段選碼輸入口
  34. uchar temp;//溫度變量
  35. unsigned char set_temper=30;  
  36. unsigned char high_time;
  37. unsigned int s;   
  38. uchar flag_get,count,num,counter; //溫度讀取標(biāo)志位、中斷次數(shù)變量t0中斷次數(shù)以讀取溫度值, t1中斷次數(shù)以控制周期和PWM的占空比
  39. char const table[]={100,80,70,60,50,40,30,20,0};//高電平時(shí)間查表
  40. uchar
  41. code
  42. tab[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0x60,0x25,0x3C,0x23,0x34,
  43. 0x74,0xF7,0xFF};//,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共陽(yáng)led顯示段碼115段碼表
  44. uchar  shi,ge,danwei,dang,dang_dis;  // 定義溫度十位、個(gè)位、攝氏度單位、及檔位變量名稱,及顯示檔位的查表變量

  45. void delay1(uchar MS);// 延時(shí)函數(shù)
  46. unsigned char ReadTemperature(void);//讀溫度子函數(shù)
  47. void Init_DS18B20(void);// DS18B20初始化
  48. unsigned char ReadOneChar(void);//讀字節(jié)子函數(shù)
  49. void WriteOneChar(unsigned char dat);//寫字節(jié)子函數(shù)
  50. void delay(unsigned int i);//延時(shí)
  51. //void del(unsigned int);
  52. void drive_moto();//由P1低四位輸出控制信號(hào)
  53. void initial();
  54. unsigned int TempBuffer[5];
  55. BYTE code dis1[] = {"Temperature:"};
  56. BYTE code dis2[] = {"Set_Temper:"};
  57. BYTE code dis3[] = {"0123456789"};
  58. BYTE code dis4[] = 0xdf;
  59. BYTE code dis5[] = {"C"};
  60. //定義函數(shù)
  61. void delay2(BYTE ms)
  62. {  
  63. BYTE i;
  64. while(ms--)
  65. {
  66.   for(i = 0; i< 250; i++)
  67.   {
  68.    _nop_();
  69.    _nop_();
  70.    _nop_();
  71.    _nop_();
  72.   }
  73. }
  74. }
  75. // 測(cè)試LCD忙碌狀態(tài)  
  76. BOOL lcd_bz()
  77. {      
  78. BOOL result;
  79. rs = 0;
  80. rw = 1;
  81. ep = 1;
  82. _nop_();
  83. _nop_();
  84. _nop_();
  85. _nop_();
  86. result = (BOOL)(P0 & 0x80);
  87. ep = 0;
  88. return result;  
  89. }
  90. // 寫入指令數(shù)據(jù)到LCD  
  91. void lcd_wcmd(BYTE cmd)
  92. {      
  93. while(lcd_bz());
  94. rs = 0;
  95. rw = 0;
  96. ep = 0;
  97. _nop_();
  98. _nop_();  
  99. P0 = cmd;
  100. _nop_();
  101. _nop_();
  102. _nop_();
  103. _nop_();
  104. ep = 1;
  105. _nop_();
  106. _nop_();
  107. _nop_();
  108. _nop_();
  109. ep = 0;   
  110. }

  111. //設(shè)定顯示位置
  112. void lcd_pos(BYTE pos)
  113. {      
  114. lcd_wcmd(pos | 0x80);
  115. }
  116. //寫入字符顯示數(shù)據(jù)到LCD
  117. void lcd_wdat(BYTE dat)  
  118. {      
  119. while(lcd_bz());
  120. rs = 1;
  121. rw = 0;
  122. ep = 0;
  123. P0 = dat;
  124. _nop_();
  125. _nop_();
  126. _nop_();
  127. _nop_();
  128. ep = 1;
  129. _nop_();
  130. _nop_();
  131. _nop_();
  132. _nop_();
  133. ep = 0;  
  134. }

  135. //LCD初始化設(shè)定  
  136. void lcd_init()
  137. {      
  138. lcd_wcmd(0x38);   //
  139. delay2(1);
  140. lcd_wcmd(0x0c);   //
  141. delay2(1);
  142. lcd_wcmd(0x06);   //
  143. delay2(1);
  144. lcd_wcmd(0x01);   //清除LCD的顯示內(nèi)容
  145. delay2(1);
  146. }

  147. //初始化相應(yīng)的寄存器
  148. void initial()
  149. {
  150. EA=1;
  151. TMOD=0x11;//定時(shí)器設(shè)置皆工作在16定時(shí)計(jì)數(shù)器模式
  152. TH0=0xef;//T0賦初值
  153. TL0=0xf0;
  154. TH1=(65536-1000)/256;//T1賦初值
  155. TL1=(65536-1000)%256;
  156. ET1=1;
  157. ET0=1;
  158. TR0=1;
  159. TR1=1;
  160. P2=0xff;   
  161. count=0;
  162. counter=0;//pwm占空比控制變量
  163. //IP=0x08; //T1優(yōu)先級(jí)高于T0 ,后來(lái)證明此語(yǔ)句是多余的因?yàn)楫?dāng)加入此句后反/////而PWM調(diào)速和溫度檢測(cè)都變得有點(diǎn)不穩(wěn)定
  164. }
  165. //延時(shí)函數(shù)
  166. void delay(unsigned int i)
  167. {
  168. while(i--);  
  169. }

  170. //18b20初始化函數(shù)檢測(cè)總線上是否有從屬器件DS的存在若存在則通訊成功
  171. void Init_DS18B20(void)
  172. {
  173. unsigned char x=0;
  174. DQ = 1;    //DQ復(fù)位
  175. delay(8);  //稍做延時(shí)
  176. DQ = 0;    //單片機(jī)將DQ拉低
  177. delay(80); //延時(shí) 大于 480us
  178. DQ = 1;    //拉高總線
  179. delay(10);
  180. x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗因?yàn)镈Q復(fù)位成功的回答信號(hào)即存在信號(hào)是低電平
  181. delay(5);
  182. }

  183. //讀一個(gè)字節(jié)ROM
  184. unsigned char ReadOneChar(void)
  185. {
  186. unsigned char i=0;
  187. unsigned char dat = 0;
  188. for (i=8;i>0;i--)
  189. {
  190.   DQ = 0; // 給脈沖信號(hào)
  191.   dat>>=1;
  192.   DQ = 1; // 給脈沖信號(hào)
  193.   if(DQ)
  194.    dat|=0x80;//
  195.   delay(5);
  196. }
  197. return(dat);
  198. }

  199. //寫一個(gè)字節(jié)
  200. void WriteOneChar(unsigned char dat)
  201. {
  202. unsigned char i=0;
  203. for (i=8; i>0; i--)
  204. {
  205.   DQ = 0;
  206.   DQ = dat&0x01;
  207.   delay(5);
  208.   DQ = 1;
  209.   dat>>=1;
  210. }
  211. delay(5);
  212. }
  213. //讀取溫度
  214. unsigned char ReadTemperature(void)
  215. {
  216. unsigned char a=0;
  217. unsigned char b=0;
  218. unsigned char t=0;

  219. Init_DS18B20();// 復(fù)位
  220. WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
  221. WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  222. delay(100);
  223. Init_DS18B20();  //每次操作前都要進(jìn)行復(fù)位
  224. WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作  
  225. WriteOneChar(0xBE); //讀取溫度寄存器等共可讀9個(gè)寄存器 前兩個(gè)就是溫度
  226. a=ReadOneChar();
  227. b=ReadOneChar();
  228. s=(unsigned int)(a&0x0f);  
  229. b<<=4;//取高字節(jié)的第四位因?yàn)楦咚奈粸榉?hào)位1111為負(fù)0000為正
  230. b+=(a&0xf0)>>4;//忽略小數(shù)位取a的高四位與b的相加就是此時(shí)所測(cè)得到整數(shù)溫度值
  231. t=b;
  232. return(t);//返回溫度值給這個(gè)函數(shù)
  233. }

  234. //顯示函數(shù)
  235. void printf()
  236. {
  237. BYTE i;
  238. delay2(10);
  239. lcd_pos(0x00);    // 設(shè)置顯示位置為第一行的第5個(gè)字符
  240. i = 0;
  241. while(dis1[i] != '\0')
  242. {      
  243.   lcd_wdat(dis1[i]);
  244.   i++;
  245. }
  246. lcd_pos(0x40);   // 設(shè)置顯示位置為第二行第二個(gè)字符
  247. i = 0;
  248. while(dis2[i] != '\0')
  249. {
  250.   lcd_wdat(dis2[i]); // 顯示字符
  251.   i++;
  252. }
  253. TempBuffer[0]=temp/10;  //十位
  254. TempBuffer[1]=temp%10;  //個(gè)位
  255. lcd_pos(0x0c);  
  256. lcd_wdat(dis3[TempBuffer[0]]); //測(cè)試溫度十位
  257. lcd_pos(0x0d);  
  258. lcd_wdat(dis3[TempBuffer[1]]); //測(cè)試溫度個(gè)位
  259. lcd_pos(0x0e);
  260. lcd_wdat(dis4[0]);  
  261. lcd_pos(0x0f);
  262. lcd_wdat(dis5[0]);

  263. TempBuffer[2]=set_temper/10;  //十位
  264. TempBuffer[3]=set_temper%10;  //個(gè)位
  265. lcd_pos(0x4c);  
  266. lcd_wdat(dis3[TempBuffer[2]]); //設(shè)置溫度十位
  267. lcd_pos(0x4d);  
  268. lcd_wdat(dis3[TempBuffer[3]]); //設(shè)置溫度個(gè)位
  269. lcd_pos(0x4e);
  270. lcd_wdat(dis4[0]);  
  271. lcd_pos(0x4f);
  272. lcd_wdat(dis5[0]);
  273. }

  274. //鍵盤輸入函數(shù)
  275. void keyscan()
  276. {
  277.          if(key1==0)
  278.          {
  279.           delay(200);
  280.           if(key1==0)
  281.           {
  282.            set_temper++;
  283.           }
  284.          }
  285.           
  286.          if(key2==0)
  287.          {
  288.           delay(200);
  289.           if(key2==0)
  290.           {
  291.            set_temper--;
  292.           }
  293.          }


  294. //         //開始按鍵
  295. // if(key3==0)
  296. // {
  297. //          delay(300);
  298. //         if(key3==0)
  299. //         {
  300. //                        TR1=1;       
  301. //         }
  302. // }

  303. }

  304. //T1定時(shí)中斷服務(wù)程序  
  305. void into(void) interrupt 3  
  306. {   
  307.    
  308.     TH1=(65536-1000)/256;//初值重裝
  309.     TL1=(65536-1000)%256;
  310. counter++;
  311.   if(counter>CIRCLE)  
  312. {
  313.   counter=0;////限定周期為T=100X0.01ms=10ms
  314. }  
  315. if(counter<=high_time)//取得查表參數(shù)以調(diào)節(jié)pwm的占空比
  316. pwm=1;//PWM高電平
  317. else   
  318. pwm=0;
  319. }


  320. //設(shè)定占空比函數(shù)
  321. void compare_temper()  
  322. {
  323. char shi=0,ge=0;
  324. if(set_temper>temp)  
  325. {  
  326. //當(dāng)設(shè)置溫度與實(shí)際溫度大于10度時(shí)
  327.           if(set_temper-temp>=10)
  328.           {
  329.           //進(jìn)入死循環(huán)
  330.                           while(1)
  331.                           {
  332.                            TR1=0;      //關(guān)閉定時(shí)器   從而關(guān)閉PWM波
  333.                            pwm=0;           //輸出低電平
  334.                            temp=ReadTemperature();        //讀取溫度傳感器的值
  335.                            shi=temp/10;                 //分離出十位
  336.                            ge=temp%10;                 //分離出個(gè)位
  337.                            lcd_pos(0x0c);         //設(shè)置顯示位置
  338.                            lcd_wdat(0x30+shi);          //在指定位置顯示十位
  339.                            lcd_pos(0x0d);                 //設(shè)置顯示位置
  340.                            lcd_wdat(0x30+ge);            //在指定位置顯示各位

  341.                            if(set_temper-temp<10)         //如果溫度差值低于10度
  342.                                            {
  343.                                         TR1=1; //打開定時(shí)器  開pwm波
  344.                                            break;         //跳出循環(huán)
  345.                                         }
  346.                            }   
  347.                   }  
  348.                   else
  349.                   {
  350.                   //打開定時(shí)器
  351.                   TR1=1;
  352.                   //根據(jù)差值調(diào)整PWM波
  353.                    if (set_temper-temp==9)  
  354.                     high_time=10;
  355.                    if (set_temper-temp==8)  
  356.                     high_time=20;
  357.                    if (set_temper-temp==7)  
  358.                     high_time=30;
  359.                    if (set_temper-temp==6)  
  360.                     high_time=40;
  361.                    if (set_temper-temp==5)  
  362.                     high_time=50;
  363.                    if (set_temper-temp==4)  
  364.                     high_time=60;
  365.                    if (set_temper-temp==3)  
  366.                     high_time=70;
  367.                    if (set_temper-temp==2)  
  368.                     high_time=80;
  369.                    if (set_temper-temp==1)  
  370.                     high_time=90;
  371.                   }  
  372.         }  
  373. else if(set_temper<temp)
  374. {
  375. //關(guān)閉定時(shí)器
  376.    pwm=1;
  377.    TR1=0;  
  378. }   
  379. }
  380. main()
  381. {
  382. initial();// 初始化個(gè)變量及定時(shí)器的初值開中斷等
  383. lcd_init();    // 初始化LCD  
  384. while(1)
  385. {
  386. //比較函數(shù)
  387.   compare_temper();
  388. //輸出函數(shù)  
  389.   printf();
  390.   //讀取溫度函數(shù)
  391.   

  392. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………

復(fù)制代碼


0.png

下載:
電阻爐溫度控制系統(tǒng).zip (421.63 KB, 下載次數(shù): 372)


評(píng)分

參與人數(shù) 2黑幣 +10 收起 理由
侯侯 + 5 很給力!
pkh666 + 5 絕世好帖!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:89286 發(fā)表于 2017-5-28 07:08 | 顯示全部樓層
thanks for sharing

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
pkh666 + 5 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:207506 發(fā)表于 2017-6-4 14:19 | 顯示全部樓層
終于找到我需要的了
回復(fù)

使用道具 舉報(bào)

ID:207506 發(fā)表于 2017-6-4 14:46 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報(bào)

ID:207146 發(fā)表于 2017-6-12 21:43 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:201547 發(fā)表于 2017-6-23 21:45 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:263675 發(fā)表于 2017-12-28 14:29 | 顯示全部樓層
版主附件里代碼也不全啊  
回復(fù)

使用道具 舉報(bào)

ID:314339 發(fā)表于 2018-4-23 20:24 來(lái)自觸屏版 | 顯示全部樓層
謝謝樓主,但愿能用
回復(fù)

使用道具 舉報(bào)

ID:338102 發(fā)表于 2018-6-1 16:20 來(lái)自觸屏版 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:338102 發(fā)表于 2018-6-1 16:21 來(lái)自觸屏版 | 顯示全部樓層
請(qǐng)問(wèn)溫度控制部分在畫電氣原理圖是電阻絲加熱的部分可以加在哪個(gè)地方?直接把正玄波信號(hào)源換成電阻絲可以嗎?
回復(fù)

使用道具 舉報(bào)

ID:323102 發(fā)表于 2018-6-7 01:17 | 顯示全部樓層
為什么仿真沒(méi)問(wèn)題做電路程序就沒(méi)效果死機(jī)怎么辦?能不能靠譜點(diǎn)
回復(fù)

使用道具 舉報(bào)

ID:543692 發(fā)表于 2019-5-22 18:40 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:432653 發(fā)表于 2020-5-22 20:31 | 顯示全部樓層
99度可以做燒開水用
回復(fù)

使用道具 舉報(bào)

ID:89217 發(fā)表于 2020-5-25 08:27 | 顯示全部樓層
挺不錯(cuò)的文案,雙擊666
回復(fù)

使用道具 舉報(bào)

ID:903744 發(fā)表于 2021-4-16 08:49 來(lái)自觸屏版 | 顯示全部樓層
有人可以和我講一下溫度控制那部分工作原理嗎
回復(fù)

使用道具 舉報(bào)

ID:917567 發(fā)表于 2021-6-15 10:46 | 顯示全部樓層
請(qǐng)問(wèn)我的液晶屏為啥不顯示呢
回復(fù)

使用道具 舉報(bào)

ID:917567 發(fā)表于 2021-6-15 10:49 | 顯示全部樓層
請(qǐng)問(wèn)大家液晶屏都顯示么
回復(fù)

使用道具 舉報(bào)

ID:1037640 發(fā)表于 2022-7-1 10:01 | 顯示全部樓層
為什么仿真運(yùn)行的時(shí)候有l(wèi)ogic contentions detected on net #00006呢?求解
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 他揉捏她两乳不停呻吟动态图 | 日韩在线视频网站 | 日韩av资源 | 黄色片一区二区 | 日韩精品欧美 | www.日韩 | 免费av播放 | 91免费国产| 欧美在线视频一区二区 | 狠狠插狠狠操 | 亚洲一区二区三区中文字幕 | 精品影院 | 成人午夜在线视频 | 国产成人亚洲精品自产在线 | 成人激情视频网 | 成人免费在线视频观看 | 国产三级一区 | 色婷婷18| 久久久97| 免费毛片在线 | 黄色一级片视频 | 色伊人网 | 午夜在线免费视频 | 国产免费一级片 | 天天综合色 | 国产在线第一页 | 伊人精品在线 | 播播激情网| 午夜久久久久久 | 少妇福利视频 | 五月婷婷六月激情 | 一级特黄妇女高潮 | 国产一区在线观看视频 | 欧美成人xxx | 91看片在线观看 | www.午夜| 欧美黄色录像 | 国产黄色免费观看 | 亚洲特级片 | 国内自拍一区 | 狠狠干2018 |