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

📄 tcmain.lst

📁 温度控制器V1.5 显示为三个共阳极LED 温度传感器用单总线DS18B20 CPU为2051
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.09   TCMAIN                                                                06/27/2004 13:42:31 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE TCMAIN
OBJECT MODULE PLACED IN TCMain.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE TCMain.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND TABS(2) SRC(.\TCMain.SRC)

line level    source

   1          /*-------------------------------
   2          
   3          温度控制器V1.5
   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/1/2
  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);   //定义函数
  53   1        void ROMDS1820(void);
C51 COMPILER V7.09   TCMAIN                                                                06/27/2004 13:42:31 PAGE 2   

  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)      //有键按下
 115   1          {
C51 COMPILER V7.09   TCMAIN                                                                06/27/2004 13:42:31 PAGE 3   

 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;
 177   4                    LEDPort = 0xBF;      //显示"--"
C51 COMPILER V7.09   TCMAIN                                                                06/27/2004 13:42:31 PAGE 4   

 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 = 0;
 211   3              }
 212   2            else
 213   2              {
 214   3                RelayOutPort = 1;
 215   3              }
 216   2      
 217   2            if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
 218   2            if (IntNum2 > 50 ) IntNum2 = 0;
 219   2            if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
 220   2            if (IntNum3 > 25) 
 221   2              {
 222   3                IntNum3 = 0;
 223   3                KeyTF = 0;
 224   3              }
 225   2      
 226   2            if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //计数在后半段时显示
 227   2            LEDPort = LED_One;
 228   2            LEDOneC = 0;
 229   2            Delay_510();
 230   2            LEDOneC = 1;    //显示百位数
 231   2            LEDPort = LED_Two;
 232   2            LEDTwoC = 0;
 233   2            Delay_510();
 234   2            LEDTwoC = 1;    //显示十位数
 235   2            LEDPort = LED_Three;
 236   2            LEDThreeC = 0;
 237   2            Delay_510();
 238   2            LEDThreeC = 1;    //显示个位数
 239   2          }
C51 COMPILER V7.09   TCMAIN                                                                06/27/2004 13:42:31 PAGE 5   

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

⌨️ 快捷键说明

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