⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 这是一个51系列单片机控制加热温度的程序
💻 LST
字号:
C51 COMPILER V7.50   MAIN                                                                  08/18/2007 15:46:46 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          #include <absacc.h>
   4          #include "define.h"
   5          #include "delay.h"
   6          #include "da0832.h"
   7          #include "DS18B20_5.h"
   8          #include "lcd1602.h"
   9          #include "zlg.h"
  10          #define PMAX 100
  11          #define PMIN 0
  12          typedef struct
  13          {
  14                  char kp,ki,kd;
  15                  int e2,e1,e0;
  16                  long  pa,vpa;
  17          }mypid;
  18          mypid p1;
  19          int final_tem,cur_tem;
  20          //uchar point_on;
  21          
  22          //sbit point0=P1^3;
  23          //sbit pout=P1^4;
  24          #define Time_Unit 80
  25          uchar num_unit=0;
  26          uint num100unit=0;
  27          int2char pwm_dtime;
  28          uchar Action();//执行控制量
  29          uint Set_Tem4();//设定4位的温度值
  30          int PID();//增量式pid算法,输出为控制量增量p1.vpa 和 p1.pa
  31          void main()
  32          {
  33   1              uchar keyv;
  34   1              Lcd_Initial();
  35   1              Key_Initial();
  36   1              p1.kp=50;//pid参数设置
  37   1              p1.ki=10;
  38   1              p1.kd=5;
  39   1      
  40   1              da_1=0;
  41   1              final_tem=Set_Tem4();//设定温度
  42   1              p1.pa=0;
  43   1              p1.e2=0;
  44   1              p1.e1=0;
  45   1              p1.e0=0;
  46   1              //point_on=100;//不导通
  47   1      
  48   1              TR0=0;//开定时器0       
  49   1              TMOD=0x11;
  50   1              TH0=0xff;
  51   1              TL0=0xe0;
  52   1              TR0=1;
  53   1              IE=IE|0x02;
  54   1              EA=1;
  55   1              num_unit=0;
C51 COMPILER V7.50   MAIN                                                                  08/18/2007 15:46:46 PAGE 2   

  56   1      
  57   1              //=======================以上为始化
  58   1              while(1)
  59   1              {
  60   2                      if(key)//查询按键
  61   2                      {
  62   3                              keyv=Keyscan();
  63   3                              if(keyv==15)
  64   3                              {       
  65   4                                      da_1=0;
  66   4                                      final_tem=Set_Tem4();//设定温度
  67   4                                      p1.pa=0;
  68   4                                      p1.e2=0;
  69   4                                      p1.e1=0;
  70   4                                      p1.e0=0;
  71   4                                      //point_on=100;//不导通
  72   4                              }
  73   3                              else if(keyv==14)//停止加热
  74   3                              {
  75   4                                      EA=0;
  76   4                                      //pout=0;
  77   4                                      da_1=0;
  78   4                              }
  79   3                      }
  80   2                      if((num100unit&0x00ff)==0)//2.56s为周期
  81   2                      {
  82   3                              Lcd_Puts(1,0,"aim_tem:");
  83   3                              Lcd_Putfloat(9,0,3,1,final_tem);
  84   3                              cur_tem=GetTemperature();//读取当前温度值并显示
  85   3                              Lcd_Puts(1,1,"now_tem:");
  86   3                              Lcd_Putfloat(9,1,3,1,cur_tem);
  87   3                              PID();//pid控制
  88   3                              Action();//控制执行
  89   3                      }
  90   2              }
  91   1      }
  92          uint Set_Tem4()//设定4位的温度值
  93          {
  94   1              uchar a,b,c,d;
  95   1              Lcd_Clr();
  96   1              Lcd_Puts(1,0,"set Tem:");
  97   1              while(!key);
  98   1              a=Keyscan();
  99   1              Lcd_Putint(10,0,1,a);
 100   1              while(!key);
 101   1              b=Keyscan();
 102   1              Lcd_Putint(11,0,1,b);
 103   1              while(!key);
 104   1              c=Keyscan();
 105   1              Lcd_Putint(12,0,1,c);
 106   1              while(!key);
 107   1              d=Keyscan();
 108   1              Lcd_Putint(13,0,1,d);
 109   1              return (a*1000+b*100+c*10+d);   
 110   1      }
 111          
 112          void Int_T0()interrupt 1 using 2 //ie0x02//TMOD=0x11;
 113          {
 114   1              EA=0;
 115   1              TR0=0;  
 116   1              pwm_dtime.time=0xffff-Time_Unit;
 117   1              TH0=pwm_dtime.hl[0];
C51 COMPILER V7.50   MAIN                                                                  08/18/2007 15:46:46 PAGE 3   

 118   1              TL0=pwm_dtime.hl[1];//定时us
 119   1              TR0=1;//开定时器0
 120   1              //t0f=1;//标志置1
 121   1              /*if(point0==0)//查询到0点
 122   1              {
 123   1                      num_unit=0;
 124   1              }*/
 125   1              if(num_unit==100)
 126   1              {
 127   2                      num_unit=0;
 128   2                      num100unit++;
 129   2              }
 130   1              /*if(num_unit==0)//0点不导通
 131   1              {
 132   1                      pout=0;
 133   1              }
 134   1              if(num_unit==point_on)//导通点
 135   1              {
 136   1                      pout=1;
 137   1              }*/
 138   1              num_unit++;
 139   1              EA=1;
 140   1      }
 141          int PID()//增量式pid算法,输出为控制量增量p1.vpa 和 p1.pa
 142          {
 143   1              p1.e2=final_tem - cur_tem;
 144   1              p1.vpa=p1.kp*((long)p1.e2-p1.e1)
 145   1                              +p1.ki*(long)p1.e2
 146   1                              +p1.kd*((long)p1.e2+p1.e0-2*p1.e1);
 147   1              p1.e1=p1.e2;
 148   1              p1.e0=p1.e1;
 149   1              p1.pa+=p1.vpa;
 150   1      }
 151          uchar Action()//执行控制量
 152          {
 153   1              long temp;
 154   1              if(p1.pa>0)//控制量大于0
 155   1              {
 156   2                      temp=p1.pa;
 157   2                      temp=temp>>5;
 158   2                      if(temp>PMAX)//完全导通
 159   2                      {
 160   3                              //point_on=0;
 161   3                              da_1=255;
 162   3                      }
 163   2                      else if(temp<PMIN)//完全截至
 164   2                      {
 165   3                              //point_on=100;
 166   3                              da_1=0;
 167   3                      }
 168   2                      else
 169   2                      {
 170   3                              //point_on=100*(PMAX-temp)/(PMAX-PMIN);
 171   3                              da_1=255*temp/(PMAX-PMIN);
 172   3                      }
 173   2              }
 174   1              else 
 175   1              {
 176   2                      //point_on=100;//完全截至
 177   2                      da_1=0;
 178   2              }
 179   1              return 1;
C51 COMPILER V7.50   MAIN                                                                  08/18/2007 15:46:46 PAGE 4   

 180   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1955    ----
   CONSTANT SIZE    =     29    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     36      49
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -