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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機(jī)的模糊PID溫度控制裝置源程序設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:686752 發(fā)表于 2023-5-15 16:34 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
隨著電子技術(shù)的不斷發(fā)展,傳統(tǒng)的溫度控制方式已經(jīng)越來越不能滿足工業(yè)現(xiàn)場的需求,這時,PID控制憑借其算法簡單、適應(yīng)性強(qiáng)的特性,在工業(yè)過程控制中得到了廣泛的應(yīng)用。但PID控制無法應(yīng)用于滯后性大、控制對象復(fù)雜的系統(tǒng)中,尤其是控制精度要求高的溫度控制系統(tǒng)。而將智能控制中的模糊控制與PID控制相結(jié)合的方法,使系統(tǒng)不僅有PID控制的優(yōu)點(diǎn)也具有智能控制的優(yōu)點(diǎn),這樣極大消除了傳統(tǒng)PID控制的缺點(diǎn),這樣的控制方式有著廣闊的發(fā)展前景。
基于以上敘述,本設(shè)計(jì)基于PID控制原理,結(jié)合模糊控制理論,對模糊PID參數(shù)自整定算法在溫度控制系統(tǒng)中的應(yīng)用進(jìn)行了研究。本設(shè)計(jì)采用AT89C52單片機(jī)作為該裝置的核心處理器,DS18B20作為溫度傳感器,LCD1602作為顯示裝置。
本設(shè)計(jì)完成了基于單片機(jī)的模糊PID溫度控制裝置設(shè)計(jì)的硬件設(shè)計(jì)和軟件設(shè)計(jì),并利用MATLAB軟件中Simulink自帶的模糊工具箱完成了仿真測試實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果表明,模糊PID控制算法相比于傳統(tǒng)PID控制算法具有響應(yīng)速度更快,超調(diào)量幾乎為零等優(yōu)點(diǎn),可應(yīng)用于復(fù)雜的溫度控制系統(tǒng)中。

單片機(jī)源程序如下:

  1. //-----------定義模糊系統(tǒng)參數(shù)-----------------------------------------------------------
  2. //------------------------------------------------------------------------------------
  3. // 定義差距輸入常量
  4. #define GAP_ZERO     0x00
  5. #define GAP_VSMALL   0x01
  6. #define GAP_SMALL    0x02
  7. #define GAP_MEDIUM   0x03
  8. #define GAP_BIG      0x04
  9. // 定義控制輸出常量
  10. #define TURN_ZERO    0x80
  11. #define TURN_VSMALL  0x81
  12. #define TURN_SMALL   0x82
  13. #define TURN_MEDIUM  0x83
  14. #define TURN_BIG     0x84

  15. #define uchar unsigned char
  16. #define uint unsigned int

  17. //-----------定義模糊系統(tǒng)參數(shù)-----------------------------------------------------------
  18. //------------------------------------------------------------------------------------
  19. unsigned char Temp_H,Temp_L;

  20. uint sum;                          //10次AD值的綜合變量
  21. uchar RH,RH_H=12,RH_L=8,state,ms,cs;  //當(dāng)前水位,  水位上限,下限,  設(shè)置項(xiàng)變量,50ms變量   ,cs 為計(jì)次數(shù)變量    ,
  22. bit beep1,zt,s1;          //報警標(biāo)志位,   工作模式標(biāo)志位,   閃爍標(biāo)志位

  23. int Temperature;



  24. //-----------定義模糊系統(tǒng)參數(shù)-----------------------------------------------------------
  25. //------------------------------------------------------------------------------------
  26. //-------------定義常量----------------------------------------------------------------
  27. #define MU_MAX 0XFF            //模糊度的最大值為0XFF代表面1
  28. #define RULE_TOT 10            //規(guī)則數(shù)個數(shù)
  29. #define MF_TOT 5               //成員函數(shù)的個數(shù)
  30. #define IO_NUM 0x07
  31. #define LABEL_NUM 0x70
  32. #define DEFAULT_VALUE 0x00
  33. //----------------定義數(shù)據(jù)庫-----------------------------------------------------------
  34. unsigned char code output_memf[MF_TOT]={0, 15, 35, 60, 102};// OUTPUT TURNING NUMBER:
  35.                                                             // ZERO, VSMALL, SMALL, MEDIUM, BIG
  36.                                                             // 輸入功能函數(shù)以點(diǎn)斜式方式存儲. 第一維成員函數(shù)標(biāo)號第二維是點(diǎn)斜式數(shù)據(jù)
  37. unsigned char code input_memf[MF_TOT][4]={                  //距離功能函數(shù)
  38.                                             { 0x00, 0x00, 0x00, 0x0d }, // VSLOW
  39.                                             { 0x00, 0x0d, 0x14, 0x0d }, // SLOW
  40.                                             { 0x1e, 0x0d, 0x32, 0x0d }, // MEDIUM
  41.                                             { 0x3C, 0x0d, 0x50, 0x0d }, // FAST
  42.                                             { 0x50, 0x09, 0x6e, 0x00 }  // VFAST
  43.                                           };

  44. //-----------定義模糊系統(tǒng)參數(shù)-----------------------------------------------------------
  45. //------------------------------------------------------------------------------------
  46. //-----------定義模糊系統(tǒng)規(guī)則-----------------------------------------------------------
  47. unsigned char code rules[RULE_TOT]={
  48.                                         // if...  then...   規(guī)則
  49.                                         GAP_ZERO,TURN_ZERO,
  50.                                         GAP_VSMALL,TURN_VSMALL,
  51.                                         GAP_SMALL,TURN_SMALL,
  52.                                         GAP_MEDIUM,TURN_MEDIUM,
  53.                                         GAP_BIG,TURN_BIG
  54.                                    };


  55. //-----------定義模糊系統(tǒng)參數(shù)-----------------------------------------------------------
  56. //------------------------------------------------------------------------------------
  57. //-----------定義各變量-----------------------------------------------------------------
  58. unsigned char outputs[MF_TOT],fuzzy_out;  //模糊輸出mu值
  59. //-----------子程序函數(shù)頭申明-----------------------------------------------------------
  60. void fuzzy_engine(uchar);
  61. uchar compute_memval(uchar,uchar);
  62. void defuzzify(void);

  63. /***************************************************************************************************************/
  64. uchar compute_memval(uchar input,uchar label)
  65. {
  66.     int data temp;
  67.     if (input < input_memf[label][0])
  68.     {                                 // 如果輸入不在曲線下u值為0
  69.          return 0;
  70.     }
  71.     else
  72.     {
  73.         if (input < input_memf[label][2])
  74.         {
  75.              temp=input;              // 用點(diǎn)斜式計(jì)算mu
  76.              temp-=input_memf[label][0];
  77.              if (!input_memf[label][1])
  78.              {
  79.                 temp=MU_MAX;
  80.              }
  81.              else
  82.              {
  83.                 temp*=input_memf[label][1];
  84.              }
  85.              if (temp < 0x100)
  86.              {                     // 如果結(jié)果不超過1
  87.                 return temp;       // 返回計(jì)算結(jié)果
  88.              }
  89.              else
  90.              {
  91.                 return MU_MAX;     // 確保mu值在范圍內(nèi)
  92.              }
  93.         }
  94.         else
  95.         {                           // 輸入落在第二條斜線上
  96.             temp=input;               // 用點(diǎn)斜式方法計(jì)算 mu
  97.             temp-=input_memf[label][2];
  98.             temp*=input_memf[label][3];
  99.             temp=MU_MAX-temp;
  100.             if (temp < 0)
  101.             {                      // 確保結(jié)果不小于0
  102.                   return 0;
  103.             }
  104.             else
  105.             {
  106.                   return temp;        // mu為正 – 返回結(jié)果
  107.             }
  108.         }
  109.     }
  110.     return 0;
  111. }
  112. /*******************************************************************************
  113. Function: defuzzify 解模糊
  114. Description: 計(jì)算模糊輸出的重心并調(diào)用函數(shù)把它
  115.              轉(zhuǎn)換成可被系統(tǒng)使用的輸出量
  116. Parameters: 無.
  117. Returns: 無.
  118. Side Effects: outputs[][] 數(shù)組被清零.
  119. *******************************************************************************/
  120. void defuzzify(void)
  121. {
  122.     unsigned long numerator, denominator;
  123.     unsigned char j;
  124.     numerator=0;                         // 恢復(fù)總數(shù)值
  125.     denominator=0;
  126.     for (j=0; j<MF_TOT; j++)
  127.     {                                // 計(jì)算總和值
  128.         numerator+=(outputs[j]*output_memf[j]);
  129.         denominator+=outputs[j];
  130.         outputs[j]=0;                        // 清零輸出作為參考使用
  131.         if (denominator)
  132.         {                                     // 確保分母是0的情況不發(fā)生
  133.             fuzzy_out=numerator/denominator;  // 確定 COG
  134.         }
  135.         else
  136.         {
  137.             fuzzy_out=DEFAULT_VALUE;         // 沒有規(guī)則被觸發(fā)
  138.         }
  139.     }
  140. }
  141. /*******************************************************************************
  142. Function: fuzzy_engine
  143. Description: 實(shí)施規(guī)則基中的規(guī)則
  144. Parameters: 無
  145. Returns: 無.
  146. Side Effects: 無
  147. ********************************************************************************/
  148. unsigned char bdata clause_val;                        // 保存當(dāng)前的分支進(jìn)行快速訪問
  149. sbit clause_type = clause_val^7;                       // 表示分支是否是條件分支或者是結(jié)果分支
  150. void fuzzy_engine(uchar input)
  151. {
  152.     bit then;                                       // 當(dāng)正在分析結(jié)果時置位
  153.     unsigned char if_val,                           // 保存當(dāng)前規(guī)則中條件分支中的值
  154.                   clause,                           // 規(guī)則基中當(dāng)前的分支
  155.                       mu,                           // 保存當(dāng)前分支中的值
  156.                  label=0;                           // 被條件使用的成員函數(shù)
  157.                   then=0;                           // 設(shè)第一個分支是條件分支
  158.            if_val=MU_MAX;                           // max out mu for the first rule
  159.     for (clause=0; clause<RULE_TOT; clause++)
  160.     {                                               // 遍歷每條規(guī)則
  161.         clause_val=rules[clause];                   // 讀入當(dāng)前的分支
  162.         if (!clause_type)
  163.         {                                           // 當(dāng)前的分支是不是條件分支
  164.             if (then)
  165.             {                                       // 是否正在分析結(jié)果...
  166.                 then=0;
  167.                 if_val=MU_MAX;                      // 復(fù)位mu
  168.             }
  169.             mu=compute_memval(input, label);        // 得到條件分支的值
  170.             if_val=mu;
  171.             label++;
  172.         }
  173.         else
  174.         {                                       // 當(dāng)前分支是結(jié)果
  175.             then=1;            // 置位標(biāo)志位,如果當(dāng)前規(guī)則的mu比參考的值要大,保存這個值作為新的模糊輸出
  176.             if (outputs[clause_val&0x07] < if_val)
  177.             {
  178.                 outputs[clause_val&0x07]=if_val;
  179.             }
  180.         }
  181.     }
  182.     defuzzify(); // 用COG方法計(jì)算模糊輸出和反模糊輸出
  183. }
復(fù)制代碼


  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #include"fuzzy.h"
  6. struct PID
  7. {
  8. unsigned int SetPoint; // 設(shè)定目標(biāo) Desired Value
  9. unsigned int Proportion; // 比例常數(shù) Proportional Const
  10. unsigned int Integral; // 積分常數(shù) Integral Const
  11. unsigned int Derivative; // 微分常數(shù) Derivative Const
  12. unsigned int LastError; // Error[-1]  當(dāng)前偏差
  13. unsigned int PrevError; // Error[-2]   上一次偏差
  14. unsigned int SumError; // Sums of Errors 累計(jì)偏差
  15. };
  16. struct PID spid; // PID Control Structure
  17. unsigned int rout; // PID Response (Output) 響應(yīng)輸出
  18. unsigned int rin; // PID Feedback (Input)//反饋輸入
  19. unsigned char high_time,low_time,count=0;//占空比調(diào)節(jié)參數(shù)

  20. #define uchar unsigned char
  21. #define uint unsigned int

  22. char Usart_Data[3];

  23. bit FinishFlag =0;
  24. char UsartCount=0;
  25. uchar buzzer_flag = 0;
  26. sbit buzzer = P1^2;
  27. sbit output=P1^0;
  28. sbit ds=P3^2;
  29. sbit DQ=P3^2;//ds18b20與單片機(jī)連接口
  30. sbit lcden=P2^7;//LCE使能引腳
  31. sbit lcdrs=P2^5;
  32. sbit lcdrw=P2^6;
  33. sbit ledred=P1^6;                                        //加熱指示燈
  34. sbit ledgreen=P1^7;                                //加熱指示燈

  35. sbit key0=P2^0;//按鍵引腳
  36. sbit key1=P2^1;

  37. bit busy;

  38. uchar set[2]={0};
  39. uchar code str1[]="now temp:      C";
  40. uchar code str2[]="set temp:      C";
  41. uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
  42. uchar n,num;
  43. int set_temper=30,temper,temp; //溫度變量定義
  44. unsigned int s;
  45. float         f_temp;//轉(zhuǎn)換后的溫度

  46. uint tvalue;         
  47. uchar tflag;//溫度正負(fù)標(biāo)志

  48. void SendData(unsigned char dat);
  49. void SetSendData(unsigned char SetNum);


  50. void delay(i)//延時函數(shù)
  51. {
  52.         uint j;
  53.         for(i;i>0;i--)
  54.         for(j=110;j>0;j--);
  55. }

  56. void Delay_Ms(i){
  57.   delay(i);

  58. }
  59. void Timer2_init()
  60. {
  61.         RCAP2H = (0XFFFF - 50000)/256;
  62.         RCAP2L = (0XFFFF - 50000)%256;
  63.         T2CON =0;
  64.         //T2MOD = 0;
  65.         IE |=0xA0;
  66.         TR2 = 1;
  67. }
  68. void wr_com(uchar ml)//寫命令
  69. {
  70.         lcdrs=0;
  71.         P0=ml;
  72.         delay(5);
  73.         lcden=1;
  74.         delay(5);
  75.         lcden=0;

  76. }



  77. void wr_data(uchar shuju)//寫數(shù)據(jù)
  78. {
  79.         lcdrs=1;
  80.         //lcden=1;
  81.         P0=shuju;
  82.         delay(5);
  83.         lcden=1;
  84.         delay(5);
  85.         lcden=0;

  86. }

  87. void init()  //按照時序操作的初始化
  88. {        
  89.         lcdrw=0;
  90.         wr_com(0x38);//顯示模式設(shè)置,設(shè)置為16*2顯示,5*7點(diǎn)陣,八位數(shù)據(jù)口
  91.         wr_com(0x0c);//開顯示,但不開光標(biāo),光標(biāo)不閃
  92.         wr_com(0x06);//顯示光標(biāo)移動設(shè)置
  93.         wr_com(0x01);// 清屏
  94.         wr_com(0x80);        // 數(shù)據(jù)指針初始化
  95.         for(num=0;num<16;num++)
  96.                 {
  97.                         wr_data(str1[num]);//now temp
  98.                 }
  99.         wr_com(0x80+0x40); //地址初始化
  100.         for(num=0;num<16;num++)
  101.                 {
  102.                         wr_data(str2[num]);//set temp
  103.                 }
  104.         
  105. }

  106. /*************************DS1820程序****************************/
  107. void delay_18B20(unsigned int i)//延時1微秒
  108. {
  109.    while(i--);
  110. }

  111. void ds1820rst(void)/*ds1820復(fù)位*/
  112. {
  113.         unsigned char x=0;
  114.         DQ = 1;          //DQ復(fù)位
  115.         delay_18B20(4); //延時
  116.         DQ = 0;          //DQ拉低
  117.    TR0=0;
  118.         delay_18B20(100); //精確延時大于
  119.    TR0=1;
  120.         DQ = 1;          //拉高
  121.         delay_18B20(40);
  122. }

  123. uchar ds1820rd(void)/*讀數(shù)據(jù)*/
  124. {
  125.         unsigned char i=0;
  126.         unsigned char dat = 0;
  127.    TR0=0;
  128.         for (i=8;i>0;i--)
  129.         {   
  130.                 DQ = 0; //給脈沖信號
  131.                 dat>>=1;
  132.                 DQ = 1; //給脈沖信號
  133.                 if(DQ)
  134.                 dat|=0x80;
  135.                 delay_18B20(10);
  136.         }
  137.    return(dat);
  138. }

  139. void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
  140. {
  141.         unsigned char i=0;
  142.    TR0=0;
  143.    for (i=8; i>0; i--)
  144.    {
  145.                 DQ = 0;
  146.                 DQ = wdata&0x01;
  147.                 delay_18B20(10);
  148.                 DQ = 1;
  149.                 wdata>>=1;
  150.    }
  151. }

  152. uint get_temper()//獲取溫度
  153. {  
  154.      
  155.         uchar a,b;

  156.         ds1820rst();   
  157.         ds1820wr(0xcc);//*跳過讀序列號*/
  158.         ds1820wr(0x44);//*啟動溫度轉(zhuǎn)換*/
  159.         ds1820rst();   
  160.         ds1820wr(0xcc);//*跳過讀序列號*/
  161.         ds1820wr(0xbe);//*讀取溫度*/
  162.         a=ds1820rd();
  163.         b=ds1820rd();
  164.    
  165.         tvalue=b;
  166.         tvalue<<=8;
  167.         tvalue=tvalue|a;
  168.    TR0=1;
  169.    if(tvalue<0x0fff)   tflag=0;
  170.    else {tvalue=~tvalue+1;tflag=1;}
  171.         tvalue=tvalue*(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù)
  172.         temp=tvalue;
  173.         return temp;
  174. }


  175. void dis_temp(int t)//顯示溫度
  176. {
  177.         uchar d0,d1,d2,d3;
  178.         //t=26;
  179.         if(tflag==0)
  180.         {
  181.                 d0=t/1000+0x30;
  182.                 d1=t%1000/100+0x30;
  183.                 d2=t%100/10+0x30;
  184.                 d3=t%10+0x30;
  185.                 if(d0==0x30)
  186.                 {
  187.                         wr_com(0x80+9);
  188.                         wr_data(d1);
  189.                         wr_com(0x80+10);
  190.                         wr_data(d2);
  191.                         wr_com(0x80+11);
  192.                         wr_data(0x2e);
  193.                         wr_com(0x80+12);
  194.                         wr_data(d3);
  195.                         
  196.                         SendData('N');
  197.                         SendData(d1);
  198.                         SendData(d2);
  199.                         SendData('.');
  200.                         SendData(d3);
  201.                         SendData('E');                        
  202.                         SendData('\r');
  203.                 SendData('\n');        
  204.                 }
  205.                 else
  206.                 {
  207.                         wr_com(0x80+9);
  208.                         wr_data(d0);
  209.                         wr_com(0x80+10);
  210.                         wr_data(d1);
  211.                         wr_com(0x80+11);
  212.                         wr_data(d2);
  213.                         wr_com(0x80+12);
  214.                         wr_data(' ');
  215.                         
  216.                         SendData('N');
  217.                         SendData(d0);
  218.                         SendData(d1);
  219.                         SendData(d2);
  220.                         SendData('E');                        
  221.                         SendData('\r');
  222.                 SendData('\n');                                
  223.                
  224.                 }
  225.                
  226.         }
  227.         else
  228.         {
  229.                 wr_com(0x80+9);
  230.                 wr_data('-');
  231.                 wr_com(0x80+10);
  232.                 wr_data(d1);
  233.                 wr_com(0x80+11);
  234.                 wr_data(d2);
  235.                 wr_com(0x80+12);
  236.                 wr_data(' ');
  237.                 //wr_com(0x80+12);
  238.                 //wr_data(d3);
  239.                
  240. //                        SendData('N');
  241. //                        SendData(d1);
  242. //                        SendData(d2);
  243. //                        SendData('E');        
  244. //                        SendData('\r');
  245. //                        SendData('\n');               
  246.         }
  247.         wr_com(0x80+14);
  248.         wr_data(0xdf);
  249.         temper=t/10;
  250. }



  251. void keyscan()//鍵盤掃描
  252. {  

  253.    if(key0==0)
  254.    {
  255.                 delay(1);
  256.                 if(key0==0)
  257.                 {
  258.                         while(!key0);
  259.                         delay(1);
  260.                         while(!key0);
  261.                         set_temper++;

  262.                 }

  263.                 set[0]=set_temper/10;        //獲得設(shè)置溫度顯示值
  264.                 set[1]=set_temper%10;
  265.                 wr_com(0x80+0x40+9);
  266.                 wr_data(table[set[0]]);
  267.                 delay(1);
  268.                 wr_com(0x80+0x40+10);
  269.                 wr_data(table[set[1]]);
  270.                 delay(1);
  271.                 //wr_com(0x80+0x40+11);
  272.                 //wr_data(0x2e);
  273.                 //wr_com(0x80+0x40+14);
  274.                 //wr_data(0xdf);
  275.                 delay(1);
  276.         }
  277.         if(key1==0)
  278.    {
  279.                 delay(3);//延時去抖
  280.                 if(key1==0)
  281.                 {
  282.                         while(!key1);
  283.                         delay(3);
  284.                         while(!key1);
  285.                         set_temper--;//溫度減
  286.                         if(set_temper==0)
  287.                         {set_temper=0;}
  288.                 }

  289.         
  290.                 set[0]=set_temper/10;        //獲得設(shè)置溫度顯示值
  291.                 set[1]=set_temper%10;
  292.                 wr_com(0x80+0x40+9);        //顯示設(shè)置溫度值
  293.                 wr_data(table[set[0]]);
  294.                 delay(1);
  295.                 wr_com(0x80+0x40+10);
  296.                 wr_data(table[set[1]]);
  297.                 delay(1);
  298.                 //wr_com(0x80+0x40+11);
  299.                 //wr_data(0x2e);
  300.                 wr_com(0x80+0x40+14);
  301.                 wr_data(0xdf);
  302.                 delay(1);
  303.         }
  304. }

  305. void PIDInit (struct PID *pp)
  306. {
  307.         memset ( pp,0,sizeof(struct PID)); //用參數(shù)0初始化pp
  308. }



  309. unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) //PID計(jì)算
  310. {
  311.         unsigned int dError,Error;
  312.         Error = pp->SetPoint - NextPoint; // 偏差
  313.         pp->SumError += Error; // 積分
  314.         dError = pp->LastError - pp->PrevError; // 當(dāng)前微分
  315.         pp->PrevError = pp->LastError;
  316.         pp->LastError = Error;
  317.         return (pp->Proportion * Error//比例
  318.         + pp->Integral * pp->SumError  //積分項(xiàng)
  319.         + pp->Derivative * dError); //   微分項(xiàng)
  320. }
  321. /***********************************************************
  322. 溫度比較處理子程序
  323. ***********************************************************/

  324. void compare_temper(void)
  325. {
  326.         unsigned char i;
  327.         if(set_temper>temper)         //設(shè)置溫度大于當(dāng)前溫度
  328.         {
  329.                 buzzer_flag = 0;
  330.                 ledred=0;
  331.                 ledgreen=1;
  332.                 if(set_temper-temper>1)         //溫度相差1度以上
  333.                 {         
  334.                         high_time=100;
  335.                         low_time=0;
  336.                 }
  337.                 else         //設(shè)置溫度不大于當(dāng)前溫度
  338.                 {
  339.                         //模糊計(jì)算
  340.                         fuzzy_engine((set_temper-temper)*10);

  341.                         high_time=(unsigned char)(fuzzy_out*4);
  342.                         if(high_time>100)
  343.                                 high_time = 100;
  344.                         low_time= (100-high_time);
  345.                 }
  346.         }
  347.         else if(set_temper<=temper)         //設(shè)置溫度不大于當(dāng)前溫度
  348.         {
  349.                 buzzer_flag = 1;
  350.                 ledred=1;
  351.                 ledgreen=0;
  352.                 if(temper-set_temper>0) //溫度相差0度以上
  353.                 {
  354.                         high_time=0;
  355.                         low_time=100;
  356.                 }
  357.                 else
  358.                 {  
  359.                         high_time=0;
  360.                         low_time=100;
  361.                 }
  362.         }
  363. }

  364. /*****************************************************
  365. T0中斷服務(wù)子程序,用于控制電平的翻轉(zhuǎn) ,40us*100=4ms周期
  366. ******************************************************/
  367. void serve_T0() interrupt 1 using 1
  368. {
  369.         if(++count<=(high_time))         output=0;
  370.         else if(count<=50)
  371.         {
  372.                 output=1;
  373.         }
  374.         else count=0;
  375.         TH0=0x2f;
  376.         TL0=0x40;
  377. }
  378. void UsarrtInit(){
  379.     SCON = 0x50;            //8-bit variable UART
  380.     TMOD |= 0x20;            //Set Timer1 as 8-bit auto reload mode
  381.     TH1 = TL1 = 0XFD;      //Set auto-reload vaule
  382.     TR1 = 1;                //Timer1 start run
  383.     ES = 1;                 //Enable UART interrupt
  384.     EA = 1;                 //Open master interrupt switch
  385. }

  386. void SendData(unsigned char dat)
  387. {
  388.     while (busy);           //Wait for the completion of the previous data is sent
  389.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  390.     busy = 1;
  391.     SBUF = ACC;             //Send data to UART buffer
  392. }


  393. /*----------------------------
  394. UART interrupt service routine
  395. ----------------------------*/
  396. void Uart_Isr() interrupt 4
  397. {   
  398.         unsigned char a;
  399.         
  400.     if (RI)
  401.     {
  402.         RI = 0;             //Clear receive interrupt flag
  403.         a=SBUF;
  404.                 if(!FinishFlag){
  405.                         
  406.            Usart_Data[UsartCount]=a;
  407.                         
  408.         if(++UsartCount>2){
  409.         UsartCount=0;
  410.                 FinishFlag=1;
  411.         }
  412.                         
  413.                 }else{
  414.                
  415.                
  416.                
  417.                 }


  418.                
  419.     }
  420.     if (TI)
  421.     {
  422.         TI = 0;             //Clear transmit interrupt flag
  423.         busy = 0;           //Clear transmit busy flag
  424.     }
  425. }
  426. void TemSendData(unsigned char SetNum){

  427.         uchar d0,d1,d2,d3;
  428.             if(tflag==0){
  429.                 d0=SetNum/1000+0x30;
  430.                 d1=SetNum%1000/100+0x30;
  431.                 d2=SetNum%100/10+0x30;
  432.                 d3=SetNum%10+0x30;
  433.                
  434.                         if(d0==0x30){
  435.                                 
  436.                         SendData('N');
  437.                         SendData(d1);
  438.                         SendData(d2);
  439.                         SendData('.');
  440.                         SendData(d3);
  441.                         SendData('E');                        
  442.                         SendData('\r');
  443.                 SendData('\n');        
  444.                         
  445.                         }else{
  446.                         SendData('N');
  447.                         SendData(d0);
  448.                         SendData(d1);
  449.                         SendData(d2);
  450.                         SendData('E');                        
  451.                         SendData('\r');
  452.                 SendData('\n');        
  453.                         
  454.                         
  455.                         
  456.                         }        
  457.                 }else{
  458.                
  459.                         SendData('N');
  460.                         SendData(d1);
  461.                         SendData(d2);
  462.                         SendData('E');        
  463.                         SendData('\r');
  464.                         SendData('\n');                                
  465.                
  466.                
  467.                 }





  468. }


  469. void SetSendData(unsigned char SetNum){        
  470.         SendData('S');
  471.         SendData(SetNum/10+48);
  472.         SendData(SetNum%10+48);
  473.         SendData('E');
  474.         SendData('\r');
  475.         SendData('\n');        
  476. }

  477. void LedA_StateData(){
  478.         SendData('L');
  479.         SendData('A');
  480.         if(ledred){
  481.         SendData('1');
  482.         }else{
  483.         SendData('0');
  484.         }
  485.         SendData('E');
  486.         SendData('\r');
  487.         SendData('\n');        
  488. }
  489. void LedB_StateData(){
  490.         SendData('L');
  491.         SendData('B');
  492.         if(ledgreen){
  493.         SendData('1');
  494.         }else{
  495.         SendData('0');
  496.         }
  497.         SendData('E');
  498.         SendData('\r');
  499.         SendData('\n');
  500. }
  501. void USart_Handle(){
  502.       if(FinishFlag){
  503.           if(Usart_Data[0]=='S'){;         
  504.           set_temper=((Usart_Data[1]-48)*10)+(Usart_Data[2]-48);
  505.                   
  506.           }
  507.                   set[0]=set_temper/10;        //獲得設(shè)置溫度顯示值
  508.                 set[1]=set_temper%10;
  509.                 wr_com(0x80+0x40+9);        //顯示設(shè)置溫度值
  510.                 wr_data(table[set[0]]);
  511.                 delay(1);
  512.                 wr_com(0x80+0x40+10);
  513.                 wr_data(table[set[1]]);
  514.                 delay(1);
  515.          
  516.           FinishFlag=0;
  517.           }
  518. }

  519. /***********主函數(shù)**********/

  520. void main(void)
  521. {
  522.         
  523.         unsigned char i;
  524.         init();//LCD初始化
  525.         
  526.         TMOD=0x01;
  527.         TH0=0x2f;
  528.         TL0=0x40;
  529. ……………………

  530. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
本人初學(xué),僅供參考,存在錯誤和不足之處,請大家回帖多多指教,不勝感激.切勿照搬
仿真:無
電路圖:無
Keil代碼下載: 程序.zip (120.62 KB, 下載次數(shù): 80)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本成人午夜影院 | 亚洲精品一区二区另类图片 | 一区二区三区精品视频 | 在线免费观看a级片 | 成人九区| www.日韩| 欧美一区二区三区在线看 | 成人精品毛片 | 成人免费高清 | 亚洲精品一区二区三区四区高清 | 精品一区二区三区在线观看 | 免费一区二区三区 | 狠狠操天天干 | 99只有精品 | 国产一级淫片a直接免费看 免费a网站 | 欧美一区二区 | 中文字幕一区二区三区四区五区 | 国产精品久久久av | 日韩毛片在线免费观看 | 在线观看亚洲精品视频 | 91在线一区 | 91视视频在线观看入口直接观看 | 国产精品一区三区 | 亚洲国产成人av好男人在线观看 | 国产日韩欧美一区 | 91精品久久久久久久久久入口 | 我要看免费一级毛片 | 一级毛片成人免费看a | 久久久高清 | 伊人伊成久久人综合网站 | 欧美精品一二三区 | 99精品国产成人一区二区 | 91久久精品一区二区二区 | 亚洲视频一区 | 午夜黄色| 中文久久| 永久av | 亚洲一区自拍 | 瑟瑟视频在线看 | 国产日韩精品一区 | 91免费在线看 |