硬件环境:STC89C52
软件环境:IDE Keil uVision V4.10
编译器 C51 V9.0
代码如下:
- /**********************************************
- 方法2:计数法
- 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1
- 波特率:9600
- 描述:所谓计数法是指根据模拟出的波特率,每1位持续的时间的长短是通过定时器计数
- 溢出来置标志位,查询该标志位来实现的。
- 测试1:上电发送1个0x02的字符
- 测试2:上电先发送1个0x02的字符,然后等待接收,将收到的字符再发送出去(分别一个一个发送0x01,0x02,0x03,0x04,0x05)
- 结果:
- 测试1:正确!接收到1个0x02的字符
- 测试2-1:正确!上电接收到1个0x02的字符,分别一个一个发送0x01,0x02,0x03,0x04,0x05,均正常接收
- 测试2-2:错误! 一起发送0x01,0x02,0x03,0x04,0x05,丢包,只能接收0x01,0x03,0x05
- 注意:由于本方法在上电时,TF0初始状态即为0,故不存在后边中断法出现的上电后必须手动将标志位清0的情况
- 时间:2012.07.25 于单位
- **********************************************/
- #include "reg52.h"
- #define uchar unsigned char
- sbit P1_0 = 0x90;
- sbit P1_1 = 0x91;
- sbit P1_2 = 0x92;
- #define RXD P1_0
- #define TXD P1_1
- #define WRDYN 44 //写延时
- #define RDDYN 43 //读延时
- #define TM0_FLAG P1_2 //设传输标志
- void Delay2cp(unsigned char i);
- void WaitTF0( void );
- //计数器初始化
- void S2INI(void)
- {
- TMOD |=0x02; //计数器0,方式2
- TH0=0xA0; //预值为256-96=160,十六进制A0
- TL0=TH0;
- TR0=1; //开始计数
- TF0=0;
- }
- //发送一个字符
- void WByte(uchar input)
- {
- //发送启始位
- uchar i=8;
- TR0=1;
- TXD=(bit)0;
- WaitTF0();
- //发送8位数据位
- while(i--)
- {
- TXD=(bit)(input&0x01); //先传低位
- WaitTF0();
- input=input>>1;
- }
- //发送校验位(无)
- //发送结束位
- TXD=(bit)1;
- WaitTF0();
- TR0=0;
- }
- //接收一个字符
- uchar RByte()
- {
- uchar Output=0;
- uchar i=8;
- TR0=1; //启动Timer0
- TL0=TH0;
- WaitTF0(); //等过起始位
- //发送8位数据位
- while(i--)
- {
- Output >>=1;
- if(RXD)
- Output |=0x80; //先收低位
- WaitTF0(); //位间延时
- }
- while(!TM0_FLAG) if(RXD) break;
- TR0=0; //停止Timer0
- return Output;
- }
- //查询计数器溢出标志位
- void WaitTF0( void )
- {
- while(!TF0);
- TF0=0;
- }
- void main()
- {
- uchar ccc;
- S2INI();
- //测试1
- //WByte(0x02);
- //while(1){;}
- //测试2
- WByte(0x02);
- while(1)
- {
- if(RXD==0)
- {
- ccc=RByte();
- WByte(ccc);
- }
- }
- }
附几张抓到的波形:
测试1:十六进制字符0x02的波形
测试1:接收到的字符
结论:发送和接收字符均正常,没加缓冲,大数据量未测试