📄 pca_uart_device.lst
字号:
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 5
242 2 }
243 1 Tx_buffer = send_data;//将要发送的数据放入缓冲区
244 1 Tx_data_ready = 0;
245 1 if( Tx_timer_en != 1 )
246 1 {
247 2 Tx_time = (uint16)CL + (uint16)( CH << 8 );//读出计数器的值
248 2 Tx_time += TX_FULL_BIT;//加入一个位的时间
249 2 CCAP1L = (uint8)Tx_time;//放入模块1中
250 2 CCAP1H = (uint8)( Tx_time >> 8 );
251 2 CCAPM1 = TIMER_INI;//设置为定时模式
252 2 Tx_timer_en = 1;//设为1,即下次准备
253 2 }
254 1 }
255
256 /******************************************************************************
257 函数:Rx_enable()
258 功能:接收使能
259 说明:设置接收状态及PCA模块0低电平触发以允许使能接收
260 ******************************************************************************/
261 void Rx_enable(void)
262 {
263 1 Rx_state = S_RX_START_EDGE;//开始使能接收
264 1 CCAPM0 = NEG_CAP_INT;//设置为下降沿捕获
265 1 }
266
267 /******************************************************************************
268 函数:Rx_disable()
269 功能:禁止接收
270 说明:在程序开始时进行的状态初始化,禁止接收,之后通过接收使能函数开始
271 ******************************************************************************/
272 void Rx_disable(void)
273 {
274 1 Rx_state = S_RX_START_EDGE;//开始接收状态
275 1 CCAPM0 = DISABLED_MODE;//禁止模式
276 1 }
277
278 /******************************************************************************
279 函数:Receive()
280 功能:接收函数
281 说明:接收函数对应的模块为PCA模块0
282 ******************************************************************************/
283 void Receive(void)
284 {
285 1 if(Rx_state != S_RX_START_EDGE) //检测 起始下降沿 判断
286 1 {
287 2 if(Rx_state != S_RX_START_BIT) //检测 起始位 判断
288 2 {
289 3 if(Rx_state != S_RX_DATA_BIT ) //检测 数据位 判断
290 3 {
291 4 if( Rx_state != S_RX_STOP_BIT ) //检测 停止位 判断
292 4 {
293 5 Rx_state = S_RX_START_EDGE;//恢复初始状态
294 5 CCAPM0 = NEG_CAP_INT;//下降沿捕获
295 5 }
296 4 else
297 4 {
298 5 Rx_buffer = Rx_shift;//将接收到的数据存入变量中
299 5 CCAPM0 = NEG_CAP_INT;//恢复为下降沿捕获
300 5 Rx_state = S_RX_START_EDGE;//恢复初始状态
301 5 Rx_data_error = RXD_PIN;//可不用这句,但为了得到正确的状态加以描述
302 5 Rx_data_ready = 1;//开始准备
303 5 Send_UART(Rx_buffer);//将得到的数据发送到串口中观察结果
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 6
304 5 Display_LED();
305 5 }
306 4 }
307 3 else
308 3 { //接收数据
309 4 Rx_shift >>= 1;//接收数据,向右移动
310 4 if( RXD_PIN == 1 )//接收数据
311 4 {
312 5 Rx_shift |= 0x80;
313 5 }
314 4 else
315 4 {
316 5 Rx_shift &= 0x7f;
317 5 }
318 4 Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
319 4 Rx_time += RX_FULL_BIT;
320 4 CCAP0L = (uint8)(Rx_time); //低8位重新放入寄存器中
321 4 CCAP0H = (uint8)( Rx_time >> 8 );//高8位重新放入寄存器中
322 4 Rx_count--; //状态递减,也就是发送位一位一位的进行
323 4 if( Rx_count == 0 )
324 4 {
325 5 Rx_state = S_RX_STOP_BIT;
326 5 }
327 4 }
328 3 }
329 2 else
330 2 { //接收起始位
331 3 if( RXD_PIN != 1 )
332 3 {
333 4 Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
334 4 Rx_time += RX_FULL_BIT;
335 4 CCAP0L = (uint8)(Rx_time);
336 4 CCAP0H = (uint8)( Rx_time >> 8 );
337 4 Rx_state = S_RX_DATA_BIT;
338 4 Rx_count = 0x08;
339 4 }
340 3 else
341 3 {
342 4 Rx_data_error = 1;//错误状态
343 4 Rx_state = S_RX_START_BIT;
344 4 }
345 3 }
346 2 }
347 1 else
348 1 { //接收起始位初始化
349 2 Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
350 2 Rx_time += RX_HALF_BIT;//这里延时半个位,以便之后进行采样
351 2 CCAP0L = (uint8)(Rx_time);
352 2 CCAP0H = (uint8)( Rx_time >> 8 );
353 2 CCAPM0 = TIMER_INI;
354 2 Rx_state = S_RX_START_BIT;
355 2 }
356 1 }
357
358 /******************************************************************************
359 函数:Transmit()
360 功能:发送函数
361 说明:发送函数对应的模块为PCA模块1
362 ******************************************************************************/
363 void Transmit(void)
364 {
365 1 if( Tx_state != S_TX_START_BIT ) //是否发送起始位 状态
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 7
366 1 {
367 2 if( Tx_state != S_TX_DATA_BIT) //是否发送数据位 状态
368 2 {
369 3 if( Tx_state != S_TX_STOP_BIT ) //是否发送停止位 状态
370 3 {
371 4 if( Tx_state != S_TX_STOP_END ) //是否发送结束 状态
372 4 { //不是
373 5 Tx_state = S_TX_START_BIT;
374 5 Tx_data_ready = 1;
375 5 CCAPM1 = DISABLED_MODE;
376 5 }
377 4 else
378 4 { //是
379 5 Tx_state = S_TX_START_BIT;
380 5 if( Tx_data_ready != 1 ) //是否成功发送停止位
381 5 { //没有
382 6 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
383 6 Tx_time += TX_FULL_BIT;
384 6 CCAP1L = (uint8)Tx_time;
385 6 CCAP1H = (uint8)( Tx_time >> 8 );
386 6 }
387 5 else
388 5 { //有
389 6 CCAPM1 = DISABLED_MODE;
390 6 Tx_timer_en = 0; //使能发送定时器标志位,0为禁止
391 6 }
392 5 }
393 4 }
394 3 else
395 3 {
396 4 TXD_PIN = 1;
397 4 Tx_state = S_TX_STOP_END;
398 4 Tx_data_ready = 1;
399 4 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
400 4 Tx_time += TX_FULL_BIT;
401 4 CCAP1L = (uint8)Tx_time;
402 4 CCAP1H = (uint8)( Tx_time >> 8 );
403 4 }
404 3 }
405 2 else
406 2 { //发送数据位
407 3 if( ( Tx_shift & 0x01) == 0x01 )
408 3 {
409 4 TXD_PIN = 1;
410 4 }
411 3 else
412 3 {
413 4 TXD_PIN = 0;
414 4 }
415 3 Tx_shift >>= 1;
416 3 Tx_count--;
417 3 if( Tx_count == 0 )
418 3 {
419 4 Tx_state = S_TX_STOP_BIT;
420 4 }
421 3 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
422 3 Tx_time += TX_FULL_BIT;
423 3 CCAP1L = (uint8)Tx_time;
424 3 CCAP1H = (uint8)( Tx_time >> 8 );
425 3 }
426 2 }
427 1 else
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 8
428 1 { //发送起始位
429 2 TXD_PIN = 0;
430 2 Tx_state = S_TX_DATA_BIT;
431 2 Tx_count = 0x08;
432 2 Tx_shift = Tx_buffer;
433 2 Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
434 2 Tx_time += TX_FULL_BIT;
435 2 CCAP1L = (uint8)Tx_time;
436 2 CCAP1H = (uint8)( Tx_time >> 8 );
437 2 }
438 1 }
439
440 /******************************************************************************
441 函数:delay()
442 功能:延时函数
443 说明:这里采用的是软件延时 ,延时一点时间
444 ******************************************************************************/
445 void delay(uint16 idata In,uint16 idata Out)
446 {
447 1 uint16 idata i,j;
448 1 for( i = 0;i < In;i++ )
449 1 {
450 2 for( j = 0;j < Out;j++ )
451 2 {
452 3 ;
453 3 }
454 2 }
455 1 }
456
457 /******************************************************************************
458 函数:PCA_IRQ()
459 功能:PCA串口中断服务程序
460 说明:采用PCA作串口时,模块1作发送端,模块0作接收端
461 ******************************************************************************/
462 void PCA_IRQ(void) interrupt 7
463 {
464 1 if( CCF0 == 1 )//模块0作为接收端
465 1 {
466 2 CCF0 = 0;
467 2 Receive();//接收函数
468 2 }
469 1 if( CCF1 == 1 )//模块1作发送端
470 1 {
471 2 CCF1 = 0;
472 2 Transmit();//发送函数
473 2 }
474 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 798 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
IDATA SIZE = 16 4
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 + -