📄 comm.lst
字号:
C51 COMPILER V8.16 COMM 12/10/2009 11:19:18 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE COMM
OBJECT MODULE PLACED IN comm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE comm.c LARGE BROWSE INTVECTOR(0X1000) DEBUG OBJECTEXTEND
line level source
1 #include "global.h"
2
3
4 unsigned char xdata TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
5 unsigned char xdata *inTxBuf,*outTxBuf, *inRxBuf,*outRxBuf;//收发缓冲区读写指针
6 //inRxBuf指向收的收,outRxBuf指向收缓冲区的读。
7 bit TIflag=1;//Note:It must be 1.
8
9
10
11
12 /******************************************************************************
13 ** 函数: UART0_Init()
14 ** 入参:
15 ** 返回:
16 ** 说明:
17 ** UART0_Init
18 ** Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
19 ******************************************************************************/
20
21 void UART0_Init (void)
22 {
23 1 SCON0 = 0x50; // SCON0: 8-bit variable bit rate
24 1 // level of STOP bit is ignored
25 1 // RX enabled
26 1 // ninth bits are zeros
27 1 // clear RI0 and TI0 bits
28 1 if (SYSCLK/BAUDRATE/2/256 < 1) {
29 2 TH1 = -(SYSCLK/BAUDRATE/2);
30 2 CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
31 2 CKCON |= 0x08;
32 2 } else if (SYSCLK/BAUDRATE/2/256 < 4) {
33 2 TH1 = -(SYSCLK/BAUDRATE/2/4);
34 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
35 2 CKCON |= 0x09;
36 2 } else if (SYSCLK/BAUDRATE/2/256 < 12) {
37 2 TH1 = -(SYSCLK/BAUDRATE/2/12);
38 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
39 2 } else {
40 2 TH1 = -(SYSCLK/BAUDRATE/2/48);
41 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
42 2 CKCON |= 0x02;
43 2 }
44 1
45 1 TL1 = TH1; // init Timer1
46 1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
47 1 TMOD |= 0x20;
48 1 TR1 = 1; // START Timer1
49 1 Buff_Init();
50 1
51 1 }
52
53 /******************************************************************************
54 ** 函数: Buff_Init (void)
55 ** 入参:
C51 COMPILER V8.16 COMM 12/10/2009 11:19:18 PAGE 2
56 ** 返回:
57 ** 说明:
58 ******************************************************************************/
59 void Buff_Init (void)
60 {
61 1
62 1 inTxBuf=TxBuf;outTxBuf=TxBuf;
63 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
64 1 EA=1;ES0=1;
65 1
66 1 }
67
68 /******************************************************************************
69 ** 函数: UATR0_ISR() interrupt
70 ** 入参:
71 ** 返回:
72 ** 说明: interrupt 4
73 ******************************************************************************/
74
75 void serial(void) interrupt 4
76 {
77 1
78 1 unsigned char *t;
79 1
80 1 if(TI0)
81 1 {
82 2 TI0=0;
83 2 if(inTxBuf==outTxBuf) {TIflag=1;return;}//TxBuf Empty
84 2 SBUF0=*outTxBuf; outTxBuf++;
85 2 if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
86 2 }
87 1
88 1
89 1 if (RI0)
90 1 {
91 2 RI0=0;
92 2 //这里,缓冲区的读写方式跟8019as的ram区一样,是循环读,而且也用了
93 2 //两个指针,一个用来收,一个用来读
94 2 t=inRxBuf;t++; //保留指针位置
95 2 if(t==RxBuf+LenRxBuf) t=RxBuf; //如果到缓冲区末尾,则返回缓冲区头
96 2 if(t==outRxBuf) return; //如果相等,说明缓冲区满了,RxBuf Full
97 2 *inRxBuf=SBUF0;
98 2 inRxBuf=t;
99 2
100 2 }
101 1
102 1
103 1 }
104
105 /**********************************************************************
106 ** 函数原型: void Printf_Char(u8_t ascii)
107 ** 参数说明: ascii: 发送到串口的ASCII
108 ** 返 回 值: 无
109 ** 说 明: 往串口发送一个字符
110 ************************************************************************/
111
112 void Printf_Char(unsigned char ascii)
113 {
114 1 unsigned char *t;
115 1
116 1 ES0=0;
117 1 if(TIflag)
C51 COMPILER V8.16 COMM 12/10/2009 11:19:18 PAGE 3
118 1 {
119 2 TIflag=0;
120 2 TI0=1;
121 2 }
122 1 t=inTxBuf;t++;
123 1 if(t==TxBuf+LenTxBuf) t=TxBuf;
124 1 if(t==outTxBuf) {ES0=1;return;} //TxBuf Full
125 1 *inTxBuf=ascii;
126 1 inTxBuf=t;
127 1 ES0=1;
128 1 }
129
130
131 /**********************************************************************
132 ** 函数原型: void Printf_String(u8_t code *string)
133 ** 参数说明: string: 字符串的起始地址
134 ** 返 回 值: 无
135 ** 说 明: 向串口发送字符串,碰到0x00结束
136 ************************************************************************/
137 void Printf_String(unsigned char *string)
138 {
139 1
140 1 while(*string!=0)
141 1 {
142 2 Printf_Char(*string);
143 2 string++;
144 2 }
145 1 }
146
147 /**********************************************************************
148 **函数原型: Get_Char()
149 **参数说明: 无
150 **返 回 值: temp
151 **说 明: 从串口缓冲区接收一个字符
152 ************************************************************************/
153 bit Get_Char(unsigned char xdata *ch)
154 {
155 1
156 1 ES0=0;
157 1 if(inRxBuf==outRxBuf) {ES0=1;return 0;} //RxBuf Empty
158 1 *ch=*outRxBuf; outRxBuf++; //数据被读走,读指针加1
159 1 if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf; //如果读指针到缓冲区尾部,则返回到头部
160 1 ES0=1;
161 1 return 1;
162 1
163 1 }
164
165 /**********************************************************************
166 **函数原型: process_uart
167 **入口参数: com_len
168 **出口参数: 无
169 **返 回 值: 无
170 **功能说明: 接收上位机的配置,检测串口有数据,等待一帧数据结束处理
171 ***********************************************************************/
172
173 void process_uart()
174 {
175 1 unsigned char dat_len=0;
176 1 unsigned char xdata ch;
177 1
178 1 while(Get_Char(&ch))
179 1 {
C51 COMPILER V8.16 COMM 12/10/2009 11:19:18 PAGE 4
180 2 delayms(2);
181 2 combuf[dat_len]=ch;
182 2 dat_len++;
183 2 if(dat_len==maxlen+1) dat_len=0;
184 2 if(dat_len==32) //简单的利用串口长度来确认帧到来
185 2 {
186 3 if((combuf[30]==0x55)&&(combuf[31]==0xaa))
187 3 {
188 4 dat_len=0;
189 4 process_incmd(); //处理串口接收的配置表
190 4 }
191 3 else
192 3 {
193 4 dat_len=0; //不处理
194 4 }
195 3 }
196 2
197 2
198 2 }
199 1
200 1 }
201
202
203 /**********************************************************************
204 **函数原型: process_incmd
205 **入口参数: 无
206 **出口参数: 无
207 **返 回 值: 无
208 **功能说明: 处理接收的PC命令
209 ***********************************************************************/
210
211 void process_incmd()
212 {
213 1
214 1 READER_PCS xdata *pcs;
215 1
216 1 pcs=(READER_PCS xdata *)(combuf);
217 1
218 1 switch(pcs->pcs_cmd)
219 1 {
220 2 case PCS_read_READER:
221 2 PCS_r_reader(); //pc命令上传读卡机参数
222 2 break;
223 2
224 2 case PCS_read_TAG:
225 2 PCS_rw_tag(PCS_read_TAG); //pc命令上传微波卡参数
226 2 break;
227 2
228 2 case PCS_write_READER: //pc命令配置读卡机参数
229 2 PCS_w_reader();
230 2 break;
231 2
232 2 case PCS_write_TAG:
233 2 PCS_rw_tag(PCS_write_TAG); //pc命令配置微波卡参数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -