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

QQ登錄

只需一步,快速開始

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

溫度控制課程設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:193753 發(fā)表于 2017-4-26 11:12 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include<reg52.h>
  2. #include<serial.h>
  3. #include<math.h>
  4. #include <intrins.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. #define target 65                                                        //設(shè)定溫度目標(biāo)值
  8. int aa=0,bb=0;                                    // aa,bb是用于顯示時(shí)間的變量
  9. signed long  error=0,d_error=0,dd_error=0;        //相當(dāng)于公式中的e(k),e(k-1),e(k-2);
  10. int k=14,ti=5;td=16,det_t,pwm,m=0;
  11. //unsigned char YSJS=0;
  12. float t;


  13. uint tmpvalue=0, value;   //tmpvalue是暫時(shí)值 value是最終溫度值
  14. int high,low;
  15. sbit P23=P2^3;
  16. sbit P22=P2^2;
  17. sbit DQ = P2^1;                 //P2.1作為連接DS18B20的I/O口
  18. sbit p0=P1^0;
  19. sbit p1=P1^1;
  20. sbit p2=P1^2;
  21. sbit p3=P1^3;                  //P1.3和P1.4作為升溫電路的控制端
  22. sbit p4=P1^4;                                                                                   
  23. sbit p5=P1^5;        //P1.5~P1.7控制八個(gè)七段數(shù)碼管的亮滅
  24. sbit p6=P1^6;
  25. sbit p7=P1^7;


  26.                

  27. void delayms(int o)   //用于數(shù)碼管顯示的延時(shí)
  28. {
  29.     unsigned char a1,b1,c1;
  30.         int x=o;
  31.         for(;o>0;o--)
  32.     for(c1=4;c1>0;c1--)
  33.         for(b1=21;b1>0;b1--)
  34.             for(a1=14;a1>0;a1--);
  35.                         }
  36. void init()                 //定時(shí)器初始化
  37. {       
  38.         TMOD=0x21;
  39.         TH0=(65536-50000)/256;
  40.         TL0=(65536-50000)%256;
  41.         EA=1;
  42.         ET0=1;
  43.         TR0=1;       
  44. }

  45. /***************八段管顯示碼***************/

  46. code uchar LEDmap[]  ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
  47. code uchar BITaddr[] ={0x0f, 0x2f, 0x4f, 0x6f, 0x8f, 0xaf, 0xdf, 0xef};                          //數(shù)碼管位選地址
  48. uchar code LEDmap1[] ={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //帶小數(shù)點(diǎn)數(shù)字編碼

  49. /***************ds18b20的程序***************/

  50. void delay(unsigned int i)
  51. {
  52.         while(i--);
  53. }
  54. void Init_DS18B20(void)
  55. {
  56.         unsigned char x=0;
  57.         DQ = 1; //DQ復(fù)位
  58.         delay(8); //稍做延時(shí)
  59.         DQ = 0; //單片機(jī)將DQ拉低
  60.         delay(80); //精確延時(shí) 大于 480us
  61.         DQ = 1; //拉高總線
  62.         delay(14);
  63.         x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  64.         delay(20);
  65. }

  66. //讀一個(gè)字節(jié)
  67. int ReadOneChar()
  68. {
  69.         unsigned char i=0;
  70.         unsigned char dat = 0;
  71.         for (i=8;i>0;i--)
  72.                 {
  73.                         DQ = 0; // 給脈沖信號(hào)
  74.                         dat>>=1;
  75.                         DQ = 1; // 給脈沖信號(hào)
  76.                         if(DQ)
  77.                         dat|=0x80;
  78.                         delay(4);
  79.                 }
  80.         return(dat);
  81. }

  82. //寫一個(gè)字節(jié)
  83. void WriteOneChar(unsigned char dat)
  84. {
  85.         unsigned char i=0;
  86.         for (i=8; i>0; i--)
  87.                 {
  88.                         DQ = 0;
  89.                         DQ = dat&0x01;
  90.                         delay(5);
  91.                         DQ = 1;
  92.                         dat>>=1;
  93.                 }
  94. }

  95. //DS18B20程序讀取溫度
  96. void ReadTemperature()
  97. {
  98.         Init_DS18B20();
  99.         WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
  100.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  101.         Init_DS18B20();
  102.         WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
  103.         WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  104.         low=ReadOneChar();
  105.         high=ReadOneChar();
  106.         tmpvalue = high;
  107.         tmpvalue =(tmpvalue<<8);
  108.         tmpvalue=tmpvalue | low;
  109.         value=tmpvalue*0.0625;
  110.         t=tmpvalue*0.625;
  111. }               
  112. /***************主函數(shù)****************/

  113. void main()
  114. {  
  115.    int i=0;       
  116.    init();                 //初始化子程序
  117.    uart_init();
  118.     P23 = 1;
  119.    P22 = 1;
  120.    delayms(9500);
  121.    P23 = 0;
  122.    P22 = 0;
  123.    while(1)
  124.                    {
  125.                                                
  126.                    if((bb%3)==0)                  //每三秒掃描一次 ,采樣周期3s
  127.                                 {                       
  128.                                     dd_error=d_error;
  129.                                         d_error=error;               
  130.                                         error = (signed long)(target-value);//求e(k)             //求e(k-1)            //求e(k-2)                                                                                                                                                         
  131.                                         det_t=k*(error-d_error)+(k*3/ti)*error+(k*td/3)*(error-2*d_error+dd_error);                //增量公式           */
  132.       // det_t=20*(error-d_error)+0.15*error+10*(error-2*d_error+dd_error);                //增量公式           */


  133.                                         pwm=det_t;
  134.                                         if((error>10)||(pwm>60))pwm=60;       
  135.                                 }                                                                                               
  136.                                         ReadTemperature();                                                               
  137.                                         p5=0;p6=0;p7=0;P0=LEDmap[bb%10];delayms(1);                           //在數(shù)碼管上顯示時(shí)間
  138.                                         p5=1;p6=0;p7=0;P0=LEDmap[bb%100/10];delayms(1);                  
  139.                                         p5=0;p6=1;p7=0;P0=LEDmap[bb%1000/100];delayms(1);
  140.                                         p5=1;p6=1;p7=0;P0=LEDmap[bb/1000];delayms(1);                   //
  141.                                         p5=0;p6=0;p7=1;P0=LEDmap[(int)t%10];delayms(1);                   //溫度小數(shù)顯示
  142.                                         p5=1;p6=0;p7=1;P0=LEDmap1[value%10];delayms(1);                   //溫度個(gè)位及小數(shù)點(diǎn)顯示
  143.                                         p5=0;p6=1;p7=1;P0=LEDmap[value%100/10];delayms(1);           //溫度十位顯示                                                                                                                                                                               
  144.                                 if(i++>100)
  145.                         {
  146.                             Uart_SendChar(0x5a);                          
  147.                                         Uart_SendChar(value%100/10);
  148.                             Uart_SendChar(value%10);
  149.                             Uart_SendChar((int)t%10);
  150.                             Uart_SendChar(0);
  151.                             i=0;
  152.                         }               

  153.        
  154.                 }
  155. }                 

  156. void timer0()          interrupt 1
  157. {
  158.         TH0=(65536-50000)/256;
  159.         TL0=(65536-50000)%256;
  160.         aa++;
  161.         if(aa==20){aa=0;bb++;}        //計(jì)時(shí)1s
  162.         if(m<pwm){p3=1;p4=1;}        //電機(jī)啟動(dòng),加熱
  163.         if((m>=(pwm))||(value>=target)){p3=0;p4=0;} //電機(jī)關(guān)閉,停止加熱
  164.         if(m==60)m=0;                                                               
  165.          m++;               
  166. }
復(fù)制代碼

從硬件電路開始學(xué)習(xí),然后編寫程序?qū)訜岜瓋?nèi)的水溫進(jìn)行控制。能夠完成水溫在
65攝氏度的穩(wěn)定性實(shí)驗(yàn),并計(jì)算了超調(diào)和穩(wěn)態(tài)誤差。
升溫速率可以為1--4/分鐘,分階段升溫。編制信號(hào)采樣程序,轉(zhuǎn)換顯示以及在數(shù)碼管上時(shí)鐘顯示(秒表)。達(dá)到設(shè)定溫度穩(wěn)定后加入擾動(dòng),控制加熱算法,使其快速達(dá)到溫度設(shè)定值。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:190190 發(fā)表于 2017-5-5 12:04 | 只看該作者
有圖嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表