欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機的PID溫控(熱得快)設計與調試資料 [打印本頁]

作者: heartofYan    時間: 2018-5-30 20:57
標題: 51單片機的PID溫控(熱得快)設計與調試資料
《自動控制原理》課程設計
目錄

1. 系統設計方案3
1.1方案一3
1.2 方案二3
1.3方案三3
1.4方案的比較和確定3
2.系統硬件部分設計3
2.1 系統硬件電路圖3
2.1.1 單片機AT89C524
2.1.2單片機與LCD通信連接4
2.1.3 其他電路模塊及總電路5
3系統軟件部分5
3.1系統的主流程圖如下5
4.溫度控制系統PID調節6
4.1 PID控制傳遞函數6
4.2 PID參數調節方法6
4.3 PID參數設定6
5.實驗與調試7
6.總論8
附    錄8
參 考 文 獻24

1.1方案一

          選用鉑電阻溫度傳感器。此類溫度傳感器線性度、穩定性等方面性能都很好,但其成本較高。

1.2 方案二

          采用熱敏電阻。選用此類元器件有價格便宜的優點,但由于熱敏電阻的非線性特性會影響系統的精度。

1.3方案三

采用DS18B20溫度傳感器。DS18B20是DALLAS公司生產的一線式數字溫度傳感器,具有3引腳封裝形式;溫度測量范圍為-55℃~+125℃,可編程為9位~12位A/D轉換精度,測溫分辨率可達0.0625℃,被測溫度用符號擴展的16位數字量方式串行輸出遠端引入

     1.4方案的比較和確定

比較以上三種方案,方案三具有具有體積小、質量輕、線形度好、性能穩定等優點其各方面特性都滿足此系統的設計要求的優點,因此選用方案三。

硬件設計包含DS18B20模塊,1602液晶顯示模塊,繼電器模塊,鍵盤輸入模塊和聲光報警模塊,DS18B20可以被編程,所以箭頭是雙向的,CPU(89C52)首先寫入命令給DS18B20,然后DS18B20開始轉換數據,轉換后通89C52來處理數據。數據處理后的結果就顯示到1602液晶上。

2.1系統硬件電路圖

2.1.1 單片機STC89C52

2.1.2單片機與LCD通信連接

2.1.3 其他電路模塊及總電路

軟件設計的部分采用分層模塊化設計,主要有鍵盤掃描、按鍵處理程序、數碼管顯示程序、繼電器控制程序、溫度信號處理程序、超溫報警程序。另外以 AT89C52 單片機為控制核心。利用PID 控制算法提高了水溫的控制精度使用PID 控制算法實施自動控制系統具有控制參數精度高、反映速度快和穩定性好的特點。

3.1系統的主流程圖如下


4.溫度控制系統PID調節

4.1 PID控制傳遞函數

     通過熱電偶采集的被測溫度偏離所希望的給定值時,PID控制可根據測量信號與給定值的偏差進行比例(P)、積分(I)、微分(D)運算,從而輸出某個適當的控制信號給執行機構,促使測量值恢復到給定值,達到自動控制的效果。

4.2 PID參數調節方法及參數設定

  PID模塊的溫度控制精度主要受P、I、D這三個參數影響。其中P代表比例,I代表積分,D代表微分。
  比例運算(P)
  比例控制是建立與設定值(SV)相關的一種運算,并根據偏差在求得運算值(控制輸出量)。如果當前值(PV)小,運算值為100%。如果當前值在比例帶內,運算值根據偏差比例求得并逐漸減小直到SV和PV匹配(即,直到偏差為0),此時運算值回復到先前值(前饋運算)。若出現靜差(殘余偏差),可用減小P方法減小殘余偏差。如果P太小,反而會出現振蕩。
  積分運算(I)
  將積分與比例運算相結合,隨著調節時間延續可減小靜差。積分強度用積分時間表示,積分時間相當于積分運算值到比例運算值在階躍偏差響應下達到的作用所需要的時間。積分時間越小,積分運算的校正時間越強。但如果積分時間值太小,校正作用太強會出現振蕩。
  微分運算(D)
  比例和積分運算都校正控制結果,所以不可避免地會產生響應延時現象。微分運算可彌補這些缺陷。在一個突發的干擾響應中,微分運算提供了一個很大的運算值,以恢復原始狀態。微分運算采用一個正比于偏差變化率(微分系數)的運算值校正控制。微分運算的強度由微分時間表示,微分時間相當于微分運算值達到比例運算值在階躍偏差響應下達到的作用所需的時間。微分時間值越大,微分運算的校正強度越強。


5.實驗與調試

              用繼電器模塊來控制200W“熱得快”來對1升水進行加熱,用鍵盤設定需要加熱溫度值,觀察1602所顯示的穩定水溫和環境溫度降低時溫度控制的靜態誤差。多次調試并合設定PID參數來完善系統。
              實物圖:

6.總論

首先,通過本次應用系統設計,在很大程度上提高了我們的獨立思考能力和專業知識相信在接下來的日子我們能在已有的基礎上做得更好。我們所設計的該系統主要根據目前省能源的發展趨勢和國內實際的應用特點和要求,采用了自動化的結構形式,實現對水溫的自動檢測和控制。該系統的主要特點是:

1)適用性強,用戶只需對界面參數進行設置并啟動系統正常運行便可滿足不同用戶水溫的要求,實現對水溫的實時監控。避免了電力力資源的浪費,節省了能源。

2)將單片機以及溫度傳感器引入對水溫的分析和處理中,單片機控制決策無需建立被控對象的數學模型,系統的適應性強,適合對非線性、時變、滯后系統的控制對水溫控制系統進行控制。 3)系統成本低廉,操作非常簡單,可擴展性強,只要稍加改變,即可增加其他使用功能。

通過對本設計的思考,更加加深了我們對單片機的認識,熟練了對單片機的控制,更對當前的溫度傳感器有了更深刻的認識與了解,但是由于此系統依賴溫度傳感器,因而對溫度傳感器的穩定性,線性等諸多方面有著嚴格的要求,但是傳感器的性能越好,相對而言其價格也就越高,因而在此設計中,溫度傳感器覺的還是存在遺憾,由于溫度計的使用溫度有限所以水溫不能達到90℃以上。最后由于時間緊迫,本設計還有諸多地方需要改進,我們會在接下來的時間里繼續完善該設計,以期做的更好。

附錄:

部分程序:

//main.c:
  1. #include<reg51.h>
  2. #include"lcd.h"
  3. #include"temp.h"
  4. #include"pid.h"

  5. sbit c1=P2^6;
  6. sbit c2=P2^7;
  7. sbit beep=P1^3;

  8. sbit K3=P3^2;
  9. sbit K4=P3^3;

  10. void IntConfiguration();
  11. void Delay(unsigned int n);
  12. unsigned char KeyValue=0;

  13. extern float set_temper;


  14. /*******************************************************************************
  15. * 函數名         : main
  16. * 函數功能                               : 主函數
  17. * 輸入           : 無
  18. * 輸出                       : 無
  19. *******************************************************************************/

  20. void main()
  21. {
  22.               extern struct PID spid; // PID Control Structure
  23.             
  24.               LcdInit();
  25.               IntConfiguration();
  26.             
  27.               PIDInit ( &spid );
  28.               spid.Proportion = 10; // Set PID Coefficients
  29.               spid.Integral = 8;
  30.               spid.Derivative =6;
  31.               spid.SetPoint = 100; // Set PID Setpoint
  32.             
  33.               beep=1;
  34.             
  35.               TMOD=0x21;
  36.               TH0=0x2f;
  37.               TL0=0x40;
  38.               //PCON=0X80;                                          //波特率加倍
  39.               //TH1=0XF3;                                                        //計數器初始值設置,注意波特率是4800的
  40.               //TL1=0XF3;
  41.               EA=1;
  42.               ET0=1;
  43.               //ES=1;
  44.               TR0=1;
  45.               TR1=1;

  46.               c1=0;
  47.               c2=0;
  48.             
  49.               P1=0XFF;
  50.             
  51.               while(1)
  52.               {
  53.                             LcdDisplay(Ds18b20ReadTemp());
  54.                             LcdDisplay2(set_temper);
  55. //                            LcdDisplay3(realtmp);
  56. /*                            if((set_temper-realtmp)<1&&(realtmper-set_temp)<1)
  57.                             {
  58.                                           beep=0;
  59.                             }
  60.                             else
  61.                                           beep=1;              */
  62.                             compare_temper();
  63. //                            SBUF=Ds18b20ReadTemp();
  64. //                            Delay1ms(1);//1s鐘刷一次
  65.               }
  66. }


  67. void IntConfiguration()
  68. {
  69.               //設置INT0
  70.               IT0=1;//跳變沿出發方式(下降沿)
  71.               EX0=1;//打開INT0的中斷允許。
  72.               //設置INT1
  73.               IT1=1;
  74.               EX1=1;
  75.             
  76.               EA=1;//打開總中斷            
  77. }
  78. /*******************************************************************************
  79. * 函數名         : Delay(unsigned int n)
  80. * 函數功能                               : 延時
  81. * 輸入           : n
  82. * 輸出                       : 無
  83. *******************************************************************************/

  84. void Delay(unsigned int n)   //延時50us誤差 0us
  85. {
  86.     unsigned char a,b;
  87.                             for(;n>0;n--)
  88.                             {
  89.                   for(b=1;b>0;b--)
  90.         for(a=22;a>0;a--);
  91.                             }
  92. }
  93. /*******************************************************************************
  94. * 函數名         : Int0()              interrupt 0
  95. * 函數功能                               : 外部中斷0的中斷函數
  96. * 輸入           : 無
  97. * 輸出                       : 無
  98. *******************************************************************************/

  99. void Int0()              interrupt 0                            //外部中斷0的中斷函數
  100. {
  101.               Delay(1);              //延時消抖
  102.               if(K3==0)
  103.               {
  104.                             while(K3==0);
  105.                             set_temper++;
  106.               }
  107.               if(set_temper>60.00)
  108.                             set_temper=60.00;
  109. }
  110. /*******************************************************************************
  111. * 函數名         : Int1() interrupt 2
  112. * 函數功能                               : 外部中斷1的中斷函數
  113. * 輸入           : 無
  114. * 輸出                       : 無
  115. *******************************************************************************/

  116. void Int1() interrupt 2                            //外部中斷1的中斷函數
  117. {
  118.               Delay(1);                            //延時消抖
  119.               if(K4==0)
  120.               {
  121.                             while(K4==0);
  122.                             set_temper--;
  123.               }
  124.               if(set_temper<40.00)
  125.                             set_temper=40.00;            
  126. }



  127. //pid.c
  128. #include"pid.h"
  129. #include"temp.h"

  130. struct PID spid; // PID Control Structure

  131. unsigned int rout; // PID Response (Output)
  132. unsigned int rin; // PID Feedback (Input)



  133. int i=0,j=0,flag2=0,tem=0;

  134. sbit output=P1^6;


  135. unsigned char flag,flag_1=0;
  136. unsigned char high_time,low_time,count=0;//占空比調節參數
  137. float set_temper=40;



  138. void PIDInit (struct PID *pp)
  139. {
  140.               high_time=50;
  141.               low_time=50;
  142.               memset ( pp,0,sizeof(struct PID));
  143.             
  144. }
  145. /*====================================================================================================
  146. PID計算部分
  147. =====================================================================================================*/
  148. unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
  149. {
  150. unsigned int dError,Error;
  151. Error = pp->SetPoint - NextPoint; // 偏差
  152. pp->SumError += Error; // 積分
  153. dError = pp->LastError - pp->PrevError; // 當前微分
  154. pp->PrevError = pp->LastError;
  155. pp->LastError = Error;
  156. return (pp->Proportion * Error//比例
  157. + pp->Integral * pp->SumError  //積分項
  158. + pp->Derivative * dError); //   微分項
  159. }
  160. /***********************************************************
  161. 溫度比較處理子程序
  162. ***********************************************************/
  163. void compare_temper()
  164. {
  165. unsigned char i;
  166. extern float realtmp;
  167. extern unsigned int s;

  168. if(set_temper>realtmp)
  169. {
  170. if(set_temper-realtmp>1)
  171. {
  172. high_time=100;
  173. low_time=0;
  174. //P1=0XFF;
  175. //mod1=0;
  176. }
  177. else
  178. {
  179. //P1=0XFF;
  180. //mod2=0;
  181. for(i=0;i<10;i++)
  182. { Ds18b20ReadTemp();
  183. rin = s; // Read Input
  184. rout = PIDCalc ( &spid,rin ); // Perform PID Interation
  185. }

  186. if (high_time<=100)
  187. high_time=(unsigned char)(rout/800);
  188. else
  189. high_time=100;
  190. low_time= (100-high_time);
  191. }
  192. }
  193. else if(set_temper<=realtmp)
  194. {
  195. if(realtmp-set_temper>0)
  196. {
  197. //P1=0XFF;
  198. //mod3=0;
  199. high_time=0;
  200. low_time=100;
  201. //mod2=0;
  202. }
  203. else
  204. {
  205. //P1=0XFF;
  206. //mod4=0;
  207. for(i=0;i<10;i++)
  208. { Ds18b20ReadTemp();
  209. rin = s; // Read Input
  210. rout = PIDCalc ( &spid,rin ); // Perform PID Interation
  211. }
  212. if (high_time<100)
  213. high_time=(unsigned char)(rout/10000);
  214. else
  215. high_time=0;
  216. low_time= (100-high_time);
  217. }
  218. }
  219. // else
  220. // {}
  221. }
  222. /*****************************************************
  223. T0中斷服務子程序,用于控制電平的翻轉 ,40us*100=4ms周期
  224. ******************************************************/
  225. void serve_T0() interrupt 1 using 1
  226. {
  227. j++;
  228. if(++count<=(high_time))
  229. {
  230.               output=1;
  231.               i++;
  232. }
  233. else if(count<=100)
  234. {
  235. output=0;
  236. }
  237. else
  238. count=0;
  239. if(j==1000)
  240.               {j=0;flag2=1;tem=i;i=0; }
  241. TH0=0x2f;
  242. TL0=0xe0;
  243. }
  244. /*****************************************************
  245. 串行口中斷服務程序,用于上位機通訊
  246. ******************************************************/
  247. void serve_sio() interrupt 4
  248. {              
  249. /*              EA=0;
  250. //                            flag2=0;
  251.                             while(!TI);                                          //等待發送數據完成
  252.                             TI=0;
  253.                             EA=1;  */
  254. }



  255. //temp.c
  256. #include"temp.h"

  257. int temp=0;
  258. unsigned int s;
  259. //float set_temp=27.00;
  260. /*******************************************************************************
  261. * 函數名         : Delay1ms
  262. * 函數功能                               : 延時函數
  263. * 輸入           : 無
  264. * 輸出                       : 無
  265. *******************************************************************************/

  266. void Delay1ms(unsigned int y)
  267. {
  268.               unsigned int x;
  269.               for(y;y>0;y--)
  270.                             for(x=110;x>0;x--);
  271. }
  272. /*******************************************************************************
  273. * 函數名         : Ds18b20Init
  274. * 函數功能                               : 初始化
  275. * 輸入           : 無
  276. * 輸出                       : 初始化成功返回1,失敗返回0
  277. *******************************************************************************/

  278. unsigned char Ds18b20Init()
  279. {
  280.               unsigned int i;
  281.               DSPORT=0;                                          //將總線拉低480us~960us
  282.               i=70;            
  283.               while(i--);//延時642us
  284.               DSPORT=1;                                          //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
  285.               i=0;
  286.               while(DSPORT)              //等待DS18B20拉低總線
  287.               {
  288.                             i++;
  289.                             if(i>5000)//等待>5MS
  290.                                           return 0;//初始化失敗            
  291.               }
  292.               return 1;//初始化成功
  293. }

  294. /*******************************************************************************
  295. * 函數名         : Ds18b20WriteByte
  296. * 函數功能                               : 向18B20寫入一個字節
  297. * 輸入           : com
  298. * 輸出                       : 無
  299. *******************************************************************************/

  300. void Ds18b20WriteByte(unsigned char dat)
  301. {
  302.               unsigned int i,j;
  303.               for(j=0;j<8;j++)
  304.               {
  305.                             DSPORT=0;                                          //每寫入一位數據之前先把總線拉低1us
  306.                             i++;
  307.                             DSPORT=dat&0x01; //然后寫入一個數據,從最低位開始
  308.                             i=6;
  309.                             while(i--); //延時68us,持續時間最少60us
  310.                             DSPORT=1;              //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
  311.                             dat>>=1;
  312.               }
  313. }
  314. /*******************************************************************************
  315. * 函數名         : Ds18b20ReadByte
  316. * 函數功能                               : 讀取一個字節
  317. * 輸入           : com
  318. * 輸出                       : 無
  319. *******************************************************************************/


  320. unsigned char Ds18b20ReadByte()
  321. {
  322.               unsigned char byte,bi;
  323.               unsigned int i,j;            
  324.               for(j=8;j>0;j--)
  325.               {
  326.                             DSPORT=0;//先將總線拉低1us
  327.                             i++;
  328.                             DSPORT=1;//然后釋放總線
  329.                             i++;
  330.                             i++;//延時6us等待數據穩定
  331.                             bi=DSPORT;              //讀取數據,從最低位開始讀取
  332.                             /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
  333.                             byte=(byte>>1)|(bi<<7);                                                                                    
  334.                             i=4;                            //讀取完之后等待48us再接著讀取下一個數
  335.                             while(i--);
  336.               }                                                      
  337.               return byte;
  338. }
  339. /*******************************************************************************
  340. * 函數名         : Ds18b20ChangTemp
  341. * 函數功能                               : 讓18b20開始轉換溫度
  342. * 輸入           : com
  343. * 輸出                       : 無
  344. *******************************************************************************/

  345. void  Ds18b20ChangTemp()
  346. {
  347.               Ds18b20Init();
  348.               Delay1ms(1);
  349.               Ds18b20WriteByte(0xcc);                            //跳過ROM操作命令                           
  350.               Ds18b20WriteByte(0x44);                //溫度轉換命令
  351.               Delay1ms(100);
  352. }
  353. /*******************************************************************************
  354. * 函數名         : Ds18b20ReadTempCom
  355. * 函數功能                               : 發送讀取溫度命令
  356. * 輸入           : com
  357. * 輸出                       : 無
  358. *******************************************************************************/

  359. void  Ds18b20ReadTempCom()
  360. {            

  361.               Ds18b20Init();
  362.               Delay1ms(1);
  363.               Ds18b20WriteByte(0xcc);              //跳過ROM操作命令
  364.               Ds18b20WriteByte(0xbe);              //發送讀取溫度命令
  365. }
  366. /*******************************************************************************
  367. * 函數名         : Ds18b20ReadTemp
  368. * 函數功能                               : 讀取溫度
  369. * 輸入           : com
  370. * 輸出                       : 無
  371. *******************************************************************************/

  372. int Ds18b20ReadTemp()
  373. {
  374.               unsigned char tmh,tml;
  375.               Ds18b20ChangTemp();                                                        //先寫入轉換命令
  376.               Ds18b20ReadTempCom();                                          //然后等待轉換完后發送讀取溫度命令
  377.               tml=Ds18b20ReadByte();                            //讀取溫度值共16位,先讀低字節
  378.               tmh=Ds18b20ReadByte();                            //再讀高字節
  379.               temp=tmh;
  380.               temp<<=8;
  381.               temp|=tml;
  382.               s=(unsigned int)(tml&0x0f);
  383.               s=(s*100)/16;
  384.               return temp;
  385. }



  386. //LCD.c
  387. #include"lcd.h"
  388. /*******************************************************************************
  389. * 函數名         : Delay1us
  390. * 函數功能                               : 延時函數,延時1us
  391. * 輸入           : a
  392. * 輸出                       : 無
  393. *******************************************************************************/
  394. float realtmp=0;

  395. void Delay1us(unsigned int a)
  396. {
  397.               unsigned int b,c;
  398.               for(c=a;c>0;c--)
  399.                             for(b=110;b>0;b--);
  400. }
  401. /*******************************************************************************
  402. * 函數名         : LcdWriteCom
  403. * 函數功能                               : 向LCD寫入一個字節的命令
  404. * 輸入           : com
  405. * 輸出                       : 無
  406. *******************************************************************************/

  407. void LcdWriteCom(unsigned char com)                //寫入命令
  408. {
  409.               RS=0;
  410.               RW=0;
  411.               GPIO_LCD=com;
  412.               Delay1us(10);
  413.               LCDE=1;
  414.               Delay1us(10);
  415.               LCDE=0;
  416. }
  417. /*******************************************************************************
  418. * 函數名         : LcdWriteData
  419. * 函數功能                               : 向LCD寫入一個字節的數據
  420. * 輸入           : dat
  421. * 輸出                       : 無
  422. *******************************************************************************/                              
  423.                               
  424. void LcdWriteData(unsigned char dat)                                          //寫入數據
  425. {
  426.               RS=1;
  427.               RW=0;
  428.               GPIO_LCD=dat;
  429.               Delay1us(10);
  430.               LCDE=1;
  431.               Delay1us(10);
  432.               LCDE=0;
  433. }
  434. /*******************************************************************************
  435. * 函數名         : LcdInit()
  436. * 函數功能                               : 初始化LCD屏
  437. * 輸入           : 無
  438. * 輸出                       : 無
  439. *******************************************************************************/                              

  440. void LcdInit()                                                                                      //LCD初始化子程序
  441. {
  442.               LcdWriteCom(0x38);  //開顯示
  443.               LcdWriteCom(0x0c);  //開顯示不顯示光標
  444.               LcdWriteCom(0x06);  //寫一個指針加1
  445.               LcdWriteCom(0x01);  //清屏
  446.               LcdWriteCom(0x80);  //設置數據指針起點
  447. }

  448. void LcdDisplay(int temp)               //lcd顯示
  449. {

  450.   unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
  451.               float tp;
  452.                                           //初始化LCD
  453.               if(temp< 0)                                                        //當溫度值為負數
  454.   {
  455.                 LcdWriteCom(0x80);                            //寫地址 80表示初始地址
  456.     LcdWriteData('-');                              //顯示負
  457.                             //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  458.                             temp=temp-1;
  459.                             temp=~temp;
  460.                             tp=temp;
  461.                             temp=tp*0.0625*100+0.5;            
  462.                             //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  463.                             //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  464.                             //算加上0.5,還是在小數點后面。

  465.   }
  466.   else
  467.   {                                         
  468.                 LcdWriteCom(0x80);                            //寫地址 80表示初始地址
  469.     LcdWriteData('+');                             //顯示正
  470.                             tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  471.                             //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  472.                             temp=tp*0.0625*100+0.5;            
  473.                             //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  474.                             //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  475.                             //算加上0.5,還是在小數點后面。
  476.                             realtmp=(float)temp/100;
  477.   }
  478.               datas[0] = temp / 10000;
  479.   datas[1] = temp % 10000 / 1000;
  480.   datas[2] = temp % 1000 / 100;
  481.   datas[3] = temp % 100 / 10;
  482.   datas[4] = temp % 10;

  483.               LcdWriteCom(0x82);                              //寫地址 80表示初始地址
  484.   LcdWriteData('0'+datas[0]); //百位


  485.   LcdWriteCom(0x83);                            //寫地址 80表示初始地址
  486.   LcdWriteData('0'+datas[1]); //十位

  487.               LcdWriteCom(0x84);                            //寫地址 80表示初始地址
  488.   LcdWriteData('0'+datas[2]); //個位

  489.               LcdWriteCom(0x85);                            //寫地址 80表示初始地址
  490.   LcdWriteData('.');                             //顯示 ‘.’

  491.               LcdWriteCom(0x86);                            //寫地址 80表示初始地址
  492.   LcdWriteData('0'+datas[3]); //顯示小數點

  493.               LcdWriteCom(0x87);                            //寫地址 80表示初始地址
  494.   LcdWriteData('0'+datas[4]); //顯示小數點

  495.               LcdWriteCom(0x88);                            //寫地址 80表示初始地址
  496.   LcdWriteData('C');  
  497. }

  498. void LcdDisplay2(float num)
  499. {
  500.               unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
  501.               int temp;
  502. //              LcdInit();                                          //初始化LCD
  503.             
  504.                 LcdWriteCom(0xC0);                            //寫地址 80表示初始地址
  505.     LcdWriteData('+');                             //顯示正
  506.                             temp=num*100+0.5;            
  507.                             //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  508.                             //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  509.                             //算加上0.5,還是在小數點后面。

  510.               datas[0] = temp / 10000;
  511.   datas[1] = temp % 10000 / 1000;
  512.   datas[2] = temp % 1000 / 100;
  513.   datas[3] = temp % 100 / 10;
  514.   datas[4] = temp % 10;

  515.               LcdWriteCom(0xC1);                              //寫地址 80表示初始地址
  516.   LcdWriteData('0'+datas[0]); //百位


  517.   LcdWriteCom(0xC2);                            //寫地址 80表示初始地址
  518.   LcdWriteData('0'+datas[1]); //十位

  519.               LcdWriteCom(0xC3);                            //寫地址 80表示初始地址
  520.   LcdWriteData('0'+datas[2]); //個位

  521.               LcdWriteCom(0xC4);                            //寫地址 80表示初始地址
  522.   LcdWriteData('.');                             //顯示 ‘.’

  523.               LcdWriteCom(0xC5);                            //寫地址 80表示初始地址
  524.   LcdWriteData('0'+datas[3]); //顯示小數點

  525.               LcdWriteCom(0xC6);                            //寫地址 80表示初始地址
  526.   LcdWriteData('0'+datas[4]); //顯示小數點

  527.               LcdWriteCom(0xC7);                            //寫地址 80表示初始地址
  528.   LcdWriteData('C');
  529. }

  530. void LcdDisplay3(float num)
  531. {
  532.               unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
  533.               int temp;
  534. //              LcdInit();                                          //初始化LCD
  535.             
  536.                 LcdWriteCom(0xC8);                            //寫地址 80表示初始地址
  537.     LcdWriteData('+');                             //顯示正
  538.                             temp=num*100+0.5;            
  539.                             //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  540.                             //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  541.                             //算加上0.5,還是在小數點后面。

  542.               datas[0] = temp / 10000;
  543.   datas[1] = temp % 10000 / 1000;
  544.   datas[2] = temp % 1000 / 100;
  545.   datas[3] = temp % 100 / 10;
  546.   datas[4] = temp % 10;

  547.               LcdWriteCom(0xC9);                              //寫地址 80表示初始地址
  548.   LcdWriteData('0'+datas[0]); //百位


  549.   LcdWriteCom(0xCA);                            //寫地址 80表示初始地址
  550.   LcdWriteData('0'+datas[1]); //十位

  551.               LcdWriteCom(0xCB);                            //寫地址 80表示初始地址
  552.   LcdWriteData('0'+datas[2]); //個位

  553.               LcdWriteCom(0xCC);                            //寫地址 80表示初始地址
  554.   LcdWriteData('.');                             //顯示 ‘.’

  555.               LcdWriteCom(0xCD);                            //寫地址 80表示初始地址
  556.   LcdWriteData('0'+datas[3]); //顯示小數點

  557.               LcdWriteCom(0xCE);                            //寫地址 80表示初始地址
  558.   LcdWriteData('0'+datas[4]); //顯示小數點

  559.               LcdWriteCom(0xCF);                            //寫地址 80表示初始地址
  560.   LcdWriteData('C');
  561. }
復制代碼

完整的Word格式文檔51黑下載地址:
基于51單片機的PID調溫(熱得快).doc (4.46 MB, 下載次數: 279)




作者: 大米861    時間: 2019-10-18 19:05
正有學習PID算法,下了,謝謝樓主分享。
作者: 811352973tang    時間: 2020-6-25 16:07
謝謝樓主,正在做設計,很有幫助
作者: ROBS    時間: 2021-5-7 16:18
謝謝樓主,這個對我幫助很大。
作者: woyaodwn    時間: 2021-12-28 10:05
能提供一下電路原理圖,源碼嗎




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1