com_prc.lst

来自「楼宇对讲系统里用的文字信息接收。用可视对讲话机的TFT屏可看到从管理中心发过来的」· LST 代码 · 共 1,318 行 · 第 1/5 页

LST
1,318
字号
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 1   


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

stmt level    source

   1          /***********************************************************/
   2          /*                                                                                     */
   3          /*                CPU:AT89c55   20MHZ                      */
   4          /*                Copyright  2004.09  Comelit              */
   5          /*                AUTHOR:  LV_XIAO_LU                      */
   6          /*                                                         */
   7          /***********************************************************/
   8          
   9          /********************************************************/
  10          /*                                                      */
  11          /*     通讯波特率:4800bps或9600bps                     */
  12          /*     数据帧格式:                                     */
  13          /*                起动位  1BIT                          */
  14          /*                数据位  8BIT                          */
  15          /*                停止位  1BIT                          */
  16          /*      一帧通讯共39字节     暂用4800bps                */
  17          /********************************************************/
  18          #include "reg52.h"
  19          #include "define.h"
  20          #include "variable.h"
  21          #include "typedef.h"
  22          #include "function.h"
  23          #include "intrins.h"
  24          
  25          #define CD_STX 0x7f                   //PC-->终端话机通讯起始码
  26          #define CD_STX_P 0x81                 //终端-->PC响应时通讯起始码
  27          
  28          /*PC-->终端 群发信息时*/
  29          #define CD_STX_SEND0_NEXT      0x20   //第一次起始群发信息,还有后续帧
  30          #define CD_STX_SEND0_OVER      0x21   //第一次起始群发信息,无后续帧
  31          
  32          
  33          #define CD_STX_SEND1_NEXT      0x40   //第二次起始群发信息,还有后续帧
  34          #define CD_STX_SEND1_OVER      0x41   //第二次起始群发信息,无后续帧
  35          
  36          
  37          #define CD_STX_SEND2_NEXT      0x60   //第三次起始群发信息,还有后续帧
  38          #define CD_STX_SEND2_OVER      0x61   //第三次起始群发信息,无后续帧
  39          
  40          
  41          /*PC--》终端 单发信息时*/
  42          #define CD_SSEND_NEXT          0x80   //起始单发信息,还有后续帧
  43          #define CD_SSEND_OVER          0x81   //起始单发信息,无后续帧
  44          
  45          /*终端-->PC  */
  46          #define CD_RECEIVE_OK          0xa0    // 终端发送回接收正常信息经PC机
  47          
  48          #define CD_SET_ADDR            0xb0    //PC机向终端发送地址信息
  49          
  50          /*串口工作方式:方式1*/
  51          /* SMOD = 0 OSC:11.0592MHZ*/
  52          //#define BPS9600  0xfd
  53          //#define BPS4800  0xfa 
  54          
  55          /* SMOD = 0 OSC:20MHZ*/
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 2   

  56          #define BPS9600  0xfd
  57          #define BPS4800  0xf5 //0xf6 
  58          
  59          #define MODE_0 0x00
  60          #define MODE_1 0x40
  61          #define MODE_2 0x80
  62          #define MODE_3 0xc0 
  63          
  64          #define T1_MOD2 0x20
  65          
  66          #define FULL   (-1)
  67          #define EMPTY  (-1)
  68          
  69          #define  HRX_SIZE 120
  70          #define  HTX_SIZE 7
  71          
  72          #define         COM_ERROR               -1
  73          #define         NORMAL_END              0
  74          #define         NOW_COMMUNI             1
  75          
  76          #define  ENABLE_TX 0
  77          #define  DIS_TX 1
  78          sbit DE = P1^5;     //active:  high
  79          
  80          
  81          void Hsio_init(unsigned char baud_rate);
  82          void Hsio_prc(void);
  83          void Command_hd(void);
  84          unsigned char xdata* Store_to_mesdata( register unsigned char xdata *src_p,unsigned char xdata *dst_p,regi
             -ster unsigned char num);
  85          void Trm_hd(void);
  86          void Err_prc(void);
  87          unsigned char   Tget_data(void);
  88          unsigned char xdata *Hrxst_adr( void );
  89          unsigned char  Hget( void );
  90          unsigned char xdata *Hrxrd_adr( void );
  91          void Htx_st(void);
  92          void Htx_prc(void);
  93          /***********************************************/
  94          /***********************************************/           
  95          void Hsio_init(unsigned char baud_rate)
  96          {
  97   1      
  98   1          hrx_str = hrx_buff;
  99   1              hrx_rd = hrx_buff;
 100   1              TMOD |= T1_MOD2 ;
 101   1              TH1 = baud_rate;
 102   1              TL1 = baud_rate;
 103   1              SCON = MODE_1 ;
 104   1              PCON = 0x00;
 105   1              TI=0;
 106   1          RI=0; 
 107   1              TR1 = 1 ;
 108   1              REN = 1;
 109   1          ES=1;
 110   1              DE = DIS_TX ;         //enable receive
 111   1          com_cnt = 3;
 112   1      
 113   1      }
 114          
 115          
 116          /***********************************************/
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 3   

 117          /***********************************************/  
 118          void Hsio_prc(void) interrupt 4
 119          {
 120   1         register unsigned char receive_data;
 121   1         register char xdata *next;
 122   1      
 123   1         if(TI == 1)   
 124   1         {
 125   2            TI = 0;
 126   2                htx_cnt++;
 127   2                if(htx_cnt<7)
 128   2                   SBUF = htx_buff[htx_cnt];
 129   2                else
 130   2                {
 131   3                       _nop_();
 132   3                       _nop_();
 133   3                       DE = DIS_TX ;
 134   3                }
 135   2         }
 136   1         else if(RI == 1)          //接收产生的中断
 137   1         {
 138   2            
 139   2                receive_data = SBUF;   //保存数据
 140   2                RI = 0 ;
 141   2                if((receive_step == 0)&&(receive_data == CD_STX))
 142   2           
 143   2            {
 144   3                    if( (int)(next = Hrxst_adr()) != FULL )
 145   3                {
 146   4                       *hrx_str = receive_data ;
 147   4                        hrx_str = next ;
 148   4                        receive_step++;
 149   4                                time_out = TM100MS;         //超时等待
 150   4                    } 
 151   3                        
 152   3            } 
 153   2                else if((receive_step != 0)&&(time_out != 0))
 154   2      //        else if(receive_step != 0)
 155   2                {
 156   3                   if( (int)(next = Hrxst_adr()) != FULL )
 157   3                {
 158   4                       *hrx_str = receive_data ;
 159   4                        hrx_str = next ;
 160   4                        receive_step++;
 161   4                    } 
 162   3                                                        
 163   3                }
 164   2            else if((receive_step != 0)&&(time_out == 0))      //超时处理
 165   2                {
 166   3                    while(receive_step-- != 0)  //退回到起先存贮的位置
 167   3                        {
 168   4                            hrx_str--;
 169   4                                if(hrx_str == (unsigned char xdata*)((unsigned int)hrx_buff - 1) )  //退到顶了,就返回到底部
 170   4                                hrx_str = (unsigned  char xdata*)hrx_buff + HRX_SIZE - 1 ;                    
 171   4                    }
 172   3                        if(receive_data == CD_STX)        //超时后接收到的第一个字节是CD_STX吗?
 173   3                        {
 174   4                           if( (int)(next = Hrxst_adr()) != FULL )
 175   4                   {
 176   5                           *hrx_str = receive_data ;
 177   5                            hrx_str = next ;
 178   5                            receive_step++;
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 4   

 179   5                                    time_out = TM100MS;         //超时等待
 180   5                       }
 181   4                        }
 182   3                }
 183   2                                     
 184   2            if((receive_step == 39)&&(time_out != 0))
 185   2      //        if(receive_step == 39)
 186   2                {
 187   3                    receive_step = 0;
 188   3                        one_frame_F = 1;
 189   3                }
 190   2                
 191   2         }
 192   1      }
 193                                                            
 194          /****************************************************************/
 195          /****************************************************************/
 196                       
 197          
 198          
 199          
 200          /* 由于一帧信息共有39个字节,所以当接收到所有39个字节时才进入该函数处理*/
 201          /*对于4800BPS时,大概要81.25ms才需处理一次*/
 202          
 203          /****************************************************************/
 204          /****************************************************************/
 205          
 206          void Command_hd(void)
 207          {
 208   1      //    unsigned char parity; 
 209   1      //      unsigned char xdata *htx_p = htx_buff;
 210   1      
 211   1              switch(rx_prc_buff[1]&0xe0)         //先判高3位
 212   1               {
 213   2                    case 0x20:                    //第一次群发
 214   2                case 0x40:                    //第二次群发
 215   2                        case 0x60:                    //第三次群发
 216   2                                    if( 0 == send_all_suc_F )
 217   2                                    {
 218   3                                                     if(((rx_prc_buff[1]&0x1e)>>1)== rx_screen_cnt) //只有发送屏数和接收屏数相
 219   3                                                     {                                  //等才能继续处理
 220   4                                                             send_all_suc_F = 1;
 221   4                                                         if(rx_screen_cnt == 0)          //第一屏,初始化信息数据指针
 222   4                                                                  mes_data_p = mes_data;
 223   4                               
 224   4                                                              mes_data_p = Store_to_mesdata(&rx_prc_buff[2],mes_data_p,36);
 225   4                                                              rx_screen_cnt++;                                                                                                  
 226   4                                                          if((rx_prc_buff[1]&0x01)== 1 )
 227   4                                                              {
 228   5                                                              received_mes_F = 1;
 229   5                                                                              rx_screen_cnt = 0;
 230   5                                                                              *mes_data_p = '\0';         //放信息结束标志
 231   5                                                                      }
 232   4                                                          }
 233   3      
 234   3                                                }
 235   2      
 236   2                                                if(0x60 == (rx_prc_buff[1]&0xe0))        //第三次重发时
 237   2                                                {    
 238   3                                                     if(send_all_suc_F == 1)
 239   3                                                             send_all_suc_F = 0;
 240   3                                                         else 
C51 COMPILER V7.06   COM_PRC                                                               06/10/2005 13:26:30 PAGE 5   

 241   3                                                             rx_screen_cnt = 0;
 242   3                                                }
 243   2      
 244   2                                                break;                                                                                                                
 245   2               
 246   2                                                  

⌨️ 快捷键说明

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