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

📄 serial.lst

📁 ADUC的周立功7290可以显示的程序
💻 LST
字号:
C51 COMPILER V8.02   SERIAL                                                                08/13/2008 08:26:11 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*----------------------------------------------------------------------------
   2          名  称:serial.c
   3          功  能:aduc848串口相关函数的实现
   4          版  本:0.1
   5          负责人:邓健
   6          历  史:
   7                 2007.7.11 created by Jiandeng
   8          ----------------------------------------------------------------------------*/
   9          #include<aduc845.h>
  10          
  11          #define RX_IDL  0
  12          #define RX_HDR  1
  13          #define RX_ADD  2
  14          #define RX_CMD  3
  15          #define RX_LEN  4
  16          #define RX_DAT  5
  17          #define RX_CHK  6
  18          #define RX_X16  7
  19          #define RX_END  255
  20          unsigned char xdata serialRxData[20];
  21          unsigned char xdata serialTxData[2500];
  22          unsigned int  serialTxLEN;
  23          unsigned char serialRxADD,serialRxCMD,serialRxLEN;
  24          unsigned char serialRxStatus = RX_IDL;
  25          extern unsigned char ADDR;
  26          /**********************************************************
  27          串口初始化,波特率设置为115200,使能中断
  28          ***********************************************************/
  29          void SerialInit(void)
  30          {
  31   1              T3CON = 0x82;   //115200 Baud rate
  32   1              T3FD = 0x2D;
  33   1              SCON = 0x52; 
  34   1              ES=1;                   //Enable interrupt
  35   1      }
  36          /**********************************************************
  37          串口发送,把发送缓冲区里的数据通过串口发送出去
  38          ***********************************************************/
  39          void SerialTx(unsigned int len)
  40          {
  41   1              serialTxLEN = len;
  42   1              SBUF = 0xFE;    
  43   1      }
  44          
  45          /**********************************************************
  46          串口发送
  47          【add】 从机地址
  48          【cmd】 命令 
  49          【len】 数据长度
  50                  待发送的数据保存在serialTxData[10]开始先
  51          ***********************************************************/
  52          void SerialSend(unsigned char add,unsigned char cmd,unsigned int len)
  53          {
  54   1              unsigned char serialTxCHK = 0;
  55   1              unsigned int i;
C51 COMPILER V8.02   SERIAL                                                                08/13/2008 08:26:11 PAGE 2   

  56   1      
  57   1              serialTxData[0] = 0xFE;
  58   1              serialTxData[1] = 0x68;
  59   1              serialTxData[2] = add;
  60   1              serialTxData[3] = add;
  61   1              serialTxData[4] = cmd;
  62   1              serialTxData[5] = cmd;
  63   1              serialTxData[6] = len>>8;
  64   1              serialTxData[7] = len;
  65   1              serialTxData[8] = len>>8;
  66   1              serialTxData[9] = len;
  67   1      
  68   1              for(i = 10;i < 10 + len;i ++)                   //checksum
  69   1              {
  70   2                      serialTxCHK += serialTxData[i];
  71   2              }
  72   1      
  73   1              serialTxData[10 + len] = serialTxCHK;
  74   1              serialTxData[11 + len] = 0x16;
  75   1              SerialTx(12 + len);
  76   1      }
  77          
  78          /**********************************************************
  79          串口中断函数
  80          ***********************************************************/
  81          void int_serial() interrupt 4
  82          {
  83   1              static unsigned char serialRxCounter,serialRxCHK;
  84   1              static unsigned int serialTxCounter;
  85   1              if(1 == RI)
  86   1              {
  87   2                      RI = 0;                 
  88   2                      switch(serialRxStatus)
  89   2                      {                                          
  90   3                              case RX_IDL:                                                                            //空闲状态,接收0xFE进入HDR状态   
  91   3                                      if(SBUF == 0xFE)
  92   3                                      {
  93   4                                              serialRxStatus = RX_HDR;break;                                   
  94   4                                      }                                                                                               //HDR状态,接收0x68开始接收地址,接收到0xFE则保持HDR状态
  95   3                              case RX_HDR:
  96   3                                      if(SBUF == 0x68)
  97   3                                      {
  98   4                                              serialRxStatus = RX_ADD;
  99   4                                      }
 100   3                                      else if(SBUF != 0xFE)
 101   3                                      {
 102   4                                              serialRxStatus = RX_IDL;                                                
 103   4                                      }
 104   3                                      break;                                                  
 105   3                              case RX_ADD:                                                                            //ADD状态,接收1B的地址,重复发送两次,接收成功则进入CMD状态
 106   3                                      if(serialRxCounter == 0)
 107   3                                      {
 108   4                                              serialRxADD = SBUF;
 109   4                                              serialRxCounter = 1;
 110   4                                      }
 111   3                                      else
 112   3                                      {       
 113   4                                              serialRxCounter = 0;
 114   4                                              if(SBUF == serialRxADD && serialRxADD == ADDR)
 115   4                                              {
 116   5                                                      serialRxStatus = RX_CMD;                                                        
 117   5                                              }
C51 COMPILER V8.02   SERIAL                                                                08/13/2008 08:26:11 PAGE 3   

 118   4                                              else
 119   4                                              {
 120   5                                                      serialRxStatus = RX_IDL;
 121   5                                              }
 122   4                                      }
 123   3                                      break;
 124   3                              case RX_CMD:                                                                            //CMD状态,1B命令,重复发送两次,接收成功则进入LEN状态
 125   3                                      if(serialRxCounter == 0)
 126   3                                      {
 127   4                                              serialRxCMD = SBUF;
 128   4                                              serialRxCounter = 1;
 129   4                                              }
 130   3                                      else
 131   3                                      {       
 132   4                                              serialRxCounter = 0;
 133   4                                              if(SBUF == serialRxCMD)
 134   4                                              {
 135   5                                                      serialRxStatus = RX_LEN;                                                        
 136   5                                              }
 137   4                                              else
 138   4                                              {
 139   5                                                      serialRxStatus = RX_IDL;
 140   5                                              }
 141   4                                      }
 142   3                                      break;
 143   3                              case RX_LEN:                                                                            //LEN状态,接收2B数据长度,重复两次,这里只考虑了低字节,接收成功进入DAT或者CHK

⌨️ 快捷键说明

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