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

📄 tcmain.lst

📁 RZ-51V20 实例程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   TCMAIN                                                                08/10/2012 16:38:28 PAGE 1   


C51 COMPILER V8.02, 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 SRC(.\TCMain.SRC)

line level    source

   1          #include <AT89X51.H>
   2          #include <intrins.h>
   3          #define Key_UP            P1_5 
   4          #define Key_DOWN          P1_4   
   5          #define Key_SET           P1_6   
   6          #define RelayOutPort      P3_7  
   7          #define LEDPort           P0      
   8          #define DELPort           P3_6   
   9          #define LEDTwoC           P2_6    
  10          #define LEDThreeC         P2_7    
  11          #define TMPort                    P3_3
  12          #define INBUF_LEN 5 //数据长度
  13          unsigned char inbuf1[INBUF_LEN]={'0','0','0','0','0'};//发送缓冲区
  14          unsigned char inbuf2[50];//接收缓冲区
  15          unsigned char count3;
  16          void init_serialcomm( void )
  17          {
  18   1      SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
  19   1      TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
  20   1      PCON |= 0x80 ; //SMOD=1;
  21   1      TH1 = 0xFA ; //Baud:9600 fosc=11.0592MHz
  22   1      IE |= 0x90 ; //Enable Serial Interrupt
  23   1      TR1 = 1 ; // timer 1 run
  24   1      }
  25          //向串口发送一个字符
  26          void send_char_com( unsigned char ch)
  27          {
  28   1      SBUF=ch;
  29   1      while (TI== 0 );
  30   1      TI= 0 ;
  31   1      }
  32          //向串口发送一个字符串,strlen 为该字符串长度
  33          void send_string_com( unsigned char *str, unsigned int strlen)
  34          {
  35   1      unsigned int k= 0 ;
  36   1      do
  37   1      {
  38   2      send_char_com(*(str + k));
  39   2      k++;
  40   2      } while (k < strlen);
  41   1      }
  42          //串口接收中断函数
  43          void serial () interrupt 4 using 3
  44          {
  45   1      if (RI) //RI==开始接收
  46   1      {
  47   2      unsigned char ch;
  48   2      RI = 0 ; //软件RI=0
  49   2      ch=SBUF;
  50   2      if (ch> 1 )
  51   2      {
  52   3      count3= 0 ;
  53   3      inbuf2[count3]=ch;
  54   3      }
  55   2      else
C51 COMPILER V8.02   TCMAIN                                                                08/10/2012 16:38:28 PAGE 2   

  56   2      {
  57   3      count3++;
  58   3      inbuf2[count3]=ch;
  59   3      }
  60   2      }
  61   1      }       
  62          
  63          unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //0-9的LED笔划,
             -0xFF为空,0xF7为负号
  64          unsigned char dis_8[12]={'0','1','2','3','4','5','6','7','8','9',' ','-'};
  65          static unsigned char bdata StateREG;    //可位寻址的状态寄存器
  66          sbit DS1820ON = StateREG^0;               //DS1820是否存在
  67          sbit SetTF = StateREG^1;              //是否是在温度设置状态
  68          sbit KeySETDown = StateREG^2;         //是否已按过SET键标识
  69          sbit PowTF = StateREG^3;              //电源电源标识
  70          sbit KeyTF = StateREG^4;                                                        //键盘是否允许
  71          
  72          //sbit KeySETDowning = StateREG^5;                      //SET是否正在按下
  73          static unsigned char bdata TLV _at_ 0x0029;         //温度变量高低位
  74          static unsigned char bdata THV _at_ 0x0028;
  75          static signed char TMV;       //转换后的温度值
  76          static unsigned char KeyV,TempKeyV;      //键值
  77          static unsigned char Second;
  78          static unsigned char flag;
  79          static signed char TMRomV _at_ 0x0027;    //高温限制
  80          static signed char TMSetV _at_ 0x0026;    //温度设定值
  81          static unsigned char KSDNum;    //SET键连按时的采集次数
  82          static unsigned char IntNum,IntNum2,IntNum3;    //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态
             -时LED闪烁
  83          static signed char LED_One,LED_Two,LED_Three;  //LED的显示位 LED_One为十位,LED_Two为个位
  84          static unsigned char Sign; //负号标识
  85          
  86          void main(void)
  87          {
  88   1      
  89   1              void InitDS1820(void);   //定义函数
  90   1              void ROMDS1820(void);
  91   1              void TMVDS1820(void);
  92   1              void TMRDS1820(void);
  93   1              void TMWDS1820(void);
  94   1              void TMREDS1820(void);
  95   1              void TMERDS1820(void);
  96   1              void ReadDS1820(void);
  97   1              void WriteDS1820(void);
  98   1              void Delay_510(void);
  99   1              void Delay_110(void);
 100   1              void Delay_10ms(void);
 101   1              void Delay_4s(void);
 102   1              void V2ToV(void);
 103   1              
 104   1               DELPort=1;
 105   1              StateREG = 0;   //初始化变量
 106   1              SetTF = 0;      
 107   1              PowTF = 0;                      //关电源
 108   1              THV = 0;
 109   1              TLV = 0;
 110   1              TMV = 0;
 111   1              KeyV = 0;
 112   1              TempKeyV = 0;
 113   1              KSDNum = 0;
 114   1              IntNum = 0;
 115   1              IntNum2 = 0;
C51 COMPILER V8.02   TCMAIN                                                                08/10/2012 16:38:28 PAGE 3   

 116   1              IntNum3 = 0;
 117   1              LED_One = 0;
 118   1              LED_Two = 0;
 119   1      
 120   1              InitDS1820(); //初始化
 121   1              ROMDS1820();    //跳过ROM
 122   1              TMERDS1820();  //E2PRAM中温度上限值调入RAM
 123   1              InitDS1820(); //初始化
 124   1              ROMDS1820();    //跳过ROM
 125   1              TMRDS1820();    //读出温度指令
 126   1              ReadDS1820(); //读出温度值和上限值
 127   1              TMSetV = TMRomV;  //拷贝保存在DS18B20ROM里的上限值到TMSetV
 128   1      
 129   1              EA = 1;                                 //允许CPU中断
 130   1              ET0 = 1;                                //定时器0中断打开
 131   1              TMOD = 0x1;                     //设定时器0为模式1,16位模式
 132   1              TH0=0xB1;
 133   1              TL0=0xDF;                               //设定时值为20000us(20ms)
 134   1              TR0 = 1;
 135   1              
 136   1              while(1){                               //开始定时
 137   2      
 138   2              
 139   2      
 140   2               
 141   2      
 142   2      
 143   2      if (flag==0){
 144   3      if (Second==1){
 145   4                              Delay_4s();
 146   4                              Delay_4s();
 147   4                              Delay_4s();
 148   4                              Delay_4s();
 149   4                              Delay_4s();
 150   4                              Delay_4s();
 151   4                              
 152   4                        DELPort=0; 
 153   4                        Second=0;
 154   4                        }
 155   3                         }
 156   2                       }
 157   1              
 158   1              
 159   1      }
 160          
 161          //定时器0中断外理中键扫描和显示
 162          void KeyAndDis_Time0(void) interrupt 1 using 2
 163          {
 164   1        TH0=0xB1;
 165   1              TL0=0xDF;                               //设定时值为20000us(20ms)
 166   1      
 167   1              LEDPort = 0xFF;
 168   1              
 169   1         
 170   1                 if (inbuf2[0]==0x33){        
 171   2                 send_char_com('O');
 172   2                 send_char_com('O');
 173   2                 send_char_com('O');
 174   2                 SetTF = 1;
 175   2      //send_string_com(inbuf2,1);
 176   2      //BEEP=0;
 177   2      //RELAY=0;
C51 COMPILER V8.02   TCMAIN                                                                08/10/2012 16:38:28 PAGE 4   

 178   2      send_char_com('O');
 179   2           //inbuf2[0]=0x00;
 180   2               inbuf2[0]=0x00;
 181   2      } 
 182   1      
 183   1      if (inbuf2[0]==0x36)
 184   1      
 185   1      {send_char_com('N');
 186   2      send_char_com('N');
 187   2      send_char_com('N');
 188   2      SetTF = 0;
 189   2      
 190   2      inbuf2[0]=0x00;
 191   2      } 
 192   1      
 193   1      if (inbuf2[0]==0x34){     
 194   2                 KeyV=2;
 195   2      //send_string_com(inbuf2,1);
 196   2      //BEEP=0;
 197   2      //RELAY=0;
 198   2        TMSetV = TMSetV - 1;
 199   2          inbuf2[0]=0x00;
 200   2      } 
 201   1      
 202   1      if (inbuf2[0]==0x35){
 203   2      
 204   2      //send_string_com(inbuf2,1);
 205   2      //BEEP=1;
 206   2      //RELAY=1;
 207   2       TMSetV = TMSetV + 1;    
 208   2       inbuf2[0]=0x00;
 209   2      } 
 210   1      
 211   1      if (inbuf2[0]==0x74){
 212   2               KeyV=2;
 213   2      //send_string_com(inbuf2,1);
 214   2      //BEEP=1;
 215   2      //RELAY=1;
 216   2      } 
 217   1      
 218   1      if (inbuf2[0]==0x90){
 219   2               KeyV=1;
 220   2      //send_string_com(inbuf2,1);
 221   2      //BEEP=1;
 222   2      //RELAY=1;
 223   2      } 
 224   1      
 225   1      
 226   1        if (!Key_UP)
 227   1          KeyV = 1;
 228   1        if (!Key_DOWN)
 229   1          KeyV = 2;
 230   1        if (!Key_SET)
 231   1          KeyV = 3;
 232   1              //KeySETDowning = 0;  //清除
 233   1        if (KeyV != 0)      //有键按下
 234   1          {
 235   2            Delay_10ms();   //延时防抖  按下10ms再测
 236   2            if (!Key_UP)
 237   2              TempKeyV = 1;
 238   2            if (!Key_DOWN)
 239   2              TempKeyV = 2;
C51 COMPILER V8.02   TCMAIN                                                                08/10/2012 16:38:28 PAGE 5   

 240   2            if (!Key_SET)
 241   2              TempKeyV = 3;
 242   2            if (KeyV == TempKeyV)   //两次值相等为确定接下了键
 243   2              {
 244   3                if (KeyV == 3)      //按下SET键,如在SET状态就退出,否则进入
 245   3                  {
 246   4                                                              //KeySETDowning = 1; //表明SET正在按下
 247   4                                                              
 248   4                              
 249   4                    PowTF = 0;      //电源标识开
 250   4                             if (!KeyTF)
 251   4                      if (SetTF){
 252   5                                      send_char_com('N');
 253   5      send_char_com('N');
 254   5      send_char_com('N');
 255   5                                      SetTF = 0;    //标识位标识退出设定
 256   5                                                      
 257   5                                                                                      InitDS1820(); //初始化
 258   5                                                                              ROMDS1820();    //跳过ROM
 259   5                                                                              TMWDS1820();    //写温度上限指令
 260   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 261   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 262   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 263   5                                                                                      InitDS1820(); //初始化
 264   5                                                                              ROMDS1820();    //跳过ROM
 265   5                                                                              TMREDS1820();   //温度上限值COPY回E2PRAM
 266   5                                                                              }
 267   4                      else {
 268   5                                      send_char_com('O');
 269   5                 send_char_com('O');
 270   5                 send_char_com('O');
 271   5                              SetTF = 1;}
 272   4                                               
 273   4                                         
 274   4                    if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
 275   4                      KeySETDown = 1;
 276   4                    else
 277   4                      KSDNum = KSDNum + 1;  //前一秒内有按过SET则开始计数
 278   4                  }
 279   3                if (SetTF)  //在SET状态下
 280   3                  {
 281   4                               
 282   4                    if ((KeyV == 1) && (!KeyTF))
 283   4                      TMSetV = TMSetV + 1;    //上调温度
 284   4                    if ((KeyV == 2) && (!KeyTF))
 285   4                      TMSetV = TMSetV - 1;    //下调温度
 286   4                    if (TMSetV <= 20)          //限制温度上下限
 287   4                      TMSetV = 20;
 288   4                    if (TMSetV >= 75)
 289   4                      TMSetV = 75;
 290   4                  }
 291   3                      if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定
 292   3              }
 293   2      
 294   2           
 295   2          }
 296   1        KeyV = 0;
 297   1        TempKeyV = 0;   //清空变量准备下次键扫描
 298   1      
 299   1        if (!PowTF)
 300   1          {
 301   2            InitDS1820();     //初始化
C51 COMPILER V8.02   TCMAIN                                                                08/10/2012 16:38:28 PAGE 6   

 302   2            ROMDS1820();      //跳过ROM
 303   2            TMVDS1820();  //温度转换指令
 304   2      
 305   2            Delay_510();
 306   2            Delay_510();  //延时等待转换完成
 307   2      
 308   2            InitDS1820(); //初始化
 309   2            ROMDS1820();      //跳过ROM
 310   2            TMRDS1820();      //读出温度指令
 311   2            ReadDS1820(); //读出温度值
 312   2      
 313   2            V2ToV();        //转换显示值
 314   2            if (TMV > TMSetV)   //根据采集到的温度值控制继电器
 315   2              {
 316   3                RelayOutPort = 0;
 317   3                        flag=0;
 318   3                        }
 319   2            else
 320   2                          {
 321   3                RelayOutPort = 1;
 322   3                        DELPort=1; 
 323   3                        Second=1;
 324   3                        flag=1;
 325   3      
 326   3                      
 327   3                        }
 328   2      
 329   2            if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
 330   2            if (IntNum2 > 50 ) IntNum2 = 0;
 331   2                              if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
 332   2                              if (IntNum3 > 25) 
 333   2                                      {IntNum3 = 0;
 334   3                                      
 335   3                                              
 336   3                                      }
 337   2      
 338   2            if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //计数在后半段时显示
 339   2               
 340   2                LEDPort = LED_Two;
 341   2            LEDTwoC = 0;
 342   2            Delay_510();
 343   2            LEDTwoC = 1;    //显示十位数
 344   2            LEDPort = LED_Three;
 345   2            LEDThreeC = 0;
 346   2            Delay_510();
 347   2            LEDThreeC = 1;    //显示个位数
 348   2          }
 349   1      InitEnd:;

⌨️ 快捷键说明

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