找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1249|回复: 0
收起左侧

基于单片机的模糊PID温度控制装置源程序设计

[复制链接]
ID:686752 发表于 2023-5-15 16:34 | 显示全部楼层 |阅读模式
随着电子技术的不断发展,传统的温度控制方式已经越来越不能满足工业现场的需求,这时,PID控制凭借其算法简单、适应性强的特性,在工业过程控制中得到了广泛的应用。但PID控制无法应用于滞后性大、控制对象复杂的系统中,尤其是控制精度要求高的温度控制系统。而将智能控制中的模糊控制与PID控制相结合的方法,使系统不仅有PID控制的优点也具有智能控制的优点,这样极大消除了传统PID控制的缺点,这样的控制方式有着广阔的发展前景。
基于以上叙述,本设计基于PID控制原理,结合模糊控制理论,对模糊PID参数自整定算法在温度控制系统中的应用进行了研究。本设计采用AT89C52单片机作为该装置的核心处理器,DS18B20作为温度传感器,LCD1602作为显示装置。
本设计完成了基于单片机的模糊PID温度控制装置设计的硬件设计和软件设计,并利用MATLAB软件中Simulink自带的模糊工具箱完成了仿真测试实验,实验结果表明,模糊PID控制算法相比于传统PID控制算法具有响应速度更快,超调量几乎为零等优点,可应用于复杂的温度控制系统中。

单片机源程序如下:

  1. //-----------定义模糊系统参数-----------------------------------------------------------
  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. //-----------定义模糊系统参数-----------------------------------------------------------
  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;  //当前水位,  水位上限,下限,  设置项变量,50ms变量   ,cs 为计次数变量    ,
  22. bit beep1,zt,s1;          //报警标志位,   工作模式标志位,   闪烁标志位

  23. int Temperature;



  24. //-----------定义模糊系统参数-----------------------------------------------------------
  25. //------------------------------------------------------------------------------------
  26. //-------------定义常量----------------------------------------------------------------
  27. #define MU_MAX 0XFF            //模糊度的最大值为0XFF代表面1
  28. #define RULE_TOT 10            //规则数个数
  29. #define MF_TOT 5               //成员函数的个数
  30. #define IO_NUM 0x07
  31. #define LABEL_NUM 0x70
  32. #define DEFAULT_VALUE 0x00
  33. //----------------定义数据库-----------------------------------------------------------
  34. unsigned char code output_memf[MF_TOT]={0, 15, 35, 60, 102};// OUTPUT TURNING NUMBER:
  35.                                                             // ZERO, VSMALL, SMALL, MEDIUM, BIG
  36.                                                             // 输入功能函数以点斜式方式存储. 第一维成员函数标号第二维是点斜式数据
  37. unsigned char code input_memf[MF_TOT][4]={                  //距离功能函数
  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. //-----------定义模糊系统参数-----------------------------------------------------------
  45. //------------------------------------------------------------------------------------
  46. //-----------定义模糊系统规则-----------------------------------------------------------
  47. unsigned char code rules[RULE_TOT]={
  48.                                         // if...  then...   规则
  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. //-----------定义模糊系统参数-----------------------------------------------------------
  56. //------------------------------------------------------------------------------------
  57. //-----------定义各变量-----------------------------------------------------------------
  58. unsigned char outputs[MF_TOT],fuzzy_out;  //模糊输出mu值
  59. //-----------子程序函数头申明-----------------------------------------------------------
  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;              // 用点斜式计算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.              {                     // 如果结果不超过1
  87.                 return temp;       // 返回计算结果
  88.              }
  89.              else
  90.              {
  91.                 return MU_MAX;     // 确保mu值在范围内
  92.              }
  93.         }
  94.         else
  95.         {                           // 输入落在第二条斜线上
  96.             temp=input;               // 用点斜式方法计算 mu
  97.             temp-=input_memf[label][2];
  98.             temp*=input_memf[label][3];
  99.             temp=MU_MAX-temp;
  100.             if (temp < 0)
  101.             {                      // 确保结果不小于0
  102.                   return 0;
  103.             }
  104.             else
  105.             {
  106.                   return temp;        // mu为正 – 返回结果
  107.             }
  108.         }
  109.     }
  110.     return 0;
  111. }
  112. /*******************************************************************************
  113. Function: defuzzify 解模糊
  114. Description: 计算模糊输出的重心并调用函数把它
  115.              转换成可被系统使用的输出量
  116. Parameters: 无.
  117. Returns: 无.
  118. Side Effects: outputs[][] 数组被清零.
  119. *******************************************************************************/
  120. void defuzzify(void)
  121. {
  122.     unsigned long numerator, denominator;
  123.     unsigned char j;
  124.     numerator=0;                         // 恢复总数值
  125.     denominator=0;
  126.     for (j=0; j<MF_TOT; j++)
  127.     {                                // 计算总和值
  128.         numerator+=(outputs[j]*output_memf[j]);
  129.         denominator+=outputs[j];
  130.         outputs[j]=0;                        // 清零输出作为参考使用
  131.         if (denominator)
  132.         {                                     // 确保分母是0的情况不发生
  133.             fuzzy_out=numerator/denominator;  // 确定 COG
  134.         }
  135.         else
  136.         {
  137.             fuzzy_out=DEFAULT_VALUE;         // 没有规则被触发
  138.         }
  139.     }
  140. }
  141. /*******************************************************************************
  142. Function: fuzzy_engine
  143. Description: 实施规则基中的规则
  144. Parameters: 无
  145. Returns: 无.
  146. Side Effects: 无
  147. ********************************************************************************/
  148. unsigned char bdata clause_val;                        // 保存当前的分支进行快速访问
  149. sbit clause_type = clause_val^7;                       // 表示分支是否是条件分支或者是结果分支
  150. void fuzzy_engine(uchar input)
  151. {
  152.     bit then;                                       // 当正在分析结果时置位
  153.     unsigned char if_val,                           // 保存当前规则中条件分支中的值
  154.                   clause,                           // 规则基中当前的分支
  155.                       mu,                           // 保存当前分支中的值
  156.                  label=0;                           // 被条件使用的成员函数
  157.                   then=0;                           // 设第一个分支是条件分支
  158.            if_val=MU_MAX;                           // max out mu for the first rule
  159.     for (clause=0; clause<RULE_TOT; clause++)
  160.     {                                               // 遍历每条规则
  161.         clause_val=rules[clause];                   // 读入当前的分支
  162.         if (!clause_type)
  163.         {                                           // 当前的分支是不是条件分支
  164.             if (then)
  165.             {                                       // 是否正在分析结果...
  166.                 then=0;
  167.                 if_val=MU_MAX;                      // 复位mu
  168.             }
  169.             mu=compute_memval(input, label);        // 得到条件分支的值
  170.             if_val=mu;
  171.             label++;
  172.         }
  173.         else
  174.         {                                       // 当前分支是结果
  175.             then=1;            // 置位标志位,如果当前规则的mu比参考的值要大,保存这个值作为新的模糊输出
  176.             if (outputs[clause_val&0x07] < if_val)
  177.             {
  178.                 outputs[clause_val&0x07]=if_val;
  179.             }
  180.         }
  181.     }
  182.     defuzzify(); // 用COG方法计算模糊输出和反模糊输出
  183. }
复制代码


  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; // 设定目标 Desired Value
  9. unsigned int Proportion; // 比例常数 Proportional Const
  10. unsigned int Integral; // 积分常数 Integral Const
  11. unsigned int Derivative; // 微分常数 Derivative Const
  12. unsigned int LastError; // Error[-1]  当前偏差
  13. unsigned int PrevError; // Error[-2]   上一次偏差
  14. unsigned int SumError; // Sums of Errors 累计偏差
  15. };
  16. struct PID spid; // PID Control Structure
  17. unsigned int rout; // PID Response (Output) 响应输出
  18. unsigned int rin; // PID Feedback (Input)//反馈输入
  19. unsigned char high_time,low_time,count=0;//占空比调节参数

  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与单片机连接口
  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;//转换后的温度

  46. uint tvalue;         
  47. uchar tflag;//温度正负标志

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


  50. void delay(i)//延时函数
  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)//写数据
  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);//显示模式设置,设置为16*2显示,5*7点阵,八位数据口
  91.         wr_com(0x0c);//开显示,但不开光标,光标不闪
  92.         wr_com(0x06);//显示光标移动设置
  93.         wr_com(0x01);// 清屏
  94.         wr_com(0x80);        // 数据指针初始化
  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复位*/
  112. {
  113.         unsigned char x=0;
  114.         DQ = 1;          //DQ复位
  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)/*读数据*/
  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)/*写数据*/
  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);//*启动温度转换*/
  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);//温度值扩大10倍,精确到1位小数
  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;        //获得设置温度显示值
  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;        //获得设置温度显示值
  291.                 set[1]=set_temper%10;
  292.                 wr_com(0x80+0x40+9);        //显示设置温度值
  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)); //用参数0初始化pp
  308. }



  309. unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) //PID计算
  310. {
  311.         unsigned int dError,Error;
  312.         Error = pp->SetPoint - NextPoint; // 偏差
  313.         pp->SumError += Error; // 积分
  314.         dError = pp->LastError - pp->PrevError; // 当前微分
  315.         pp->PrevError = pp->LastError;
  316.         pp->LastError = Error;
  317.         return (pp->Proportion * Error//比例
  318.         + pp->Integral * pp->SumError  //积分项
  319.         + pp->Derivative * dError); //   微分项
  320. }
  321. /***********************************************************
  322. 温度比较处理子程序
  323. ***********************************************************/

  324. void compare_temper(void)
  325. {
  326.         unsigned char i;
  327.         if(set_temper>temper)         //设置温度大于当前温度
  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         //设置温度不大于当前温度
  338.                 {
  339.                         //模糊计算
  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)         //设置温度不大于当前温度
  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中断服务子程序,用于控制电平的翻转 ,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;        //获得设置温度显示值
  508.                 set[1]=set_temper%10;
  509.                 wr_com(0x80+0x40+9);        //显示设置温度值
  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. /***********主函数**********/

  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黑下载附件…………
复制代码
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,不胜感激.切勿照搬
仿真:无
电路图:无
Keil代码下载: 程序.zip (120.62 KB, 下载次数: 72)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表