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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8877|回復: 16
收起左側

爐溫控制系統+proteus仿真+程序

  [復制鏈接]
ID:139559 發表于 2016-11-30 11:15 | 顯示全部樓層 |閱讀模式
捕獲.PNG
捕獲.PNG
0.png

單片機源程序:
  1. #include<REG51.H>                                                                                                                                                  
  2. #include<math.h>
  3. #include<INTRINS.H>
  4. #include<string.h>  
  5. #define CIRCLE 100
  6. #define uchar unsigned char
  7. #define uint   unsigned int;
  8. struct PID {  
  9. unsigned int SetPoint; // 設定目標 Desired Value  
  10. unsigned int Proportion; // 比例常數 Proportional Const  
  11. unsigned int Integral; // 積分常數 Integral Const  
  12. unsigned int Derivative; // 微分常數 Derivative Const  
  13. unsigned int LastError; // Error[-1]  
  14. unsigned int PrevError; // Error[-2]  
  15. unsigned int SumError; // Sums of Errors  
  16. };  
  17. struct PID spid; // PID Control Structure  
  18. unsigned int rout; // PID Response (Output)  
  19. unsigned int rin; // PID Feedback (Input)  
  20. typedef unsigned char BYTE;
  21. typedef unsigned int WORD;
  22. typedef bit BOOL ;
  23. sbit key1=P3^2;   //定義按鍵位置
  24. sbit key2=P3^3;
  25. sbit rs = P1^0;
  26. sbit rw = P1^1;
  27. sbit ep = P1^2;
  28. sbit pwm=P1^5; //PWM輸出端設置為P1.5輸出
  29. sbit DQ=P1^3;//ds18b20 信號引腳即DQ
  30. sfr dataled=0x80;//顯示數據端口 即P2口為段選碼輸入口
  31. uchar temp;//溫度變量
  32. unsigned char set_temper=30;  
  33. unsigned char high_time;
  34. unsigned int s;   
  35. uchar flag_get,count,num,counter; //溫度讀取標志位、中斷次數變量t0中斷次數以讀取溫度值, t1中斷次數以控制周期和PWM的占空比
  36. char const table[]={100,80,70,60,50,40,30,20,0};//高電平時間查表
  37. uchar
  38. code
  39. tab[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0x60,0x25,0x3C,0x23,0x34,
  40. 0x74,0xF7,0xFF};//,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共陽led顯示段碼115段碼表
  41. uchar  shi,ge,danwei,dang,dang_dis;  // 定義溫度十位、個位、攝氏度單位、及檔位變量名稱,及顯示檔位的查表變量

  42. void delay1(uchar MS);// 延時函數
  43. unsigned char ReadTemperature(void);//讀溫度子函數
  44. void Init_DS18B20(void);// DS18B20初始化
  45. unsigned char ReadOneChar(void);//讀字節子函數
  46. void WriteOneChar(unsigned char dat);//寫字節子函數
  47. void delay(unsigned int i);//延時
  48. //void del(unsigned int);
  49. void drive_moto();//由P1低四位輸出控制信號
  50. void initial();
  51. unsigned int TempBuffer[5];
  52. BYTE code dis1[] = {"Temperature:"};
  53. BYTE code dis2[] = {"Set_Temper:"};
  54. BYTE code dis3[] = {"0123456789"};
  55. BYTE code dis4[] = 0xdf;
  56. BYTE code dis5[] = {"C"};



  57. //
  58. void init();




  59. void delay2(BYTE ms)
  60. {  
  61. BYTE i;
  62. while(ms--)
  63. {
  64.   for(i = 0; i< 250; i++)
  65.   {
  66.    _nop_();
  67.    _nop_();
  68.    _nop_();
  69.    _nop_();
  70.   }
  71. }
  72. }

  73. BOOL lcd_bz()
  74. {       // 測試LCD忙碌狀態
  75. BOOL result;
  76. rs = 0;
  77. rw = 1;
  78. ep = 1;
  79. _nop_();
  80. _nop_();
  81. _nop_();
  82. _nop_();
  83. result = (BOOL)(P0 & 0x80);
  84. ep = 0;
  85. return result;  
  86. }

  87. void lcd_wcmd(BYTE cmd)
  88. {       // 寫入指令數據到LCD
  89. while(lcd_bz());
  90. rs = 0;
  91. rw = 0;
  92. ep = 0;
  93. _nop_();
  94. _nop_();  
  95. P0 = cmd;
  96. _nop_();
  97. _nop_();
  98. _nop_();
  99. _nop_();
  100. ep = 1;
  101. _nop_();
  102. _nop_();
  103. _nop_();
  104. _nop_();
  105. ep = 0;   
  106. }
  107. void lcd_pos(BYTE pos)
  108. {       //設定顯示位置
  109. lcd_wcmd(pos | 0x80);
  110. }
  111. void lcd_wdat(BYTE dat)  
  112. {       //寫入字符顯示數據到LCD
  113. while(lcd_bz());
  114. rs = 1;
  115. rw = 0;
  116. ep = 0;
  117. P0 = dat;
  118. _nop_();
  119. _nop_();
  120. _nop_();
  121. _nop_();
  122. ep = 1;
  123. _nop_();
  124. _nop_();
  125. _nop_();
  126. _nop_();
  127. ep = 0;  
  128. }
  129. void lcd_init()
  130. {       //LCD初始化設定
  131. lcd_wcmd(0x38);   //
  132. delay2(1);
  133. lcd_wcmd(0x0c);   //
  134. delay2(1);
  135. lcd_wcmd(0x06);   //
  136. delay2(1);
  137. lcd_wcmd(0x01);   //清除LCD的顯示內容
  138. delay2(1);
  139. }
  140. void initial()
  141. {
  142. EA=1;
  143. TMOD=0x11;//定時器設置皆工作在16定時計數器模式
  144. TH0=0xef;//T0賦初值
  145. TL0=0xf0;
  146. TH1=(65536-1000)/256;//T1賦初值
  147. TL1=(65536-1000)%256;
  148. ET1=1;
  149. ET0=1;
  150. TR0=1;
  151. TR1=1;
  152. P2=0xff;   
  153. count=0;
  154. counter=0;//pwm占空比控制變量
  155. //IP=0x08; //T1優先級高于T0 ,后來證明此語句是多余的因為當加入此句后反/////而PWM調速和溫度檢測都變得有點不穩定
  156. }
  157. void delay(unsigned int i)//延時函數
  158. {
  159. while(i--);  
  160. }
  161. //18b20初始化函數檢測總線上是否有從屬器件DS的存在若存在則通訊成功
  162. void Init_DS18B20(void)
  163. {
  164. unsigned char x=0;
  165. DQ = 1;    //DQ復位
  166. delay(8);  //稍做延時
  167. DQ = 0;    //單片機將DQ拉低
  168. delay(80); //延時 大于 480us
  169. DQ = 1;    //拉高總線
  170. delay(10);
  171. x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗因為DQ復位成功的回答信號即存在信號是低電平
  172. delay(5);
  173. }
  174. //讀一個字節ROM
  175. unsigned char ReadOneChar(void)
  176. {
  177. unsigned char i=0;
  178. unsigned char dat = 0;
  179. for (i=8;i>0;i--)
  180. {
  181.   DQ = 0; // 給脈沖信號
  182.   dat>>=1;
  183.   DQ = 1; // 給脈沖信號
  184.   if(DQ)
  185.    dat|=0x80;//
  186.   delay(5);
  187. }
  188. return(dat);
  189. }

  190. //寫一個字節
  191. void WriteOneChar(unsigned char dat)
  192. {
  193. unsigned char i=0;
  194. for (i=8; i>0; i--)
  195. {
  196.   DQ = 0;
  197.   DQ = dat&0x01;
  198.   delay(5);
  199.   DQ = 1;
  200.   dat>>=1;
  201. }
  202. delay(5);
  203. }
  204. //讀取溫度
  205. unsigned char ReadTemperature(void)
  206. {
  207. unsigned char a=0;
  208. unsigned char b=0;
  209. unsigned char t=0;

  210. Init_DS18B20();// 復位
  211. WriteOneChar(0xCC); // 跳過讀序號列號的操作
  212. WriteOneChar(0x44); // 啟動溫度轉換
  213. delay(100);
  214. Init_DS18B20();  //每次操作前都要進行復位
  215. WriteOneChar(0xCC); //跳過讀序號列號的操作  
  216. WriteOneChar(0xBE); //讀取溫度寄存器等共可讀9個寄存器 前兩個就是溫度
  217. a=ReadOneChar();
  218. b=ReadOneChar();
  219. s=(unsigned int)(a&0x0f);  
  220. b<<=4;//取高字節的第四位因為高四位為符號位1111為負0000為正
  221. b+=(a&0xf0)>>4;//忽略小數位取a的高四位與b的相加就是此時所測得到整數溫度值
  222. t=b;
  223. return(t);//返回溫度值給這個函數
  224. }

  225. void printf()
  226. {
  227. BYTE i;
  228. delay2(10);
  229. lcd_pos(0x00);    // 設置顯示位置為第一行的第5個字符
  230. i = 0;
  231. while(dis1[i] != '\0')
  232. {      
  233.   lcd_wdat(dis1[i]);
  234.   i++;
  235. }
  236. lcd_pos(0x40);   // 設置顯示位置為第二行第二個字符
  237. i = 0;
  238. while(dis2[i] != '\0')
  239. {
  240.   lcd_wdat(dis2[i]); // 顯示字符
  241.   i++;
  242. }
  243. TempBuffer[0]=temp/10;  //十位
  244. TempBuffer[1]=temp%10;  //個位
  245. lcd_pos(0x0c);  
  246. lcd_wdat(dis3[TempBuffer[0]]); //測試溫度十位
  247. lcd_pos(0x0d);  
  248. lcd_wdat(dis3[TempBuffer[1]]); //測試溫度個位
  249. lcd_pos(0x0e);
  250. lcd_wdat(dis4[0]);  
  251. lcd_pos(0x0f);
  252. lcd_wdat(dis5[0]);

  253. TempBuffer[2]=set_temper/10;  //十位
  254. TempBuffer[3]=set_temper%10;  //個位
  255. lcd_pos(0x4c);  
  256. lcd_wdat(dis3[TempBuffer[2]]); //設置溫度十位
  257. lcd_pos(0x4d);  
  258. lcd_wdat(dis3[TempBuffer[3]]); //設置溫度個位
  259. lcd_pos(0x4e);
  260. lcd_wdat(dis4[0]);  
  261. lcd_pos(0x4f);
  262. lcd_wdat(dis5[0]);
  263. }
  264. void keyscan()
  265. {
  266. if(key1==0)
  267. {
  268.   delay(200);
  269.   if(key1==0)
  270.   {
  271.    set_temper++;
  272.   }
  273. }
  274. if(key2==0)
  275. {
  276.   delay(200);
  277.   if(key2==0)
  278.   {
  279.    set_temper--;
  280.   }
  281. }
  282. }
  283. void tim(void) interrupt 1 using 1//中斷用于數碼管掃描和溫度檢測間隔
  284. {
  285. // TH0=0xef;//定時器重裝值
  286. // TL0=0xf0;
  287. // num++;
  288. // if (num==100)
  289. // {
  290. //  num=0;
  291. //  flag_get=1;//標志位有效
  292. // }
  293. }

  294. void into(void) interrupt 3 //T1定時中斷服務程序  
  295. {   
  296.    
  297.     TH1=(65536-1000)/256;//初值重裝
  298.     TL1=(65536-1000)%256;
  299. counter++;
  300.   if(counter>CIRCLE)  
  301. {
  302.   counter=0;////限定周期為T=100X0.01ms=10ms
  303. }  
  304. if(counter<=high_time)//取得查表參數以調節pwm的占空比
  305. pwm=1;//PWM高電平
  306. else   
  307. pwm=0;
  308. }



  309. void compare_temper()  
  310. {  
  311. // unsigned char i;  
  312. if(set_temper>temp)  
  313. {  
  314.   if(set_temper-temp>=10)  
  315.   {  
  316.    high_time=100;  
  317.   }  
  318.   else  
  319.   {  
  320. //   for(i=0;i<10;i++)  
  321. //   {  
  322. //    rin = s; // Read Input  
  323. //    rout = PIDCalc ( &spid,rin ); // Perform PID Interation  
  324. //   }  
  325.    if (set_temper-temp==9)  
  326.     high_time=90;
  327.    if (set_temper-temp==8)  
  328.     high_time=80;
  329.    if (set_temper-temp==7)  
  330.     high_time=70;
  331.    if (set_temper-temp==6)  
  332.     high_time=60;
  333.    if (set_temper-temp==5)  
  334.     high_time=50;
  335.    if (set_temper-temp==4)  
  336.     high_time=40;
  337.    if (set_temper-temp==3)  
  338.     high_time=30;
  339.    if (set_temper-temp==2)  
  340.     high_time=20;
  341.    if (set_temper-temp==1)  
  342.     high_time=10;
  343.   }  
  344. }  
  345. else if(set_temper<temp)  
  346. {  
  347. //  if(temp-set_temper>0)  
  348. //  {  
  349.    high_time=0;  
  350. //  }  
  351. }   
  352. }
  353. main()
  354. {
  355. initial();// 初始化個變量及定時器的初值開中斷等
  356. lcd_init();    // 初始化LCD   
  357. while(1)
  358. {
  359.   compare_temper();  
  360.   printf();
  361.   temp=ReadTemperature();
  362.   keyscan();      
  363. }
  364. }
復制代碼
0.png
所有資料打包下載:
爐溫控制系統.rar (382.23 KB, 下載次數: 263)

評分

參與人數 4黑幣 +66 收起 理由
Aaabin + 12 很給力!
花鼓燈 + 3 共享資料的黑幣獎勵!
瀟灑聰哥ing + 1 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1 發表于 2016-12-3 23:55 | 顯示全部樓層
51黑有你更精彩!!!
回復

使用道具 舉報

ID:195719 發表于 2017-5-2 19:58 | 顯示全部樓層
請問你會編程這個課程設計的嗎
回復

使用道具 舉報

ID:195719 發表于 2017-5-2 20:03 | 顯示全部樓層
請問在此電路圖修改些電路能編程嗎
回復

使用道具 舉報

ID:194844 發表于 2017-5-4 20:24 | 顯示全部樓層
請問你會編程這個課程設計的嗎
回復

使用道具 舉報

ID:257829 發表于 2017-12-10 14:02 | 顯示全部樓層
感覺程序不是很懂,看來我還得多學習
回復

使用道具 舉報

ID:106211 發表于 2018-1-11 15:48 | 顯示全部樓層
先下載了  ,不知道是否可以使用在PTC做的溫控臺上
回復

使用道具 舉報

ID:254251 發表于 2018-1-11 18:07 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:87193 發表于 2018-1-15 15:02 | 顯示全部樓層
學習了,謝謝分享
回復

使用道具 舉報

ID:241772 發表于 2018-4-16 22:47 | 顯示全部樓層
學習了,謝謝分享
回復

使用道具 舉報

ID:314339 發表于 2018-4-23 11:58 來自手機 | 顯示全部樓層
學習了,試試
回復

使用道具 舉報

ID:314339 發表于 2018-4-23 19:19 來自手機 | 顯示全部樓層
是pid程序嗎
回復

使用道具 舉報

ID:543692 發表于 2019-5-22 18:42 | 顯示全部樓層
學習了,謝謝分享
回復

使用道具 舉報

ID:665375 發表于 2019-12-16 17:00 | 顯示全部樓層
學習了,謝謝分享
回復

使用道具 舉報

ID:765945 發表于 2020-6-1 14:21 | 顯示全部樓層
謝謝 學習學習
回復

使用道具 舉報

ID:51889 發表于 2020-6-17 15:03 | 顯示全部樓層
謝謝啦
回復

使用道具 舉報

ID:1120325 發表于 2024-5-12 13:54 | 顯示全部樓層
想嘗試一下調整電路布局
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久毛片 | 成人免费观看男女羞羞视频 | 亚洲大片 | 久久国产婷婷国产香蕉 | 福利av在线 | 少妇特黄a一区二区三区88av | 日一区二区 | 国产免费观看久久黄av片涩av | av一级 | 免费av毛片 | 欧美一区二区 | 国产精品久久久久久久久久不蜜臀 | 成人网av | 91精品久久久久久久久久 | 国产精品乱码一二三区的特点 | 91大神新作在线观看 | 色综合成人网 | 国产一区二区在线视频 | 国产精品久久777777 | 国产区在线免费观看 | 国产午夜精品久久久久免费视高清 | 福利网址 | 五月婷婷激情 | 亚洲午夜在线 | 欧美三级在线 | 久草综合在线 | 亚洲人精品午夜 | 手机av网 | 日日日操 | 中文字幕一区二区三区在线视频 | 亚洲成人综合在线 | 欧洲精品视频一区 | 亚洲精品电影在线观看 | 国产精品一区二区久久精品爱微奶 | 国产九一精品 | 一区二区在线 | 久久久这里都是精品 | 色综合桃花网 | 色婷婷综合网站 | 亚洲精品日韩综合观看成人91 | 久久综合国产 |