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

📄 tcmain.lst

📁 温度控制器 显示为三个共阳极LED 温度传感器用单总线DS18B20 CPU为89C51
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   TCMAIN                                                                01/06/2008 17:24:20 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TCMAIN
OBJECT MODULE PLACED IN TCMain.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil51\C51\BIN\C51.EXE TCMain.c BROWSE DEBUG OBJECTEXTEND SRC(.\TCMain.SRC)

stmt level    source

   1          /*-------------------------------
   2          温度控制器
   3          显示为三个共阳极LED
   4          温度传感器用单总线DS18B20
   5          CPU为89C51,三个按键,分别为UP,DOWN,SET
   6          2个检测,
   7          温度调节上限为125度,下限为-55度
   8          -------------------------------*/
   9          
  10          #include <AT89X51.H>
  11          #include <intrins.h>
  12          #define Key_ONE           p3_2    //检测1路
  13          #define Key_TWO           p3_3    //检测2路
  14          #define Key_UP            P3_4    //上调温度
  15          #define Key_DOWN          P3_5    //下调温度
  16          #define Key_SET           P3_6    //设定键(温度设定,长按开电源)
  17          #define RelayOutPort      P1_5    //继电器输出(加温)
  18          #define RelayOutfan       P1_6    //继电器输出(风扇)
  19          #define RelayOutsignal    P1_7    //给节电器信号
  20          #define LEDPort           P0      //LED控制口
  21          #define LEDOneC           P2_0    //LED DS1控制(百位)
  22          #define LEDTwoC           P2_1    //LED DS2控制(十位)
  23          #define LEDThreeC         P2_2    //LED DS3控制(个位)
  24          #define LEDhigh           P1_0    //LED高温指示灯
  25          #define LEDlow            P1_1    //LED低温指示灯
  26          #define LEDmalfunction    P1_2    //LED故障指示灯
  27          #define TMPort                P3_0    //DS1820 DataPort温度
  28          
  29          unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //0-9的LED笔划,
             -0xFF为空,0xF7为负号
  30          
  31          static unsigned char bdata StateREG;   //可位寻址的状态寄存器
  32          sbit DS1820ON = StateREG^0;                //DS1820是否存在
  33          sbit SetTF = StateREG^1;               //是否是在温度设置状态
  34          sbit KeySETDown = StateREG^2;          //是否已按过SET键标识
  35          sbit PowTF = StateREG^3;               //电源标识
  36          sbit KeyTF = StateREG^4;                           //键盘是否允许
  37          
  38          //sbit KeySETDowning = StateREG^5;                              //SET是否正在按下
  39          static unsigned char bdata TLV _at_ 0x0029;         //温度变量高低位
  40          static unsigned char bdata THV _at_ 0x0028;
  41          static signed char TMV;                             //转换后的温度值
  42          static unsigned char KeyV,TempKeyV;                 //键值
  43          static signed char TMRomV _at_ 0x0027;              //高温限制
  44          static signed char TMSetV _at_ 0x0026;              //温度设定值
  45          static unsigned char KSDNum;                        //SET键连按时的采集次数
  46          static unsigned char IntNum2,IntNum3;               //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定
             -状态时LED闪烁
  47          static signed char LED_One,LED_Two,LED_Three;       //LED的显示位 LED_One为十位,LED_Two为个位
  48          static unsigned char Sign;                          //负号标识
  49          
  50          static unsigned char  T10Stimes0;
  51          static unsigned char  T10Stimes1;
  52          static unsigned char  INTF0;
  53          static unsigned char  INTF1;
C51 COMPILER V7.06   TCMAIN                                                                01/06/2008 17:24:20 PAGE 2   

  54          void int_0(void);       //外部中断0
  55          void int_1(void);       //外部中断1
  56          
  57          void main(void)
  58          {
  59   1              void InitDS1820(void);   //定义函数
  60   1              void ROMDS1820(void);
  61   1              void TMVDS1820(void);
  62   1              void TMRDS1820(void);
  63   1              void TMWDS1820(void);
  64   1              void TMREDS1820(void);
  65   1              void TMERDS1820(void);
  66   1              void ReadDS1820(void);
  67   1              void WriteDS1820(void);
  68   1              void Delay_510(void);
  69   1              void Delay_110(void);
  70   1              void Delay_10ms(void);
  71   1              void Delay_4s(void);
  72   1              void V2ToV(void);
  73   1      
  74   1              StateREG = 0;    //初始化变量
  75   1              SetTF = 1;      
  76   1              PowTF = 0;               //开电源
  77   1          SetTF = 0;
  78   1              THV = 0;
  79   1              TLV = 0;
  80   1              TMV = 0;
  81   1              KeyV = 0;
  82   1              TempKeyV = 0;
  83   1              KSDNum = 0;
  84   1              //IntNum = 0;
  85   1              IntNum2 = 0;
  86   1              IntNum3 = 0;
  87   1              LED_One = 0;
  88   1              LED_Two = 0;
  89   1      
  90   1              InitDS1820();     //初始化
  91   1              ROMDS1820();      //跳过ROM
  92   1              TMERDS1820();     //E2PRAM中温度上限值调入RAM
  93   1              InitDS1820();     //初始化
  94   1              ROMDS1820();      //跳过ROM
  95   1              TMRDS1820();      //读出温度指令
  96   1              ReadDS1820();     //读出温度值和上限值
  97   1              TMSetV = TMRomV;  //拷贝保存在DS18B20ROM里的上限值到TMSetV
  98   1      
  99   1      T10Stimes0 = 0;
 100   1      T10Stimes1 = 0;
 101   1      EX0 = 1;
 102   1      IT0 = 0;
 103   1      EX1 = 1;
 104   1      IT1 = 0;
 105   1              ET0 = 1;              //定时器0中断打开
 106   1      ET1 = 1;
 107   1      //      TMOD = 0x1;               //设定时器0为模式1,16位模式
 108   1      TMOD = 0x11;
 109   1      TH1=0x3C;
 110   1      TL1=0xB0;             //定时50ms
 111   1              TH0=0xB1;
 112   1              TL0=0xDF;                 //设定时值为20000us(20ms)
 113   1              EA = 1;               //允许CPU中断
 114   1              TR0 = 1;                  //开始定时
 115   1      TR1 = 1;
C51 COMPILER V7.06   TCMAIN                                                                01/06/2008 17:24:20 PAGE 3   

 116   1              while(1);
 117   1      }
 118          
 119          void int_0(void) interrupt 0 using 0
 120          {
 121   1          EX0 = 0;            //关外部中断0
 122   1          T10Stimes0 = 0xC8;  //200次,共10s
 123   1          INTF0 = 1;          //置位检测标志
 124   1      }
 125          void int_1(void) interrupt 2 using 1
 126          {
 127   1          EX1 = 0;
 128   1          T10Stimes1 = 0xC8;
 129   1              INTF1 = 1;
 130   1      }
 131          void timer_1(void) interrupt 3 using 3
 132          {
 133   1          TH1=0x3C;
 134   1          TL1=0xB0; 
 135   1      
 136   1          if(INTF0==1)
 137   1              {
 138   2             if(P3_2==0)
 139   2             {
 140   3                T10Stimes0--;
 141   3                if(T10Stimes0==0)
 142   3                {
 143   4                    P1_7=1;
 144   4                    INTF0=0;
 145   4                            T10Stimes0=0;
 146   4                            EX0=1;              
 147   4                    }
 148   3                 }
 149   2             else 
 150   2                 {
 151   3               // P1_7=0;        //输出后要不要停??
 152   3                    INTF0=0;
 153   3                        EX0=1;
 154   3                    T10Stimes0=0;
 155   3                 }
 156   2              }
 157   1              else
 158   1              {
 159   2                 INTF0=0;
 160   2                 T10Stimes0=0;
 161   2                 EX0=1; 
 162   2              }
 163   1      
 164   1              if(INTF1==1)
 165   1              {
 166   2             if(P3_3==0)
 167   2             {
 168   3                T10Stimes1--;
 169   3                if(T10Stimes1==0)
 170   3                {
 171   4                    P1_7=1;
 172   4                    INTF1=0;
 173   4                            T10Stimes1=0;
 174   4                            EX1=1;            
 175   4                    }
 176   3                 }
 177   2             else 
C51 COMPILER V7.06   TCMAIN                                                                01/06/2008 17:24:20 PAGE 4   

 178   2                 {
 179   3                //P1_7=0;       //输出后要不要停?? 
 180   3                    INTF1=0;
 181   3                        EX1=1;
 182   3                    T10Stimes1=0;
 183   3                 }
 184   2              }
 185   1              else
 186   1              {
 187   2                 INTF1=0;
 188   2                 T10Stimes1=0;
 189   2                 EX1=1; 
 190   2              }
 191   1      }
 192          
 193          //定时器0中断外理中键扫描和显示
 194          void KeyAndDis_Time0(void) interrupt 1 using 2
 195          {
 196   1        TH0=0xB1;
 197   1              TL0=0xDF;                 //设定时值为20000us(20ms)
 198   1      
 199   1              LEDPort = 0xFF;
 200   1        if (!Key_UP)
 201   1          KeyV = 1;
 202   1        if (!Key_DOWN)
 203   1          KeyV = 2;
 204   1        if (!Key_SET)
 205   1          KeyV = 3;
 206   1              //KeySETDowning = 0;  //清除
 207   1        if (KeyV != 0)      //有键按下
 208   1          {
 209   2            Delay_10ms();   //延时防抖  按下10ms再测
 210   2            if (!Key_UP)
 211   2              TempKeyV = 1;
 212   2            if (!Key_DOWN)
 213   2              TempKeyV = 2;
 214   2            if (!Key_SET)
 215   2              TempKeyV = 3;
 216   2            if (KeyV == TempKeyV)   //两次值相等为确定接下了键
 217   2              {                                                
 218   3                if (KeyV == 3)      //按下SET键,如在SET状态就退出,否则进入
 219   3                  {
 220   4                                                              //KeySETDowning = 1; //表明SET正在按下
 221   4                    PowTF = 0;      //电源标识开
 222   4                                                              if (!KeyTF)
 223   4                      if (SetTF)
 224   4                                                                              {
 225   5                                      SetTF = 0;    //标识位标识退出设定
 226   5                                                                                      InitDS1820(); //初始化
 227   5                                                                              ROMDS1820();    //跳过ROM
 228   5                                                                              TMWDS1820();    //写温度上限指令
 229   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 230   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 231   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 232   5                                                                                      InitDS1820(); //初始化
 233   5                                                                              ROMDS1820();    //跳过ROM
 234   5                                                                              TMREDS1820();   //温度上限值COPY回E2PRAM
 235   5                                                                              }
 236   4                      else
 237   4                              SetTF = 1;
 238   4                    if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
 239   4                      KeySETDown = 1;
C51 COMPILER V7.06   TCMAIN                                                                01/06/2008 17:24:20 PAGE 5   

 240   4                    else
 241   4                      KSDNum = KSDNum + 1;  //前一秒内有按过SET则开始计数
 242   4                  }
 243   3                if (SetTF)  //在SET状态下
 244   3                  {
 245   4                    if ((KeyV == 1) && (!KeyTF))
 246   4                      TMSetV = TMSetV + 1;    //上调温度
 247   4                    if ((KeyV == 2) && (!KeyTF))
 248   4                      TMSetV = TMSetV - 1;    //下调温度
 249   4                    if (TMSetV <= -55)          //限制温度上下限
 250   4                      TMSetV = -55;
 251   4                    if (TMSetV >= 125)
 252   4                      TMSetV = 125;
 253   4                  }
 254   3                      if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定
 255   3              }
 256   2      
 257   2            if (KeySETDown)         //在2秒内按下了SET则计中断发生次数用于长按SET时计时用
 258   2              //IntNum = IntNum + 1;  
 259   2            //if (IntNum > 55)     //中断发生了55次时(大约1.2秒)75为1.5秒左右
 260   2              {
 261   3                //IntNum = 0;
 262   3                                              KeySETDown = 0;
 263   3                if (KSDNum == 55)      //如一直长按了SET1.2秒左右
 264   3                  {
 265   4                    RelayOutPort = 1;  //关闭继电器输出
 266   4                    PowTF = 1;         //电源标识关
 267   4                    LEDOneC = 0;
 268   4                    LEDTwoC = 0;
 269   4                    LEDThreeC = 0;
 270   4                    LEDPort = 0xBF;      //显示"--"
 271   4                    Delay_4s();        //延时
 272   4                    LEDOneC = 1;
 273   4                    LEDTwoC = 1;      //关显示
 274   4                    LEDThreeC = 1;
 275   4                    Delay_4s();
 276   4                                                        //IntNum = 0;
 277   4                                                        IntNum2 = 0;
 278   4                                                        IntNum3 = 0;
 279   4                  }
 280   3                KSDNum = 0;
 281   3               }
 282   2          }
 283   1        KeyV = 0;
 284   1        TempKeyV = 0;   //清空变量准备下次键扫描
 285   1      
 286   1        if (!PowTF)
 287   1          {
 288   2            InitDS1820();     //初始化
 289   2            ROMDS1820();      //跳过ROM
 290   2            TMVDS1820();  //温度转换指令
 291   2      
 292   2            Delay_510();
 293   2            Delay_510();  //延时等待转换完成
 294   2      
 295   2            InitDS1820(); //初始化
 296   2            ROMDS1820();      //跳过ROM
 297   2            TMRDS1820();      //读出温度指令
 298   2            ReadDS1820(); //读出温度值
 299   2      
 300   2            V2ToV();        //转换显示值
 301   2            if (TMV > TMSetV)   //根据采集到的温度值控制继电器
C51 COMPILER V7.06   TCMAIN                                                                01/06/2008 17:24:20 PAGE 6   

 302   2              {
 303   3                RelayOutPort = 0;
 304   3                RelayOutfan = 1;
 305   3                LEDhigh = 0 ;
 306   3                LEDlow = 1;
 307   3                          }
 308   2            else
 309   2                          {
 310   3                RelayOutPort = 1;
 311   3                RelayOutfan = 0;
 312   3                LEDhigh = 1;
 313   3                LEDlow = 0;
 314   3                       }
 315   2      
 316   2            if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
 317   2            if (IntNum2 > 50 ) IntNum2 = 0;
 318   2                              if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
 319   2                              if (IntNum3 > 25) 
 320   2                                      {
 321   3                                              IntNum3 = 0;
 322   3                                              KeyTF = 0;
 323   3                                      }
 324   2      
 325   2            if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //计数在后半段时显示
 326   2            LEDPort = LED_One;
 327   2            LEDOneC = 0;
 328   2            Delay_510();
 329   2            LEDOneC = 1;    //显示百位数
 330   2            LEDPort = LED_Two;

⌨️ 快捷键说明

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