51单片机IO口模拟串口通讯1-延时法


  最近因工作需要,研究了一下单片机IO口模拟串口通讯的相关知识。相关内容主要参考了网上《51单片机模拟串口的三种方法》和《单片机IO口模拟串口程序(发送+接收)》两篇文档,并动手做了一下实验。感受颇多。

    硬件环境:STC89C52

    软件环境:IDE Keil uVision V4.10

                        编译器 C51 V9.0

    代码如下:

 

[cpp]  view plain copy
  1. /********************************************** 
  2. 方法1:延时法 
  3. 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 
  4. 波特率:9600 
  5. 描述:所谓延时法是指根据模拟出的波特率,每1位持续的时间的长短是通过循环空指令来延时的。 
  6.  
  7. 测试1:上电发送1个0x01的字符 
  8. 测试2:上电后等待接收,接收到PC发送的0x01字符后,将此字符+1后再发送 
  9.  
  10. 结果: 
  11. 测试1:正确!接收到1个0x01的字符 
  12. 测试2-1:正确!分别一个一个发送0x01,0x02,0x03,0x04,0x05,均正常接收 
  13. 测试2-2: 错误!一起发送0x01,0x02,0x03,0x04,0x05,丢包,只能接收0x02,0x04,0x06 
  14.  
  15. 时间:2012.07.25 于单位 
  16. **********************************************/  
  17. #include "reg52.h"  
  18. #define uchar unsigned char  
  19.   
  20. sbit P1_0 = 0x90;  
  21. sbit P1_1 = 0x91;  
  22. sbit P1_2 = 0x92;  
  23.   
  24. #define RXD P1_0  
  25. #define TXD P1_1  
  26. #define WRDYN 44                    //写延时  
  27. #define RDDYN 43                    //读延时  
  28.   
  29. void Delay2cp(unsigned char i);  
  30.   
  31. //往串口写一个字节  
  32. void WByte(uchar input)  
  33. {  
  34.     uchar i=8;  
  35.     TXD=(bit)0;                     //发送启始位  
  36.     Delay2cp(39);  
  37.   
  38.     //发送8位数据位  
  39.     while(i--)  
  40.     {  
  41.         TXD=(bit)(input&0x01);      //先传低位  
  42.         Delay2cp(36);  
  43.         input=input>>1;  
  44.     }  
  45.   
  46.     //发送校验位(无)  
  47.     TXD=(bit)1;                     //发送结束位  
  48.     Delay2cp(46);  
  49. }  
  50.   
  51. //从串口读一个字节  
  52. uchar RByte(void)  
  53. {  
  54.     uchar Output=0;  
  55.     uchar i=8;  
  56.     uchar temp=RDDYN;  
  57.   
  58.     //发送8位数据位  
  59.     Delay2cp(RDDYN*1.5);            //此处注意,等过起始位  
  60.     while(i--)  
  61.     {  
  62.         Output >>=1;  
  63.         if(RXD) Output   |=0x80;    //先收低位  
  64.         Delay2cp(35);               //(96-26)/2,循环共占用26个指令周  
  65.     }  
  66.   
  67.     while(--temp)                   //在指定的时间内搜寻结束位。  
  68.     {  
  69.         Delay2cp(1);  
  70.         if(RXD)break;               //收到结束位便退  
  71.     }  
  72.   
  73.     return Output;  
  74. }  
  75.   
  76. //延时程序*  
  77. void Delay2cp(unsigned char i)  
  78. {  
  79.      while(--i);                    //刚好两个指令周期。  
  80. }  
  81.   
  82. void main()  
  83. {   uchar ccc;  
  84.   
  85.     //测试1     
  86.     //WByte(0x01);  
  87.     //while(1){;}   
  88.   
  89.     //测试2     
  90.     while(1)  
  91.     {  
  92.         if(RXD==0)  
  93.         {  
  94.             ccc=RByte();  
  95.             WByte(ccc+1);  
  96.         }  
  97.     }  
  98. }  

附几张抓到的波形:

测试1:十六进制字符0x01的波形


 测试1:发送出来的字符

测试2:依次发送0x01,0x02,0x03,0x04,0x05接收到的字符

测试2:一起发送0x01,0x02,0x03,0x04,0x05字符

 

 

结论:发送和接收字符均正常,没加缓冲,大数据量未测试。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值