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 + -
显示快捷键?