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

📄 main.lst

📁 51单片机实现远程电源控制,串口接收电台命令,控制通断电,C语言编程
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  01/01/2006 16:24:02 PAGE 1   


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

stmt level    source

   1          #include <reg52.h>
   2          #define MsgLen 11
   3          sfr WDTC  = 0x8f;//看门狗寄存器定义
   4          sfr XICON = 0xc0;//外部中断控制寄存器定义
   5          sbit EX2 = XICON^2;//外部中断2使能位定义
   6          sbit EX3 = XICON^6;//外部中断3使能位定义
   7          unsigned char MSGBuf[MsgLen];//接收缓冲区
   8          unsigned char RcvBuf;//接收寄存器
   9          unsigned int Timer10Min= 0 ;//10分钟超时计数器
  10          bit HasRcv=0;//接收标志
  11          bit SendOver=0;//发送标志
  12          bit T0out=0;//10分钟超时标志
  13          bit Timer0Flag=0;//定时器0溢出标志
  14          code unsigned char PowerOnREQ[] = {//开机命令数据包
  15               0x56,0x07,0x81,0x01,0xfe,0xdd,0x95,0xb0,0xb0,0xaf,0x04};
  16          code unsigned char PowerOnCMP[] = {//开机成功数据包
  17               0x56,0x07,0x82,0xfe,0x01,0x7b,0x39,0xd0,0x0c,0x6e,0x03};
  18          code unsigned char PowerOffREQ[] = {//关机命令数据包
  19               0x56,0x07,0x83,0x01,0xfe,0xb3,0x41,0x34,0xb3,0xba,0x03};
  20          code unsigned char PowerOffCMP[] = {//关机成功数据包
  21               0x56,0x07,0x84,0xfe,0x01,0xc9,0x45,0x5d,0x08,0x53,0x03};
  22          code unsigned char PowerError[]  = {//出错信息数据包
  23               0x56,0x07,0x85,0xfe,0x01,0xfe,0x2f,0x9f,0x09,0xb6,0x03};
  24          sbit nPCTL = P1^0;//电源控制位,低有效
  25          sbit nPOn1 = P2^0;//电源监测位1,低有效
  26          sbit nPOn2 = P2^1;//电源监测位2,低有效
  27          
  28          
  29          void InitCom(unsigned int BaudRate)//串口初始化
  30          {
  31   1              unsigned char THTL;
  32   1              switch (BaudRate)
  33   1              {
  34   2                      case 300: THTL = 64; break; //波特率300
  35   2                      case 600: THTL = 160; break; //600
  36   2                      case 1200: THTL = 208; break; //1200
  37   2                      case 2400: THTL = 243; break; //2400
  38   2                      case 4800: THTL = 244; break; //4800
  39   2                      case 9600: THTL = 250; break; //9600
  40   2                      case 19200: THTL = 253; break; //19200
  41   2                      case 57600: THTL = 255; break; //57600
  42   2                      default: THTL = 208;
  43   2              }
  44   1              SCON = 0x50; //串口方式1,允许接收
  45   1              TMOD = 0x21; //定时器1定时方式2, 定时器0定时方式1
  46   1              TCON = 0x40; //设定时器1开始计数
  47   1              TH1 = THTL;
  48   1              TL1 = THTL;
  49   1              PCON = 0x80; //波特率加倍控制,SMOD位
  50   1              RI = 0; //清收发中断标志
  51   1              TI = 0;
  52   1              TR1 = 1; //启动定时器1
  53   1      }
  54          
  55          
C51 COMPILER V7.06   MAIN                                                                  01/01/2006 16:24:02 PAGE 2   

  56          void externelINT0() interrupt 0//外部中断0中断服务程序
  57           {
  58   1        EX0=0;//关中断
  59   1       }
  60          
  61          void Timer0Int() interrupt 1//定时器0中断服务程序
  62           {
  63   1        Timer10Min++;//10分钟超时计数器递增
  64   1        Timer0Flag=1;//定时器0溢出标志置位
  65   1        if(Timer10Min>10000)//判断超时
  66   1        T0out = 1;  
  67   1       }
  68          
  69          void externelINT1() interrupt 2//外部中断1中断服务程序
  70           {
  71   1        EX1 = 0;//关中断
  72   1       }
  73          
  74          void Timer1Int() interrupt 3//定时器1中断服务程序
  75           {
  76   1        ET1 = 0;//关中断
  77   1       }
  78          
  79          void SerialIO0() interrupt 4 {//串口中断
  80   1        
  81   1        if(RI)  {
  82   2         RI = 0 ;
  83   2         RcvBuf = SBUF;
  84   2         HasRcv = 1;
  85   2         Timer10Min= 0;
  86   2         } 
  87   1        else
  88   1         { 
  89   2          TI = 0;
  90   2              SendOver=1;
  91   2              }
  92   1        }
  93          
  94          void Timer2Int() interrupt 5 {//定时器2中断服务程序
  95   1         
  96   1        ET2 = 0;//关中断
  97   1      }
  98          
  99          void externelINT2() interrupt 6//外部中断2中断服务程序
 100           {
 101   1        EX2 = 0;//关中断
 102   1       }
 103          
 104          void externelINT3() interrupt 7//外部中断3中断服务程序
 105           {
 106   1        EX3 = 0;//关中断
 107   1       }
 108          
 109          /*************FUNCTION**************/
 110          /*        11.0592MHz               */
 111          /*     延时(count)ms               */
 112          /***********************************/
 113          void dmsec(unsigned int count)//延时程序
 114          {
 115   1              unsigned int i;
 116   1              while(count--)
 117   1              {
C51 COMPILER V7.06   MAIN                                                                  01/01/2006 16:24:02 PAGE 3   

 118   2                      for(i=0;i<125;i++)
 119   2                      {
 120   3                      }
 121   2              }
 122   1      }
 123          
 124          void rcvMsg()//接收数据包
 125          {
 126   1      unsigned int Num=1;
 127   1      unsigned int Timeout=0;
 128   1      while(Num<MsgLen && Timeout<3000) {
 129   2          if (HasRcv)
 130   2           { HasRcv = 0;      
 131   3             MSGBuf[Num]= RcvBuf;
 132   3                 Num++;
 133   3           }
 134   2            Timeout++;
 135   2            
 136   2               }
 137   1       WDTC = 0xe5;  //喂狗
 138   1      }
 139          
 140          void sendMSG(unsigned char MSG[])//发送数据包
 141          {
 142   1      unsigned int i;
 143   1      
 144   1      for(i = 0 ; i<MsgLen; i++ ) 
 145   1      {
 146   2       SBUF = MSG[i];
 147   2       while(SendOver==0);
 148   2       SendOver=0;
 149   2      // dmsec(1);
 150   2      }
 151   1       WDTC = 0xe5;//喂狗
 152   1      }
 153          
 154          unsigned int checkMSG()//校验数据包
 155          {
 156   1       unsigned int i;
 157   1       unsigned int flag1;
 158   1       unsigned int flag2;
 159   1      
 160   1       for(i = 1 ; i<MsgLen; i++ ) 
 161   1      {
 162   2       if (MSGBuf[i] != PowerOnREQ[i] )
 163   2       { flag1= 0;
 164   3         break;
 165   3       }
 166   2       flag1 = 1;
 167   2      }
 168   1       for(i = 1 ; i<MsgLen; i++ ) 
 169   1      {
 170   2       if (MSGBuf[i] != PowerOffREQ[i] )
 171   2       { flag2= 0;
 172   3         break;
 173   3       }
 174   2       flag2 = 2;
 175   2      }
 176   1        //WDTC = 0xe5;
 177   1        return(flag1 + flag2) ;
 178   1      }
 179          
C51 COMPILER V7.06   MAIN                                                                  01/01/2006 16:24:02 PAGE 4   

 180          void main() {
 181   1        WDTC = 0xe5;//看门狗寄存器赋值
 182   1        IE = 0x00;
 183   1        XICON = 0x00;//关闭外部中断
 184   1        InitCom(19200);
 185   1        ES = 1;//使能串口中断
 186   1        ET0 = 1;//定时器0溢出中断使能
 187   1        TR0 = 1;//激活定时器0
 188   1        EA =1;//中断允许
 189   1        nPCTL =1;
 190   1        P2 = 0xff;
 191   1        HasRcv =0;
 192   1        SendOver=0;
 193   1        Timer10Min= 0;
 194   1        T0out= 0;
 195   1      
 196   1        while (1) {
 197   2          while (HasRcv == 0){//等待接收
 198   3              if (T0out== 1 && nPOn1 == 0 && nPOn2 == 0)//超时断电
 199   3               {nPCTL = 1;
 200   4                sendMSG(PowerOffCMP);
 201   4               }
 202   3           if(Timer0Flag) //定时喂狗
 203   3                { 
 204   4              WDTC = 0xe5;
 205   4                  Timer0Flag = 0;//清定时器0溢出标志
 206   4                }
 207   3              }
 208   2          HasRcv = 0;//清接收标志
 209   2          if(RcvBuf == 0x56)//判断信头
 210   2          {
 211   3           MSGBuf[0]=RcvBuf;//
 212   3           rcvMsg();
 213   3      
 214   3          switch( checkMSG() )
 215   3              {
 216   4               //case 0 : //数据包错误
 217   4                       //sendMSG(PowerError); 
 218   4                          // break;
 219   4               case 1 : if (nPOn1 == 1 && nPOn2 == 1)//响应开机信令
 220   4                   {nPCTL = 0;
 221   5                        T0out = 0;             
 222   5                        dmsec(100);
 223   5                   }
 224   4                       if (nPOn1 == 0 && nPOn2 == 0) //判成功,发回复信令
 225   4                   sendMSG(PowerOnCMP);
 226   4                               else  sendMSG(PowerError);
 227   4                               break;
 228   4               case 2 :if (nPOn1 == 0 && nPOn2 == 0)  //响应关机信令
 229   4                   { nPCTL = 1;
 230   5                         dmsec(100);
 231   5                   }
 232   4                       if (nPOn1 == 1 && nPOn2 == 1) //判成功,发回复信令
 233   4                   sendMSG (PowerOffCMP) ;
 234   4                               else sendMSG(PowerError);
 235   4                   break;
 236   4           default: ;//sendMSG(PowerError);
 237   4              }
 238   3         }
 239   2              
 240   2         }
 241   1        
C51 COMPILER V7.06   MAIN                                                                  01/01/2006 16:24:02 PAGE 5   

 242   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    573    ----
   CONSTANT SIZE    =     55    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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