×
嵌入式 > 嵌入式开发 > 详情

51单片机GPIO口模拟串口通信

发布时间:2020-09-03 发布时间:
|
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。

本文所说的模拟串口, 就是利用51的两个输入输出引脚P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。

以11.0592MHz的晶振为例,通过定时计数器0产生中断信号来模拟串口电平,下面附上具体源代码。

[cpp]view plaincopy
  1. /*
  2. Fuction:使用51单片机GPIO口模拟串口通信,通过定时计数器0来产生中断信号
  3. SoftwareDesigner:Jason
  4. */
  5. #include
  6. sbitP1_0=P1^0;
  7. sbitP1_1=P1^1;
  8. #defineRXDP1_0
  9. #defineTXDP1_1
  10. unsignedcharflag;
  11. voidinit();
  12. voidsend_byte(unsignedchar);
  13. unsignedcharrec_byte();
  14. voidwait_int();
  15. //将从PC机串口接收到的数据原封不动回传给PC机
  16. voidmain()
  17. {
  18. unsignedchartemp;
  19. init();
  20. while(1)
  21. {
  22. if(RI==1)
  23. {
  24. RI=0;
  25. temp=rec_byte();
  26. send_byte(temp);
  27. while(!TI);
  28. TI=0;
  29. }
  30. }
  31. }
  32. //端口及中断初始化
  33. voidinit()
  34. {
  35. TMOD=0x02;//定时器0,方式2
  36. TH0=0xfd;//波特率9600
  37. TL0=TH0;
  38. TR0=0;//在发送或接收时打开
  39. ET0=1;//允许定时器0中断
  40. EA=1;//允许所有中断
  41. }
  42. //通过串口发送一个字节数据
  43. voidsend_byte(unsignedchardat)
  44. {
  45. unsignedchari=8;
  46. TR0=1;//开启T0中断
  47. TXD=0;//发送起始位0
  48. wait_int();
  49. while(i--)//发送8位数据
  50. {
  51. TXD=(bit)(dat&0x01);
  52. wait_int();
  53. dat=dat>>1;
  54. }
  55. TXD=1;//发送停止位1
  56. wait_int();
  57. TR0=0;//关闭T0中断
  58. }
  59. //通过串口接收一个字节数据
  60. unsignedcharrec_byte()
  61. {
  62. unsignedchardat=0;
  63. unsignedchari=8;
  64. TR0=1;//开启T0中断
  65. wait_int();//等过起始位电平
  66. while(i--)//接收8位数据
  67. {
  68. dat=dat<<1;
  69. if(RXD)
  70. dat|=0x80;
  71. wait_int();
  72. }
  73. wait_int();//等过停止位电平
  74. TR0=0;//关闭T0中断
  75. returndat;
  76. }
  77. //等待中断到来
  78. voidwait_int()
  79. {
  80. while(!flag);
  81. flag=0;
  82. }
  83. //中断服务程序
  84. voidtimer0()interrupt1
  85. {
  86. flag=1;
  87. }



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Recogni:将高端AI芯片推向自动驾驶边缘