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

📄 tcmain.lst

📁 温度控制器V1.5 显示为三个共阳极LED 温度传感器用单总线DS18B20 CPU为2051
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   TCMAIN                                                                04/11/2008 16:55:01 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TCMAIN
OBJECT MODULE PLACED IN ..\..\cdle050029_02\C1.51\TCMain.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE ..\..\cdle050029_02\C1.51\TCMain.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND PRI
                    -NT(.\TCMain.lst) SRC(.\TCMain.SRC)

stmt level    source

   1          /*-------------------------------
   2          
   3          温度控制器V1.51
   4          显示为三个共阳极LED
   5          温度传感器用单总线DS18B20
   6          CPU为2051,三个按键,分别为UP,DOWN,SET
   7          温度调节上限为125度,下限为-55度
   8          只能用于单只18B20
   9          
  10          本软件仅供学习与参考,引用时请注明版权
  11          
  12          http://www.cdle.net
  13          明浩 2004/9/13
  14          pnzwzw@cdle.net
  15          -------------------------------*/
  16          
  17          #include <AT89X051.H>
  18          #include <intrins.h>
  19          #define Key_UP            P3_0    //上调温度
  20          #define Key_DOWN          P3_1    //下调温度
  21          #define Key_SET           P1_7    //设定键(温度设定,长按开电源)
  22          #define RelayOutPort      P3_5    //继电器输出
  23          #define LEDPort           P1      //LED控制口
  24          #define LEDOneC           P3_2    //LED DS1控制(百位)
  25          #define LEDTwoC           P3_3    //LED DS2控制(十位)
  26          #define LEDThreeC         P3_4    //LED DS3控制(个位)
  27          #define TMPort                                          P3_7            //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 IntNum,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          void main(void)
  51          {
  52   1              void InitDS1820(void);   //定义函数
C51 COMPILER V7.06   TCMAIN                                                                04/11/2008 16:55:01 PAGE 2   

  53   1              void ROMDS1820(void);
  54   1              void TMVDS1820(void);
  55   1              void TMRDS1820(void);
  56   1              void TMWDS1820(void);
  57   1              void TMREDS1820(void);
  58   1              void TMERDS1820(void);
  59   1              void ReadDS1820(void);
  60   1              void WriteDS1820(void);
  61   1              void Delay_510(void);
  62   1              void Delay_110(void);
  63   1              void Delay_10ms(void);
  64   1              void Delay_4s(void);
  65   1              void V2ToV(void);
  66   1      
  67   1              StateREG = 0;   //初始化变量
  68   1              SetTF = 1;      
  69   1              PowTF = 1;                      //关电源
  70   1              THV = 0;
  71   1              TLV = 0;
  72   1              TMV = 0;
  73   1              KeyV = 0;
  74   1              TempKeyV = 0;
  75   1              KSDNum = 0;
  76   1              IntNum = 0;
  77   1              IntNum2 = 0;
  78   1              IntNum3 = 0;
  79   1              LED_One = 0;
  80   1              LED_Two = 0;
  81   1      
  82   1              InitDS1820(); //初始化
  83   1              ROMDS1820();    //跳过ROM
  84   1              TMERDS1820();  //E2PRAM中温度上限值调入RAM
  85   1              InitDS1820(); //初始化
  86   1              ROMDS1820();    //跳过ROM
  87   1              TMRDS1820();    //读出温度指令
  88   1              ReadDS1820(); //读出温度值和上限值
  89   1              TMSetV = TMRomV;  //拷贝保存在DS18B20ROM里的上限值到TMSetV
  90   1      
  91   1              EA = 1;                                 //允许CPU中断
  92   1              ET0 = 1;                                //定时器0中断打开
  93   1              TMOD = 0x1;                     //设定时器0为模式1,16位模式
  94   1              TH0=0xB1;
  95   1              TL0=0xDF;                               //设定时值为20000us(20ms)
  96   1              TR0 = 1;                                //开始定时
  97   1              while(1);
  98   1      }
  99          
 100          //定时器0中断外理中键扫描和显示
 101          void KeyAndDis_Time0(void) interrupt 1 using 2
 102          {
 103   1        TH0=0xB1;
 104   1              TL0=0xDF;                               //设定时值为20000us(20ms)
 105   1      
 106   1              LEDPort = 0xFF;
 107   1        if (!Key_UP)
 108   1          KeyV = 1;
 109   1        if (!Key_DOWN)
 110   1          KeyV = 2;
 111   1        if (!Key_SET)
 112   1          KeyV = 3;
 113   1              //KeySETDowning = 0;  //清除
 114   1        if (KeyV != 0)      //有键按下
C51 COMPILER V7.06   TCMAIN                                                                04/11/2008 16:55:01 PAGE 3   

 115   1          {
 116   2            Delay_10ms();   //延时防抖  按下10ms再测
 117   2            if (!Key_UP)
 118   2              TempKeyV = 1;
 119   2            if (!Key_DOWN)
 120   2              TempKeyV = 2;
 121   2            if (!Key_SET)
 122   2              TempKeyV = 3;
 123   2            if (KeyV == TempKeyV)   //两次值相等为确定接下了键
 124   2              {
 125   3                if (KeyV == 3)      //按下SET键,如在SET状态就退出,否则进入
 126   3                  {
 127   4                                                              //KeySETDowning = 1; //表明SET正在按下
 128   4                    PowTF = 0;      //电源标识开
 129   4                                                              if (!KeyTF)
 130   4                      if (SetTF)
 131   4                                                                              {
 132   5                                      SetTF = 0;    //标识位标识退出设定
 133   5                                                                                      InitDS1820(); //初始化
 134   5                                                                              ROMDS1820();    //跳过ROM
 135   5                                                                              TMWDS1820();    //写温度上限指令
 136   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 137   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 138   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 139   5                                                                                      InitDS1820(); //初始化
 140   5                                                                              ROMDS1820();    //跳过ROM
 141   5                                                                              TMREDS1820();   //温度上限值COPY回E2PRAM
 142   5                                                                              }
 143   4                      else
 144   4                              SetTF = 1;
 145   4                    if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
 146   4                      KeySETDown = 1;
 147   4                    else
 148   4                      KSDNum = KSDNum + 1;  //前一秒内有按过SET则开始计数
 149   4                  }
 150   3                if (SetTF)  //在SET状态下
 151   3                  {
 152   4                    if ((KeyV == 1) && (!KeyTF))
 153   4                      TMSetV = TMSetV + 1;    //上调温度
 154   4                    if ((KeyV == 2) && (!KeyTF))
 155   4                      TMSetV = TMSetV - 1;    //下调温度
 156   4                    if (TMSetV <= -55)          //限制温度上下限
 157   4                      TMSetV = -55;
 158   4                    if (TMSetV >= 125)
 159   4                      TMSetV = 125;
 160   4                  }
 161   3                      if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定
 162   3              }
 163   2      
 164   2            if (KeySETDown)         //在2秒内按下了SET则计中断发生次数用于长按SET时计时用
 165   2              IntNum = IntNum + 1;  
 166   2            if (IntNum > 55)     //中断发生了55次时(大约1.2秒)75为1.5秒左右
 167   2              {
 168   3                IntNum = 0;
 169   3                                              KeySETDown = 0;
 170   3                if (KSDNum == 55)      //如一直长按了SET1.2秒左右
 171   3                  {
 172   4                    RelayOutPort = 1;  //关闭继电器输出
 173   4                    PowTF = 1;         //电源标识关
 174   4                    LEDOneC = 0;
 175   4                    LEDTwoC = 0;
 176   4                    LEDThreeC = 0;
C51 COMPILER V7.06   TCMAIN                                                                04/11/2008 16:55:01 PAGE 4   

 177   4                    LEDPort = 0xBF;      //显示"--"
 178   4                    Delay_4s();        //延时
 179   4                    LEDOneC = 1;
 180   4                    LEDTwoC = 1;      //关显示
 181   4                    LEDThreeC = 1;
 182   4                    Delay_4s();
 183   4                                                        IntNum = 0;
 184   4                                                        IntNum2 = 0;
 185   4                                                        IntNum3 = 0;
 186   4                  }
 187   3                KSDNum = 0;
 188   3               }
 189   2          }
 190   1        KeyV = 0;
 191   1        TempKeyV = 0;   //清空变量准备下次键扫描
 192   1      
 193   1        if (!PowTF)
 194   1          {
 195   2            InitDS1820();     //初始化
 196   2            ROMDS1820();      //跳过ROM
 197   2            TMVDS1820();  //温度转换指令
 198   2      
 199   2            Delay_510();
 200   2            Delay_510();  //延时等待转换完成
 201   2      
 202   2            InitDS1820(); //初始化
 203   2            ROMDS1820();      //跳过ROM
 204   2            TMRDS1820();      //读出温度指令
 205   2            ReadDS1820(); //读出温度值
 206   2      
 207   2            V2ToV();        //转换显示值
 208   2            if (TMV > TMSetV)   //根据采集到的温度值控制继电器
 209   2              {
 210   3                RelayOutPort = 1;
 211   3                          }
 212   2            else
 213   2                          {
 214   3                              if (TMV <= TMSetV-1)
 215   3                {
 216   4                           RelayOutPort = 0;
 217   4                        }
 218   3                        else
 219   3                        {}
 220   3                        }
 221   2      
 222   2            if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
 223   2            if (IntNum2 > 50 ) IntNum2 = 0;
 224   2                              if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
 225   2                              if (IntNum3 > 25) 
 226   2                                      {
 227   3                                              IntNum3 = 0;
 228   3                                              KeyTF = 0;
 229   3                                      }
 230   2      
 231   2            if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //计数在后半段时显示
 232   2            LEDPort = LED_One;
 233   2            LEDOneC = 0;
 234   2            Delay_510();
 235   2            LEDOneC = 1;    //显示百位数
 236   2            LEDPort = LED_Two;
 237   2            LEDTwoC = 0;
 238   2            Delay_510();
C51 COMPILER V7.06   TCMAIN                                                                04/11/2008 16:55:01 PAGE 5   

 239   2            LEDTwoC = 1;    //显示十位数
 240   2            LEDPort = LED_Three;
 241   2            LEDThreeC = 0;
 242   2            Delay_510();
 243   2            LEDThreeC = 1;    //显示个位数
 244   2          }
 245   1      InitEnd:;
 246   1      }
 247          
 248          void V2ToV(void)        //数值转换
 249          {
 250   1        TLV = TLV >> 4;                       
 251   1        THV = THV << 4;                       //读出的高低位数值移位
 252   1        TMV = TLV | THV;              //合并高低位放入TM为实际温度值
 253   1              Sign = 0;
 254   1        if (SetTF || !Key_SET)
 255   1          Sign = TMSetV >> 7;          //取符号
 256   1        else
 257   1           Sign = TMV >> 7;
 258   1      
 259   1              if (Sign)
 260   1                      {
 261   2                      if (SetTF || !Key_SET)
 262   2                                      {
 263   3                              LED_One = (~(TMSetV-1)) / 100;          //SET状态下显示设定值
 264   3                              LED_Two = ((~(TMSetV-1)) - LED_One * 100)/10;
 265   3                                  LED_Three = (~(TMSetV-1)) - LED_One * 100 - LED_Two * 10;
 266   3                                      }
 267   2                      else
 268   2                                      {
 269   3                              LED_One = (~(TMV-1)) / 100;                                                     //转换百位值            
 270   3                              LED_Two = ((~(TMV-1)) - LED_One * 100)/10;
 271   3                                  LED_Three = (~(TMV-1)) - LED_One * 100 - LED_Two * 10;
 272   3                                      }
 273   2                      }
 274   1              else
 275   1                      { 
 276   2                      if (SetTF || !Key_SET)
 277   2                                      {
 278   3                              LED_One = (TMSetV) / 100;          //SET状态下显示设定值
 279   3                              LED_Two = (TMSetV - LED_One * 100)/10;
 280   3                                  LED_Three = TMSetV - LED_One * 100 - LED_Two * 10;
 281   3                                      }
 282   2                      else
 283   2                                      {

⌨️ 快捷键说明

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