硬件环境: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:接收到的字符
结论:发送和接收字符均正常,没加缓冲,大数据量未测试