📄 uart.lst
字号:
151 2 TI = 0; // 清发送标志
152 2
153 2 if (uart_tlen!=0) // 发送未结束
154 2 {
155 3 SBUF = uart_buff[uart_dptr]; // 发送数据
156 3 uart_dptr++; // 发送指针加1
157 3 uart_tlen--; // 发送长度减1
158 3 }
159 2 else // 发送结束
160 2 {
161 3 uart_dptr = 0; // 重置发送指针
162 3 DRE = 0; // 发送结束, 设485为接收状态
163 3 LED = 1; // 关LED
164 3 }
165 2 }
166 1 }
167
168
169 /*******************************************************************************
170 * 名 称: uart_init
171 * 功 能: uart初始化
172 * 入口参数: 无
173 * 出口参数: 无
174 *******************************************************************************/
175 void uart_init (void)
176 {
177 1 uart_dptr = 0; // 置uart收发缓冲区读写指针初值
178 1 uart_over = 10; // 置uart超时计数器初值: 10*10mS = 100mS
C51 COMPILER V8.15 UART 12/25/2008 21:36:25 PAGE 4
179 1 uart_flag = 0; // 置uart帧接收标志初值
180 1 uart_tlen = 0; // 置uart发送数据长度初值
181 1
182 1 DRE = 0; // 设定485为接收状态
183 1
184 1 TH1 = 0xfd; // 设定TH1初值, 波特率: 9600bps
185 1 TL1 = 0xfd; // 设定TL1初值, 波特率: 9600bps
186 1 SCON = 0x40; // 设定串口工作方式
187 1 TMOD = (TMOD & 0x0f) | 0x20; // 设定T1工作方式
188 1 TR1 = 1; // 启动T1
189 1 ES = 1; // 允许串口中断
190 1 }
191
192
193 /*******************************************************************************
194 * 名 称: uart_send
195 * 功 能: 启动uart发送数据
196 * 入口参数: data_leng: 发送数据长度
197 * 出口参数: 无
198 *******************************************************************************/
199 void uart_send (uint data_leng)
200 {
201 1 uchar i;
202 1 uint crc;
203 1
204 1 LED = 0; // 开LED
205 1 DRE = 1; // 置485为发送状态
206 1
207 1 uart_tlen = data_leng; // 置发送帧长度
208 1 uart_dptr = 0; // 发送数据指针
209 1
210 1 crc = 0xffff; // 置CRC初值
211 1
212 1 for (i=0; i<(data_leng-2); i++) // 循环计算CRC
213 1 {
214 2 crc = calc_crc(crc, uart_buff[i]); // 计算CRC
215 2 }
216 1
217 1 uart_buff[i+0] = crc; // 置crc低8位
218 1 uart_buff[i+1] = crc >> 8; // 置crc高8位
219 1
220 1 TI = 1; // 启动发送
221 1 }
222
223
224 /*******************************************************************************
225 * 名 称: calc_crc
226 * 功 能: 计算CRC
227 * 入口参数: crc: crc初值, crc_data: 校验数据
228 * 出口参数: crc计算结果
229 *******************************************************************************/
230 uint calc_crc (uint crc_data, uchar chk_data)
231 {
232 1 uchar i;
233 1
234 1 crc_data = crc_data ^ chk_data; // 异或校验数据
235 1
236 1 for (i=0; i<8; i++) // 循环处理8bit
237 1 {
238 2 if (crc_data & 0x01) crc_data = (crc_data >> 1) ^ 0xa001; // crc低位为1, crc右移异或0xa001
239 2 else crc_data = crc_data >> 1; // crc低位为0, crc右移
240 2 }
C51 COMPILER V8.15 UART 12/25/2008 21:36:25 PAGE 5
241 1
242 1 return (crc_data); // 返回crc计算结果
243 1 }
244
245
246 /*******************************************************************************
247 * 名 称: delay_1ms
248 * 功 能: 延时1毫秒, a(2b+3)*12/11.0592
249 * 入口参数: count: 要延时的毫秒数
250 * 出口参数: 无
251 *******************************************************************************/
252 void delay_1ms (uchar count)
253 {
254 1 uchar a, b;
255 1
256 1 for ( ; count!=0; count--)
257 1 {
258 2 for (a=22; a!=0; a--)
259 2 {
260 3 for (b=19; b!=0; b--) ;
261 3 }
262 2 }
263 1 }
264
265 //测试用。。。。。。
266 void sss(void)
267 {
268 1 /*
269 1 uchar i;
270 1 LED = 0; // 开LED
271 1 DRE = 1; // 置485为发送状态
272 1
273 1 for(i=0;i<16;i++)
274 1 uart_buff[i]=i;
275 1 uart_tlen=16;
276 1 uart_dptr=0;
277 1 TI=1;//启动发送
278 1 */
279 1 delay_1ms(2); // 延时2mS
280 1 uart_buff[0] = LOCL_ADDR; // 1: 地址
281 1 uart_buff[1] = curt_brit/100; // 2: 功能码
282 1 uart_buff[2] = curt_brit%100; // 3: 字节数
283 1 uart_buff[3] = 0X88; // 4: 数据高字节
284 1 uart_buff[4] = CH0/256; // 5: 数据低字节
285 1 uart_buff[5] = CH0%256; // 6: 数据高字节
286 1 uart_buff[6] = CH1/256; // 7: 数据低字节
287 1 uart_buff[7] = CH1%256; // 8: CRC校验高位
288 1 uart_buff[8] = idval; // 9: CRC校验底位
289 1
290 1 uart_buff[9] = 0; // 9: CRC校验底位
291 1 uart_buff[10] = 0; // 9: CRC校验底位
292 1 uart_send(11); // 发送应答帧
293 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 524 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 4
IDATA SIZE = ---- ----
C51 COMPILER V8.15 UART 12/25/2008 21:36:25 PAGE 6
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 + -