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

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

    硬件环境:STC89C52

    软件环境:IDE Keil uVision V4.10

                        编译器 C51 V9.0

    代码如下:

 

/**********************************************
方法1:延时法
硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1
波特率:9600
描述:所谓延时法是指根据模拟出的波特率,每1位持续的时间的长短是通过循环空指令来延时的。

测试1:上电发送1个0x01的字符
测试2:上电后等待接收,接收到PC发送的0x01字符后,将此字符+1后再发送

结果:
测试1:正确!接收到1个0x01的字符
测试2-1:正确!分别一个一个发送0x01,0x02,0x03,0x04,0x05,均正常接收
测试2-2: 错误!一起发送0x01,0x02,0x03,0x04,0x05,丢包,只能接收0x02,0x04,0x06

时间: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 					//读延时

void Delay2cp(unsigned char i);

//往串口写一个字节
void WByte(uchar input)
{
	uchar i=8;
	TXD=(bit)0;						//发送启始位
	Delay2cp(39);

	//发送8位数据位
	while(i--)
	{
		TXD=(bit)(input&0x01);      //先传低位
		Delay2cp(36);
		input=input>>1;
	}

	//发送校验位(无)
	TXD=(bit)1;						//发送结束位
	Delay2cp(46);
}

//从串口读一个字节
uchar RByte(void)
{
	uchar Output=0;
	uchar i=8;
	uchar temp=RDDYN;

	//发送8位数据位
	Delay2cp(RDDYN*1.5);			//此处注意,等过起始位
	while(i--)
	{
		Output >>=1;
		if(RXD) Output   |=0x80;	//先收低位
		Delay2cp(35);				//(96-26)/2,循环共占用26个指令周
	}

	while(--temp)					//在指定的时间内搜寻结束位。
	{
		Delay2cp(1);
		if(RXD)break;				//收到结束位便退
	}

	return Output;
}

//延时程序*
void Delay2cp(unsigned char i)
{
     while(--i);					//刚好两个指令周期。
}

void main()
{	uchar ccc;

	//测试1	
	//WByte(0x01);
	//while(1){;} 

	//测试2	
	while(1)
	{
		if(RXD==0)
		{
			ccc=RByte();
			WByte(ccc+1);
		}
	}
}

附几张抓到的波形:

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


 测试1:发送出来的字符

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

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

 

 

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

你可能感兴趣的:(A07-51单片机)