20120725-51单片机IO口模拟串口通讯2-计数法

硬件环境: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的波形

20120725-51单片机IO口模拟串口通讯2-计数法_第1张图片

测试1:接收到的字符

20120725-51单片机IO口模拟串口通讯2-计数法_第2张图片

 

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

你可能感兴趣的:(20120725-51单片机IO口模拟串口通讯2-计数法)