软件环境: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:接收到的字符
结论:发送和接收字符均正常,没加缓冲,大数据量未测试
设计资源 培训 开发板 精华推荐
- AM2G-0505SZ 5V 2 瓦 DC-DC 转换器的典型应用
- CKlink 阿里平头哥W80x 系列仿真器
- KW41Z-PA-RD,用于 KW31Z 平台的功率放大器参考设计
- 基于 LTC1703 的稳压器具有用一个检测电阻器实现的有源电压定位
- NCV8402AMNWT1GEVB:NCV8402A DFN6 WF 评估板
- AL5802 线性模式电流吸收型 LED 驱动器的典型应用
- AKD4951EG-B,AK4951EN 24 位音频编解码器评估板
- REF43 2.5V 输出电流升压参考电压的典型应用
- STM32最小系统1
- ADP2371CP-EVALZ,用于评估 ADP2371 降压稳压器的评估板