51单片机IO模拟UART

本文介绍了使用51单片机通过IO模拟UART通信的过程,包括发送和接收的实现细节。在发送部分,详细阐述了起始位、数据位、奇偶校验位和停止位的设置,并通过定时器配置确保波特率的准确。在接收方面,分析了接收过程中可能存在的问题及解决方案,实现了稳定的数据接收。同时,提供了相关的源代码和测试程序。

一、 IO模拟UART发送

串口通信属于 串行 异步 半双工的通信模式

1、 最近在调试一个IO模拟UART的程序,把调试过程中遇到的问题总结一下。对于UART的发送部分(主机模式)还是比较容易实现的。比较麻烦的做从机时,UART接收还在调试,可以接收数据,但还存在很多问题。

(1) 起始位:总线没通信是高电平状态,要进行通信时,总线拉低发出“逻辑0”信号,表示开始传输数据

(2) 数据位:通常以1byte数据为标准,从低位开始传输,通过时钟频率来定位数据的传输

(3) 奇偶校验位:通过在数据末尾加上1位,使得数据包中的1的个数为偶数(偶校验)或者是奇数(奇校验),来确定数据的准确性。

(4) 停止位:在通信结束时,将总线拉高发出“逻辑1”信号,表示传输结束,也给下次进行通信提供了校准时间的机会

2、波特率

波特率表示每秒钟传送的码元符号的个数,是衡量数据传输速率的指标,它用单位时间内载波调制状态改变的次数来表示,1波特即指每秒传输1个符号。

若 波特率为9600bps,那么传输一位数据的时间是在1000ms/9600bps=0.104ms

3、串口发送数据组成

数据由:1bit起始位+8bit数据+1bit停止位构成;

所以,搞懂这些原理,串口发送并不难,主要把单片机的定时器配置在104us左右溢出中断,保证每一位时间间隔在104us 左右即可。

我用的是51单片机,51本身自带一个串口,但自己想用IO模拟一个串口出来,便于自己更好的理解串口,也作为自己的一个技术储备。

UART 源文件

#include "reg52.h"
#include "type.h"
#include "uart.h"
#include "timer.h"

void UART_INIT(void)
{
   
   
    TX_D=1;
    Timer1Init();    //T1 初始化
}

void WAIT_TF1(void) 
{
   
   
    while(!TF1);  //查询计数器溢出标志位
    TF1=0;
}

//写数据很快的话,定时器不稳定而导致发送的数据会有错码,发送时应适当延时降低错码概率

void Write_DATA(uint8_t input) 
{
   
   
    uint8_t i=8;  //写入1byte数据
    TR1=1;        //开始计时
    TX_D=0;        //拉低信号线准备发送数据  起始信号
    WAIT_TF1();    //106us溢出一次,溢出进行下一位的传输 
    while(i--)    //开始写数据
    {
   
   
        TX_D=input&0X01;
        WAIT_TF1();
        input>>=1;
    }
    TX_D=
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值