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

发布者:zeta16最新更新时间:2020-07-07 来源: eefocus关键字:51单片机  IO口  模拟串口通讯  计数法 手机看文章 扫描二维码
随时随地手机看文章

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

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

关键字:51单片机  IO口  模拟串口通讯  计数法 引用地址:51单片机IO口模拟串口通讯2-计数法

上一篇:51单片机IO口模拟串口通讯3-中断法
下一篇:51单片机IO口模拟串口通讯1-延时法

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved