×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-03 发布时间:
|

硬件环境: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:接收到的字符

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


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向