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

📄 37.lst

📁 基于C8051F系列单片机的温度控制程序,可供参考使用
💻 LST
字号:
C51 COMPILER V7.10   37                                                                    06/18/2007 10:36:06 PAGE 1   


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

line level    source

   1           /*******************************************************************
   2          **************重庆东电通信有限公司***************
   3          文件名:SWS—3000加热软件(适用于双面加热)
   4          版本:V3.5
   5          编写:刘贤曙
   6          创建日期:2006.10.7
   7          2006.10.31调试OK
   8          *******************************************************************/
   9          #include<reg52.h>
  10          #include<intrins.h>
  11          #include<math.h>
  12          #define uchar unsigned char
  13          #define uint unsigned int
  14          
  15          /********************以下是I2C通信定义******************/
  16          uchar  RCV_WD[8]  = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  17          uchar SEND_WD[8] =  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  18          #define SLVADR     0x40            //本机地址
  19          union
  20          {
  21                  uint I2c_STemperature;
  22                  uchar STemperature[2];
  23          }byte;
  24          
  25          #define TPL     RCV_WD[0]               //主机发来的目标温度低位--02h
  26          #define TPH     RCV_WD[1]               //主机发来的目标温度高位--01h
  27          #define FLOW    RCV_WD[2]               //主机发来的流量ml/min    --03h
  28          #define CWD     RCV_WD[3]               //主机发来的命令字-  -00h
  29          //#define         RCV_WD[4]     //保留
  30          //#define         RCV_WD[5]     //保留
  31          //#define         RCV_WD[6]     //保留
  32          //#define         RCV_WD[7]     //保留
  33          #define RTPL    SEND_WD[0]              //从机发送的适时温度低位--01h
  34          #define RTPH    SEND_WD[1]              //从机发送的适时温度高位----00h
  35          //#define         SEND_WD[2]    //保留
  36          //#define         SEND_WD[3]    //保留
  37          //#define         SEND_WD[4]    //保留
  38          //#define         SEND_WD[5]    //保留
  39          //#define         SEND_WD[6]    //保留
  40          //#define         SEND_WD[7]    //保留
  41          #define  nop    _nop_()
  42          uchar reg_adr;                  //地址偏移量
  43          sbit SDA   = P3^5;              //模拟I2C数据传送位
  44          sbit SCL   = P3^3;              //模拟I2C时钟控制位
  45          sbit K_INT = P3^4;
  46          bit  slv;                       //I2c数据控制状态标志位,0为发送,1为接收
  47          bit  DATOK_FLAG;                //数据接收完标志
  48          bit  int1bz;                                    //int1执行标志
  49          /*******以下是AD转换定义************/
  50          
  51          sbit AD7705_CLK  = P1^3;                //AD7705串行时钟
  52          sbit AD7705_DIN  = P1^4;                //AD7705数据输入端
  53          sbit AD7705_DOUT = P1^5;                //AD7705数据输出端
  54          sbit AD7705_DRDY = P3^2;                //AD770准备好信号
  55          sbit AD7705_REST = P1^2;                //AD7705复位信号,低电平复位
C51 COMPILER V7.10   37                                                                    06/18/2007 10:36:06 PAGE 2   

  56          sbit Door        = P1^7;                //AD结果和环境温度显示转换开关
  57          /*********以下是环境温度采集及加热板温度采集定义*********/
  58          
  59          sbit DQ    = P1^6;
  60          /**************以下是PID调节定义************/
  61          
  62          uchar   Kp;                                                     //PID调节比例系数
  63          #define T_C  2                                                          //采样周期
  64          float   error;                                                          //当前偏差
  65          float   last_error;                                                     //上一次偏差
  66          float   sum_error;                                                      //偏差累加和
  67          float   P_out,I_out,D_out,PWM_0;                                        //比例项/积分项/微分项
  68          float   T_target=0.0;                                                   //目标温度
  69          float   T_real = 0.0;                                                   //当前温度
  70          float   PWM    = 0;                                                     //输出量
  71          float   Ki     = 0;                                                     //PID调节积分系数
  72          float   SV=0;
  73          float   Kd     = 0;
  74          #define Ti_H  50
  75          #define Td_H   45                                                       //PID调节微分系数
  76          #define Ti_L   50                                                       //积分时间常数
  77          #define Td_L   45                                                       //微分时间常数
  78          uint    TC_CNT = 0;
  79          uchar   TC_zhi=0;                                                               //采样周期计数器
  80          uchar   PWM_CNT= 0 ;
  81          uchar   Per = 0;                                        //t:占空比计数器; per:输出百分比
  82          sbit    LED2   = P2^3;                                                  //加热状态?灯亮表示正在加热,灯灭表示停止加热
  83          sbit    LED3   = P2^4;                                                  //通信指示,灯亮表示正在通信
  84          sbit    PID_SW   = P1^0;                                                //加热控制执行
  85          sbit    sanre    = P1^1;                                                //散热风扇控制
  86          bit     PID_flag = 0;                                                   //PID运算允许标志
  87          //bit   sanre_flag;
  88          bit     First_flag=0;
  89          bit     End_flag=0;
  90          bit     DY_flag=0;
  91          /**********微秒延时函数********/
  92          void delay_US(uchar i)
  93          {
  94   1          while(i--);
  95   1      }
  96          /****************************************************
  97          *函数原形: void Write_7705(uchar word)
  98          *功能: 写AD7705
  99          *参数: AD7705控制命令
 100          *返回值:无
 101          ****************************************************/
 102          void Write_7705(uchar Byte)
 103          {
 104   1          uchar i;
 105   1          AD7705_CLK  = 1;
 106   1          for(i=8;i>0;i--)
 107   1           {
 108   2              if(Byte&0x80)   AD7705_DIN = 1;
 109   2              else            AD7705_DIN = 0;
 110   2              AD7705_CLK = 1;
 111   2              nop;
 112   2              AD7705_CLK = 0;
 113   2              nop;
 114   2              AD7705_CLK = 1;
 115   2              Byte <<= 1;
 116   2           }
 117   1          AD7705_CLK = 1;
C51 COMPILER V7.10   37                                                                    06/18/2007 10:36:06 PAGE 3   

 118   1          nop;
 119   1          AD7705_DIN = 0;
 120   1      }
 121          
 122          /****************************************************
 123          **函数原形:uint Read_7705()
 124          **功能:读AD7705转换后数据
 125          **参数:无
 126          **返回值:转换结果
 127          *****************************************************/
 128          
 129          uint Read_7705(void)
 130          {
 131   1         uchar i,j,k=4;
 132   1         uint AD_data=0x0000;
 133   1         long int  sum_data=0;
 134   1         for(j=0;j<8;j++)
 135   1         {
 136   2            Write_7705(0x38);
 137   2            AD7705_CLK=1;
 138   2            while(AD7705_DRDY==1)
 139   2                       { delay_US(100);
 140   3                          k-- ;
 141   3                         if(!k) break;
 142   3                       }
 143   2            for(i=16;i>0;i--)
 144   2                {
 145   3                        AD_data=AD_data<<1;
 146   3                        AD7705_CLK=0;
 147   3                        nop;
 148   3                        AD7705_DOUT=1;
 149   3                        if(AD7705_DOUT)       AD_data|=0x0001;
 150   3                        else                  AD_data|=0x0000;
 151   3                        AD7705_CLK=1;
 152   3                }
 153   2                AD7705_CLK=1;
 154   2                nop;
 155   2                AD7705_DIN=1;
 156   2                sum_data+=AD_data;
 157   2                AD_data=0x0000;
 158   2         }
 159   1              AD_data=sum_data>>3;
 160   1              return(AD_data);
 161   1      }
 162          
 163          /*******************************************************
 164          **函数原形: void Init_7705(void)
 165          **功能:初始化AD7705,设置为20HZ更新率、双极性、自校准、增益128
 166          **参数:无
 167          **返回值:无
 168          *********************************************************/
 169          
 170          void Init_7705(void)    //初始化7705
 171          
 172          {
 173   1            uchar i;
 174   1            AD7705_CLK=1;
 175   1            nop;
 176   1            AD7705_DIN=1;
 177   1            for (i=0;i<40;i++) // AD7705复位
 178   1              {
 179   2               AD7705_CLK=0;
C51 COMPILER V7.10   37                                                                    06/18/2007 10:36:06 PAGE 4   

 180   2               nop;
 181   2               AD7705_CLK=1;
 182   2              }
 183   1            Write_7705(0x20);    //写通信寄存器设置通道1 选择下一个操作是写时钟寄存器
 184   1            Write_7705(0x04);    //写时钟寄存器设置更新速率为20Hz
 185   1            Write_7705(0x10);    //通道1 ,下一个写设置寄存器
 186   1            Write_7705(0x7a);    //写设置寄存器,设置成双极性、增益为128、自校准
 187   1       }
 188          
 189          /********************************************************
 190          **
 191          **环境温度采集
 192          **
 193          **
 194          ********************************************************/
 195          
 196          Init_DS18B20(void)
 197          {
 198   1          uchar x = 0;
 199   1          DQ = 1;             //DQ复位
 200   1          delay_US(8);
 201   1          DQ = 0;             //拉低
 202   1          delay_US(80);       //延时 480us
 203   1          DQ = 1;             //拉高总线
 204   1          delay_US(14);       //稍延时后 如果DQ=0则初始化成功 DQ=1则初始化失败
 205   1          x  = DQ;
 206   1          delay_US(20);
 207   1      }
 208          
 209          /*******************************************************
 210          **函数原形:Read_byte(void )
 211          **函数功能:读18B20一个字节
 212          **参数:无
 213          **返回值:读出的数据
 214          ********************************************************/
 215          
 216          Read_byte(void )
 217          {
 218   1              uchar i = 0,dat = 0;
 219   1              for (i=8;i>0;i--)
 220   1                {
 221   2                  DQ  =   0; // 给脉冲信号
 222   2                  dat >>= 1;
 223   2                  DQ  =   1; // 给脉冲信号
 224   2                  if(DQ)
 225   2                  dat |=  0x80;
 226   2                  delay_US(4);
 227   2                }
 228   1              return(dat);
 229   1      }
 230          
 231          /*******************************************************
 232          **函数原形:void Write_byte(uchar dat)
 233          **函数字功能:向DS18B20写入命令
 234          **参数:命令数据
 235          **返回值:无
 236          ********************************************************/
 237          
 238          void Write_byte(uchar dat)
 239          {
 240   1         uchar i = 0;
 241   1          for (i=8; i>0; i--)
C51 COMPILER V7.10   37                                                                    06/18/2007 10:36:06 PAGE 5   

 242   1           {
 243   2              DQ  = 0;
 244   2              DQ  = dat&0x01;
 245   2              delay_US(5);
 246   2              DQ  = 1;
 247   2              dat >>= 1;
 248   2           }
 249   1      }
 250          
 251          /*******************************************************
 252          **函数原形:uint Read_Temp_surr(void)
 253          **函数功能:读取DS18B20数据并计算出温度
 254          **参数:无
 255          **返回值:温度
 256          ********************************************************/
 257          
 258          uint Read_Temp_surr(void)
 259          {
 260   1        uchar th=0,tl=0;
 261   1        uint temp=0;
 262   1        EA=0;   //禁T0中断
 263   1        Init_DS18B20();
 264   1        Write_byte(0xCC); // 跳过读序号列号的操作
 265   1        Write_byte(0x44); // 启动温度转换
 266   1        Init_DS18B20();
 267   1        Write_byte(0xCC); //跳过读序号列号的操作
 268   1        Write_byte(0xBE); //读取温度寄存器
 269   1        tl=Read_byte();       //低字节
 270   1        th=Read_byte();       //高字节
 271   1        EA=1;
 272   1        temp=(uint)((th*256+tl)/16.0*10);
 273   1        return  temp;
 274   1      }
 275          
 276          /***************************************
 277                     定时器初始化
 278          ****************************************/
 279          
 280          void T_Init()
 281          {
 282   1              TMOD = 0xe1 ;                   //定时器工作方式:定时器1外控、计数方式2,定时器0、方式1
 283   1              IE   = 0x0a ;                   //开外中断INT0
 284   1              PT1  = 1 ;                      //定时器1中断优先
 285   1              TH1  = 0x0ff ;
 286   1              TL1  = 0x0ff ;
 287   1              TH0  = 0xd8;                    //定时初值10MS
 288   1          TL0  = 0xef;
 289   1              nop;
 290   1              EA   = 1 ;                      //总中断开放
 291   1              TR1  = 1 ;                      //启动T1
 292   1      }
 293          
 294           /*****************************************************
 295           **函数原形

⌨️ 快捷键说明

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