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

📄 main.lst

📁 单片机与计算机的通讯应用程序,运行KEIL C51软件,可以直接使用!
💻 LST
字号:
C51 COMPILER V7.09   MAIN                                                                  07/05/2005 16:40:31 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND TABS(2)

line level    source

   1          /*
   2             //*************************************************************************
   3             //
   4             //                  串口输入输出控制器
   5             //
   6             //           COPYRIGHT (c)   2005 BY 明浩 pnzwzw@cdle.net
   7             //                     --  ALL RIGHTS RESERVED  --
   8             //
   9             // File Name:  main.c
  10             // Created:    2005.7.4
  11             // Modified:   2005.7.5
  12             // Revision:   1.0
  13             //
  14             //*************************************************************************
  15             // 芯片类型 AT89S51
  16             //*************************************************************************
  17          */
  18          
  19          #include <at89x52.h>
  20          #include <INTRINS.H>
  21          
  22          void InitCom(void);
  23          void ComOutChar(unsigned char OutData);
  24          void PackCheck(void);
  25          void SendErrMsg(void);
  26          void SendCRCMsg(void);
  27          void SendTeMsg(void);
  28          void SendNSMsg(void);
  29          void RunPack(void);
  30          void CheckID(void);
  31          void SendPack(void);
  32          void Write(void);
  33          void Read(void);
  34          
  35          static unsigned char Pack[9]; //数据包数组
  36          static unsigned char PN = 0; //接收指针
  37          static unsigned char TN = 0; //超时标识
  38          static unsigned char SN = 0;  
  39          unsigned char code SNID[] = {"SN0001"}; //固件的序列号
  40          
  41          void main(void)
  42          {
  43   1        unsigned int a;
  44   1      
  45   1        InitCom();
  46   1        do
  47   1          { 
  48   2            for (a=0; a<30000; a++)
  49   2              P3_6 = 1;
  50   2            for (a=0; a<30000; a++) //指示灯闪动
  51   2              P3_6 = 0;
  52   2          }
  53   1        while(1);
  54   1      }
  55          
C51 COMPILER V7.09   MAIN                                                                  07/05/2005 16:40:31 PAGE 2   

  56          //串口初始化 晶振为11.0592M 方式1 波特率57600
  57          void InitCom(void)
  58          {
  59   1        SCON = 0x50; //串口方式1,允许接收
  60   1        TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
  61   1        TCON = 0x40; //设定时器1开始计数
  62   1        TH1 = 255;  //设波特率为57600
  63   1        TL1 = 255;
  64   1        PCON = 0x80; //波特率加倍控制,SMOD位
  65   1        RI = 0; //清收发标志
  66   1        TI = 0;
  67   1        TR1 = 1; //启动定时器
  68   1        EA = 1; //开总中断
  69   1        ES = 1; //开串口中断
  70   1      }
  71          
  72          
  73          //向串口输出一个字符(非中断方式)
  74          void ComOutChar(unsigned char OutData)
  75          {
  76   1        SBUF = OutData; //输出字符
  77   1        while(!TI); //空语句判断字符是否发完
  78   1        TI = 0; //清TI
  79   1      }
  80          
  81          //串口接收中断
  82          void ComInINT(void) interrupt 4
  83          {
  84   1        if (RI) //判断是不是收完字符
  85   1          {
  86   2            ET0 = 0; //开定时中断
  87   2            TR0 = 0;
  88   2            TN = 0; //接收超时变量清零
  89   2            RI = 0; //RI清零
  90   2            Pack[PN] = SBUF; //存数据
  91   2            PN++;  //指针加1
  92   2            if (PN == 9)
  93   2              {
  94   3                PN = 0; //指针清零 一帧数据收完后
  95   3                PackCheck(); //调用数据包检查
  96   3              }
  97   2            else
  98   2              {
  99   3                TH0 = 0x70; //设定时值,收到数据时设定时值
 100   3                TL0 = 0x43;
 101   3                ET0 = 1; //定时器中断0开
 102   3                TR0 = 1; //启动定时器 定时器用于在一帧数据接收时如有丢包则返回错误信息12个0xEE
 103   3              }
 104   2          }
 105   1      }
 106          
 107          //定时器中断用于处理丢包
 108          void Timer0(void) interrupt 1
 109          {
 110   1        if (TN>2) // 帧中的两字符间隔tn*40ms则为出错
 111   1          {
 112   2            ET0 = 0;
 113   2            TR0 = 0; //关定时中断
 114   2      
 115   2            SendTeMsg(); //发送超时错误信息
 116   2            PN = 0; //pack指针清零
 117   2            TN = 0;
C51 COMPILER V7.09   MAIN                                                                  07/05/2005 16:40:31 PAGE 3   

 118   2          }
 119   1        else
 120   1          TN++;   
 121   1      }
 122          
 123          //信息包校验
 124          void PackCheck(void)
 125          {
 126   1        unsigned char CRCL = 0, CRCH = 0; //CRC高低字节暂存
 127   1        unsigned char TempCyc;
 128   1        
 129   1        for (TempCyc=0; TempCyc<7; TempCyc++)
 130   1          {
 131   2            CRCL = CRCL + Pack[TempCyc]; //把信息包中的前十个相加
 132   2            if (CY) //当CRCL大于0xFF时,CY为1
 133   2              CRCH++; //CY为1时CRCH加1
 134   2          }
 135   1        if ((CRCL == Pack[8]) && (CRCH == Pack[7]))
 136   1          RunPack(); //校验正确时执行包
 137   1        else
 138   1          SendCRCMsg(); //CRC校验不对时,这个包将不执行,并向PC发送CRC错误信息   
 139   1      }
 140          
 141          //发送SN错误信息
 142          void SendErrMsg(void)
 143          {
 144   1        ComOutChar(0x0A);
 145   1      }
 146          
 147          //发送命令完成
 148          void SendOKMsg(void)
 149          {
 150   1        ComOutChar(0x0B);
 151   1      }
 152          
 153          //发送CRC错误
 154          void SendCRCMsg(void)
 155          {
 156   1        ComOutChar(0x0C);
 157   1      }
 158          
 159          //发送超时错误
 160          void SendTeMsg(void)
 161          {
 162   1        ComOutChar(0x0D);
 163   1      }
 164          
 165          
 166          //发送命令不支持错误
 167          void SendNSMsg(void)
 168          {
 169   1        ComOutChar(0x0E);
 170   1      }
 171          
 172          //运行信息包
 173          void RunPack(void)
 174          {
 175   1        switch(Pack[0])
 176   1          {
 177   2            case 1: CheckID();  break;
 178   2            case 2: Write();    break;
 179   2            case 3: Read(); break;
C51 COMPILER V7.09   MAIN                                                                  07/05/2005 16:40:31 PAGE 4   

 180   2            default: SendNSMsg(); //命令不支持
 181   2          }
 182   1      }
 183          
 184          //校验序列号
 185          void CheckID(void)
 186          {
 187   1        unsigned char TempCyc;
 188   1        for (TempCyc=1; TempCyc<7; TempCyc++)
 189   1          {
 190   2            if (SNID[TempCyc-1]!=Pack[TempCyc])
 191   2              {
 192   3                TempCyc=7; //如有一个不对时跳出循环
 193   3                SN = 0;
 194   3              }
 195   2            else
 196   2              {
 197   3                SN = 1;
 198   3              }
 199   2          }
 200   1        if (SN)
 201   1          SendOKMsg(); //返回OK
 202   1        else
 203   1          SendErrMsg(); //发送SN错误信息
 204   1      }
 205          
 206          //发送信息包
 207          void SendPack(void)
 208          {
 209   1        unsigned char CRCL = 0, CRCH = 0; //CRC高低字节暂存
 210   1        unsigned char TempCyc;
 211   1        
 212   1        for (TempCyc=0; TempCyc<7; TempCyc++)
 213   1          {
 214   2            CRCL = CRCL + Pack[TempCyc]; //把信息包中的前十个相加
 215   2            if (CY) //当CRCL大于0xFF时,CY为1
 216   2              CRCH++; //CY为1时CRCH加1
 217   2          }
 218   1        Pack[7] = CRCH;
 219   1        Pack[8] = CRCL; //计算要发送的信息包CRC
 220   1        for (TempCyc=0; TempCyc<9; TempCyc++)
 221   1          ComOutChar(Pack[TempCyc]); //发送错误信息包
 222   1      }
 223          
 224          //写命令的信息包处理
 225          void Write(void)
 226          {
 227   1      if (SN)
 228   1      {
 229   2        switch(Pack[1])  //0为P0,1为P1,2为P2,3为关闭所有
 230   2          {
 231   3            case 0:
 232   3              P0 = Pack[2];
 233   3              SendOKMsg();
 234   3            break;
 235   3            case 1:
 236   3              P1 = Pack[2];
 237   3              SendOKMsg();
 238   3            break;
 239   3            case 2:
 240   3              P2 = Pack[2];
 241   3              SendOKMsg();  
C51 COMPILER V7.09   MAIN                                                                  07/05/2005 16:40:31 PAGE 5   

 242   3            break;
 243   3            case 3:
 244   3              P0 = 0xFF;
 245   3              P1 = 0xFF;
 246   3              P2 = 0xFF;
 247   3              SendOKMsg();
 248   3            break;
 249   3            case 4:
 250   3              P0 = 0x00;
 251   3              P1 = 0x00;
 252   3              P2 = 0x00;
 253   3              SendOKMsg();
 254   3            break;
 255   3            default: SendNSMsg();
 256   3          }
 257   2      }
 258   1      else
 259   1      {
 260   2        SendErrMsg();
 261   2      }
 262   1      }
 263          
 264          
 265          //跟据相应的芯片类型去读芯片
 266          void Read(void)
 267          {
 268   1      if (SN)
 269   1      {
 270   2        switch(Pack[1])  //0为P0,1为P1,2为P2,3为返回全部
 271   2          {
 272   3            case 0:
 273   3              Pack[1] = P0;
 274   3              Pack[2] = 0;
 275   3              Pack[3] = 0;
 276   3              SendPack();
 277   3            break;
 278   3            case 1:
 279   3              Pack[1] = 0;
 280   3              Pack[2] = P1;
 281   3              Pack[3] = 0;
 282   3              SendPack();
 283   3            break;
 284   3            case 2:
 285   3              Pack[1] = 0;
 286   3              Pack[2] = 0;
 287   3              Pack[3] = P2;
 288   3              SendPack();
 289   3            break;
 290   3            case 3:
 291   3              Pack[1] = P0;
 292   3              Pack[2] = P1;
 293   3              Pack[3] = P2;
 294   3              SendPack();
 295   3            break;
 296   3            default: SendNSMsg();
 297   3          }
 298   2      }
 299   1      else
 300   1      {
 301   2        SendErrMsg();
 302   2      }
 303   1      }
C51 COMPILER V7.09   MAIN                                                                  07/05/2005 16:40:31 PAGE 6   

 304          
 305          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    556    ----
   CONSTANT SIZE    =      7    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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