找回密码
 注册会员
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 串口通讯例程.rar

串口通讯例程.rar

 

51系列串口通讯例程:
51系列单片机串口通讯例程

以下为部分代码,完整源代码见附件

  1. // 题目:串口初始化C代码
  2. // 要求:
  3. // 1.波特率1200bps,无奇偶校验,停止位1,数据位8
  4. // 2.定时器T1做波特率发生器

  5. // 软件模拟测试说明:
  6. // 1.这个测试采用查询方式进行串口通讯
  7. // 2.将软件仿真环境的晶震设为11.0592 MHz
  8. // 3.软件模拟全速运行, 观察波特率是1200bps
  9. // 4.在串口1中输入数字或字母,可观察到通讯是否有误。

  10. //#pragma src

  11. #include <reg51.h>

  12. //串口初始化
  13. void serial_init(void)
  14. {
  15. //ET1 = 0; //CLR 0ABH ;禁止T1中断
  16. TMOD = 0x20; //MOV 89H,#20H ;timer 1 mode 2: 8-Bit reload(定时器T1 模式2: 8位自动初值重装)
  17. TH1 = 0xE8; //MOV 8DH,#0E8H
  18. TL1 = 0xE8; //MOV 8BH,#0E8H ;1200bps, 11.059
  19. TR1 = 1; //SETB 8EH ;启动定时器1

  20. SCON = 0x50; // mode 1: 10-bit UART, enable receiver(模式1: 10位异步发送/接收, 使能接收允许位)
  21. //SM1 = 1; // ;串行口 模式1
  22. //SM0 = 0;
  23. //REN = 1; // ;允许串行中断接收

  24. SM2 = 1; //SETB O9DH ;收到有效的停止位时才将RI置1

  25. ES = 1; //SETB 0ACH ;允许串行中断
  26. EA = 1; //SETB 0AFH ;总中断开
  27. }

  28. //中断方式处理串口数据

  29. void serial(void) interrupt 4 using 1
  30. {
  31. if(RI)
  32. {
  33. // RI = 0;
  34. // 串口接收, 采用临时缓冲
  35. }
  36. #if 0
  37. if(TI)
  38. {
  39. // TI = 0;
  40. // 串口发送, 没有必要使用中断方式
  41. }
  42. #endif

  43. }

  44. // 查询方式接收串口数据
  45. unsigned char getchar(void)
  46. {
  47. while(!RI);// 没有收到串口数据则一直等待
  48. RI=0;
  49. return SBUF;
  50. }
  51. // 查询方式发送串口数据
  52. void putchar(unsigned char ch)
  53. {
  54. SBUF=ch;
  55. while(!TI);
  56. TI=0;
  57. }

  58. code unsigned char HEX_TAB []="0123456789ABCDEF";
  59. void puthex(unsigned char ch)
  60. {
  61. unsigned char i,j;
  62. i=ch>>4;
  63. j=ch&0x0f;
  64. putchar(HEX_TAB[i]);
  65. putchar(HEX_TAB[j]);
  66. }
复制代码

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:56 , Processed in 0.036527 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部