51单片机的串口驱动的代码逻辑

本文详细解释了51单片机中串口通信的工作原理,强调了硬件串口使用SBUF进行数据传输的机制,涉及数据发送时的锁管理、缓存处理以及如何避免数据覆盖。通过初始化多个寄存器和函数设计,展示了串口通信的完整流程。

什么是串口通信?

51单片机中,串口通信指的是单片机和其他的机器传递数据的时候是通过一个bit一个bit的形式传输的,值得一提的话,串口通信是硬件串口。什么意思呢?也就是在传递比特的时候,不用软件来模拟比特传输时的时序,由硬件自动传输。那么需要发送的数据怎么告诉硬件让其传输的呢?由于在软件串口中,比特和比特的传输是实时的,数据源直接传给收取源,这个是没有中间的缓存的,没有缓存的数组或者是缓存的寄存器。而硬件串口的话,由于你要交给一个封装好的硬件串口模块,则这个模块必须得有一个接口,这个接口就是SBUF(一个字节),内置的寄存器(其实有两个,一个只读,一个只写),作为需要输出和输入的一个中间人,所以所有通过串口输入输出的字节都是需要通过这个SBUF的,所以就会出现上一篇文章讲的SBUF被覆盖的问题,所以每次数据源——SBUF——串口通信,这个阶段就必须得上一个锁什么时候解锁呢?当串口传输完了8个字节的时候,内部硬件自动将TI或者是RI置为1,进而触发串口中断,这个时候就需要到串口中断中处理查看,看看是接受完了一个字节,还是发送完了一个字节,在处理中断程序中,如果是发送完成,则就解锁,让数据源将后续的数据赋值到SBUF中,进而通过SBUF通过串口通信发送出去。

(一个重要的原则:如果你的主机作为发送方的话,不需要考虑发送的数据是以什么形式存到接收方里面的,你只需要负责发送数据就好了。只有接收的才是需要考虑到缓存的事情的。)

串口通信的代码逻辑

有缓存串口通信的思路:由于串口通信是硬件串口,所以需要借助SBUF的帮助,存储字节,所有输入输出的字节都是需要经过SBUF才可以出去的。输出的时候不用缓存,输入的时候才有缓存。

输出的时候,字节通过SBUF,然后再经过SBUF进行输出,等到SBUF输出完毕的时候,触发中断,再进行第二字节的输出。

输入的时候,先输入进SBUF,等SBUF输入满的时候,那么就触发中断,将SBUF中的一个字节,写到缓存中去,再进行下一个字节的接收,在字节接收到缓存的过程中,同时又在将缓存中的数读出来,读到一个空的数组当中去,但是有些时候,从缓存读到数组中的速度有些块,这个时候就需要等待SBUF中的字节写到缓存中,才能将缓存中的字节写到空数组中,所以最得判断一下,这个缓存是否是空的,如果是空的话,那么就延迟一毫秒,再读一遍,如果下一个循环还是0的话,那么就是真的已经读完了。

这个就是上述输入输出的全过程。

需要注意的点:

(1)发送字节的时候,记得上锁,否则会出现SBUF发送到一半字节而出现覆盖的情况。

(2)需要重视一下buffer——>外部空数组读取太快的问题。

(3)其中的缓存是全部利用的,不用考虑字符串最后一个是0的问题

(4)字符串最后一个是0的问题,一般是放到暴露函数中处理。

(5)创建的缓存可以封装成一个结构体,且这个缓存是一个循环队列,这个循环队列有队首和元素的个数,其中用(队首 + 元素个数)%max 组成了队尾,队尾就是下一个元素加进来的地方。

串口通信首先就是初始化,使用到了好几个寄存器,IE,SCON,PCON,TCON等寄存器,还有TMOD和TH和TL的初始化,这个一定需要倒背如流。

我们先来看看需要暴露的函数有哪些:初始化函数,发送字符串的函数,收取字符串的函数,判断缓存中是否有元素的函数。

内部的函数有那些呢:初始化函数,发送字符串的函数,收取字符串的函数,判断缓存中是否有元素的函数。发送单个字节的函数,收取单个字节的函数,从SBUF到缓存的函数,从缓存到空数组的函数。

晋中51单片机通常指的是基于Intel 8051架构的一类单片机,这类单片机本身并不需要特定的“串口驱动程序”来实现串口通信功能。串口通信一般通过单片机的UART(通用异步收发器)模块实现,而与PC端的通信则可能需要USB转串口驱动程序,具体取决于开发板的设计。 如果使用的是USB接口连接PC与单片机,则可能需要安装USB转串口芯片的驱动程序,例如FT232、CH340、CP2102等芯片的驱动。这些驱动可以从芯片制造商的官方网站下载[^1]。 如果使用的是传统的RS232串口连接,则不需要额外的驱动,因为大多数操作系统都内置了对标准串口的支持。 为了确保能够正常进行串口通信,可以按照以下步骤操作: 1. 确认单片机开发板使用的USB转串口芯片型号。 2. 访问该芯片制造商的官方网站,搜索并下载对应的驱动程序。 3. 安装驱动程序后,将开发板连接到计算机,确保设备管理器中能够正确识别该设备。 ### 示例代码51单片机串口初始化 以下是一个简单的51单片机串口初始化代码示例,用于设置串口为方式1(8位异步串行通信模式),并启用串口中断: ```c #include <reg51.h> void UART_Init(void) { TMOD |= 0x20; // 设置定时器1为模式2(8位自动重载) TH1 = 0xFD; // 设置波特率为9600(假设晶振频率为11.0592MHz) SCON = 0x50; // 设置串口为方式1,允许接收 TR1 = 1; // 启动定时器1 ES = 1; // 使能串口中断 EA = 1; // 使能全局中断 } void main(void) { UART_Init(); while (1) { // 主循环中可以添加其他逻辑 } } // 串口中断服务程序 void UART_ISR(void) interrupt 4 { if (RI) { RI = 0; // 清除接收中断标志 // 处理接收到的数据 } if (TI) { TI = 0; // 清除发送中断标志 // 数据发送完成后的处理 } } ``` ### 相关问题 1. 如何在51单片机上实现串口通信? 2. 如何选择适合的USB转串口芯片? 3. 51单片机串口通信模式有哪些? 4. 如何调试51单片机串口通信问题? [^1]: 实际驱动程序的选择和下载应基于具体的硬件设计和芯片型号。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值