保定网站建设,网页传奇怎么制作,众筹网站建设,网站开发建设合同书目录
1、51单片机串口通信介绍
2、串行口相关寄存器
2.1 、串行口控制寄存器SCON和PCON
2.1.1 SCON#xff1a;串行控制寄存器 (可位寻址)
2.1.2 PCON#xff1a;电源控制寄存器#xff08;不可位寻址#xff09;
2.2、串行口数据缓冲寄存器SBUF
2.3、从机地址控制…目录
1、51单片机串口通信介绍
2、串行口相关寄存器
2.1 、串行口控制寄存器SCON和PCON
2.1.1 SCON串行控制寄存器 (可位寻址)
2.1.2 PCON电源控制寄存器不可位寻址
2.2、串行口数据缓冲寄存器SBUF
2.3、从机地址控制寄存器SADEN和SADDR
2.4、与串行口中断相关的寄存器IE和IPH、IP
2.4.1 IE中断允许寄存器可位寻址
2.4.2 中断优先级控制寄存器IPH、IP
3、串行口通信实战篇 1、51单片机串口通信介绍 STC89C52系列单片机内部集成有一个功能很强的全双工串行通信口与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器可以同时发送和接收数据。发送缓冲器只能写入而不能读出接收缓冲器只能读出而不能写入因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。 串行通信设有4种工作方式其中两种方式的波特率是可变的另两种是固定的以供不同应用场合选用。波特率由内部定时器/计数器产生用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理使用十分灵活。 STC89C52系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。 STC89C52系列单片机的串行通信口除用于数据通信外还可方便地构成一个或多个并行I/O口或作串一并转换或用于扩展串行外设等。 了解了51单片机串行通信的大概要点接下来我们就要进入正题如何使单片机进行主从机通信呢当然也是要写驱动程序的但是该如何写呢肯定是要对单片机的串行口相关寄存器进行学习的。
2、串行口相关寄存器
串行口相关寄存器如下表 表中其他相关的相信大家都能看得懂但是这里还是要提一点的是MSB、LSB。
在串行口中MSB和LSB分别是最高有效位Most Significant Bit和最低有效位Least Significant Bit它们是对于数据位的描述。 MSB最高有效位也被称为高位。在一个多位数据中MSB是位值最高的一位其权值最大。 LSB最低有效位也被称为低位。在一个多位数据中LSB是位值最低的一位其权值最小。MSB和LSB是用于描述数据位的相对位置的术语。它们在串行通信中往往用于指示数据位从哪一端开始传输。 全称方面MSB和LSB的全称并没有具体的术语它们只是描述位的相对位置的标识符。它们的含义在不同的上下文中会有所变化但通常是通用的、广泛接受的术语。所以这里大家对它有一个概念就行。那么接下来我们就对相关的寄存器进行学习。
2.1 、串行口控制寄存器SCON和PCON STC89C52系列单片机的串行口设有两个控制寄存器串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。
2.1.1 SCON串行控制寄存器 (可位寻址)
首先先来学习SCON串行控制寄存器SCON是指串行控制寄存器Serial Control Register。SCON用于控制和配置串行通信接口的工作模式和参数。具体来说SCON寄存器通常包含了一些位字段bits用于配置串行通信的相关设置用于选择串行通信的工作方式和某些控制功能。其格式如下 SM0、SM1——串行口工作模式选择位。
串行口工作模式的作用是定义和控制串行通信的方式和行为通过选择不同的工作模式可以适配不同的应用场景和需求实现灵活的数据传输。通过选择合适的串行口工作模式可以根据应用需求配置和控制串行通信的参数实现可靠、高效的数据传输。 SM0和SM1串行口工作模式选择位的使用是需要条件的 1、当PCON寄存器中的SMOD0/PCON.6位为1时该位用于帧错误检测。当检测到一个无效停止位时通过UART接收器设置该位。FE必须由软件清零。 2、当PCON寄存器中的SMOD0/PCON.6位为0时SM0和SM1一起指定串行通信的工作模式如下表所示。 其中SM0、SM1按下列组合确定串行口的工作模式 简化如下 SM0、SM100——方式0——同步移位寄存器。 SM0、SM101——方式1——10位异步收发 (8位数据) 波特率可变 (定时器1溢出率控制)。 SM0、SM110——方式2——11位异步收发 (9位数据) 波特率固定。 SM0、SM111——方式3——11位异步收发 (9位数据) 波特率可变 (定时器1溢出率控制)。 解读51单片机串行通信4种工作方式 1方式0同步移位寄存器输入/输出方式常用于扩展I/O口。波特率固定为振荡频率的1/12并不受PCON寄存器中SMOD位的影响。 2方式1用于串行发送或接收为10位通用异步接口。TXD与RXD分别用于发送与接收数据。收发一帧数据的格式为1位起始位、8位数据位低位在前、1位停止位共10位。波特率由定时器T1的溢出率与SMOD值同时决定即SMOD1则波特率加倍SMOD0则波特率不加倍。 3方式2用于串行发送或接收为11位通用异步接口。TXD与RXD分别用于发送与接收数据。收发一帧数据的格式为1位起始位、8位数据位低位在前、1位可编程的第9数据位(也就是1位奇偶校验位)和1位停止位共11位。波特率取决于PCON中SMOD位的值即SMOD1则波特率加倍SMOD0则波特率不加倍。 4方式3用于串行发送或接收为11位通用异步接口。TXD与RXD分别用于发送与接收数据。帧格式与方式2相同波特率与方式1相同。 SM2——多机通信控制位。 SM2允许方式2或方式3多机通信控制位。在方式2或方式3时如SM2位为1REN位为1则从机处于只有接收到RB8位为1(地址帧) 时才激活中断请求标志位RI为1并向主机请求中断处理。被确认为寻址的从机则复位SM2位为0从而才接收RB8为0的数据帧。在方式1时如果SM2位为1则只有在接收到有效的停止位时才置位中断请求标志位RI为1在方式0时SM2 应为0。 REN——允许串行接收位由软件置1或者清0。 REN 允许/禁止串行接收控制位。由软件置位REN即REN1为允许串行接收状态可启动串行接收器RxD开始接收信息。软件复位REN即REN0则禁止接收。 TB8、RB8——控制和指示串行数据传输。 TB8TB8Transmit Bit 8发送的第9位数据。 在方式2和方式3时TB8 是要发送的第 9 位数据其值由软件置1或清 0。在双机串行通信时一般作为奇偶校验位使用在多机串行通信中用来表示主机发送的是地址顿还是数据TB81为地址TB80为数据。在方式0和方式1中不使用TB8。 RB8RB8Receive Bit 8接收的第9位数据。 在方式2和方式3时RB8存放接收到的第9位数据。在方式1时如SM20RB8 是接收到的停止位。在方式0时不使用 RB8。 TI ——发送中断标志位需要在中断服务中软件清0。 TI发送中断请求标志位。在方式0当串行发送数据第8位结束时由内部硬件自动置位即TI1向主机请求中断响应中断后必须用软件复位即TI0。在其他方式中则在停止位开始发送时由内部硬件置位必须用软件复位。 RI——接收中断标志位需要在中断服务中软件清0。 RI接收中断请求标志位。在方式0当串行接收到第8位结束时由内部硬件自动置位RI1,向主机请求中断响应中断后必须用软件复位即RI0。在其他方式中串行接收到停止位的中间时刻由内部硬件置位即RI1(例外情况见SM2说明)必须由软件复位即RI0。 SCON的所有位可通过整机复位信号复位为全“0”。SCON的字节地址尾98H可位寻址各位地址为98H~~9FH可用软件实现位设置。当用指令改变SCON的有关内容时其改变的状态将在下一条指令的第一个机器周期的S1P1状态发生作用。如果一次串行发送已经开始则输出TB8将是原先的值不是新改变的值。 串行通信的中断请求当一帧发送完成内部硬件自动置位TI即TI1请求中断处理当接收完一帧信息时内部硬件自动置位RI即RI1请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断所以主机响应中断时事先并不知道是TI还是RI请求的中断必须在中断服务程序中查询TI和RI进行判别然后分别处理。因此两人中断请求标志位均不能由硬件自动置位必须通过软件清0否则将出现一次请求多次响应的错误。
2.1.2 PCON电源控制寄存器不可位寻址 PCON通常指代特殊功能寄存器Special Function Register中的电源控制寄存器Power Control Register。电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。 电源控制寄存器格式如下 电源控制寄存器与串行口通信相关的位就是B6、B7。 SMOD波特率选择位。当用软件置位SMOD即SMOD1则使串行通信方式1、2、3的波特率加倍SMOD0则各工作方式的波特率不加倍。复位时SMOD0。 SMOD0帧错误检测有效控制位。当SMOD01SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能当SMOD00SCON寄存器中的SM0/FE位用于SM0功能和SM1一起指定串行口的工作方式。复位时SMOD00。 2.2、串行口数据缓冲寄存器SBUF
对于串行口数据缓冲寄存器SBUF的理解如下 STC89C52系列单片机的串行口缓冲寄存器(SBUF)的地址是99H实际是2个缓冲器写SBUF的操作完成待发送数据的加载读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器1个是只写寄存器1个是只读寄存器。 串行通道内设有数据寄存器。在所有的串行通信方式中在写入SBUF信号的控制下把数据装入相同的9位移位寄存器前面8位为数据字节其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位并进行发送。串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位其他方式时为9位。当一帧接收完毕移位寄存器中的数据字节装入串行数据缓冲器SBUF中其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时RB8和SBUF中内容不变。 由于接收通道内设有输入移位寄存器和SBUF缓冲器从而能使一帧接收完将数据由移位寄存器装入SBUF后可立即开始接收下一帧信息主机应在该帧接收结束前从SBUF缓冲器中将数据取走否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。 2.3、从机地址控制寄存器SADEN和SADDR
为了方便多机通信STC89C52系列单片机设置了从机地址控制寄存器SADEN和SADDR。其中SADEN是从机地址掩码寄存器(地址为B9H复位值为00H)SADDR是从机地址寄存器(地址为A9H复位值为00H)。这里我们用不到就不做理解大概了解就ok了。
2.4、与串行口中断相关的寄存器IE和IPH、IP
2.4.1 IE中断允许寄存器可位寻址
串行口中断允许位ES位于中断允许寄存器IE中中断允许寄存器的格式如下 EACPU的总中断允许控制位EA1CPU开放中断EA0CPU屏蔽所有的中断申请。EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制其次还受各中断源自己的中断允许控制位控制。 ES串行口中断允许位ES1允许串行口中断ES0禁止串行口中断。 2.4.2 中断优先级控制寄存器IPH、IP
IPH代表的是Interrupt Priority HighIP代表的是Interrupt Priority。它们分别对应中断优先级高位寄存器和中断优先级低位寄存器。这两个寄存器用于控制中断的优先级。通过设置IP和IPH寄存器的位可以确定中断的相对优先级从而决定中断的触发顺序。注意当多个中断同时发生时具有较高优先级的中断将先被处理。
串行口中断优先级控制位PS/PSH位于中断优先级控制寄存器IP/IPH中中断优先级控制寄存器的格式如下
IPH中断优先级控制寄存器高(不可寻址) IP中断优先级控制寄存器低(可寻址) PSHPS串口1中断优先级控制位。 当PSH0且PS0时串口1中断为最低优先级中断(优先级0) 当PSH0且PS1时串口1中断为较低优先级中断(优先级1) 当PSH1且PS0时串口1中断为较高优先级中断(优先级2) 当PSH1且PS1时串口1中断为最高优先级中断(优先级3) 3、串行口通信实战篇
我们已经学习了51单片机串行口通信的相关寄存器接下来就要把所学知识运用和实战——那就是编写串行口通信的驱动程序这是最最重要的一步很多人学会了理论但是实践一窍不通要坚决避免要这种情况。首先我们肯定是要书写串行口的初始化的但是要从哪一步开始呢步骤如下 第一步设置串行口控制寄存器SCON①这里选择串行口工作方式1——SM0/SCON.70SM1/SCON.61②多机通信控制位不需要——SM2/SCON.50③允许串行接收位需要(肯定是需要允许串行口处于接收状态的)——REN/SCON.41④控制和指示串行数据传输不需要——TB8/SCON.30、RB8/SCON.20⑤发送、接收中断标志位初始化需置零——TI/SCON.10RI/SCON.00综合得SCON0x50如下图 第二步设置电源控制寄存器PCON这里我们需要注意的一点就是串行口与该寄存器有关的就是SMOD/PCON.7、SMOD0/PCON.6①波特率选择位选择波特率不加倍——SMOD/PCON.70②帧错误检测有效控制位选择SCON寄存器中的SM0/FE位用于SM0功能和SM1一起指定串行口的工作方式——SMOD0/PCON.60综合得PCON0x7F这里使用了位与的表示方法等同于PCON0x00如下图 第三步因为串行口通信属于异步通信通信双方各自约定通信速率所以需要使用到定时器1溢出率所以这里我们需要配置定时器1那就是操作与定时器/计数器有关的两个寄存器——定时器/计数器控制寄存器TCON、定时器/计数器工作模式寄存器TMOD这两个寄存器上面没有讲可以自己查询一下因为是属于定时器/计数器的内容的①先配置定时器/计数器控制寄存器TCON既然用到定时器1那么肯定是要开启定时器1的——TR 1/TCON.61单纯的用到该位其他位没有用到就不需要动了综合得TR11如下图 ②接下来配置定时器/计数器工作模式寄存器TMODGATE/TMOD.7控制定时器1置1时只有在INT1脚为高及TR1控制位置1时才可打开定时器/计数器1这里不需要——GATE/TMOD.70C/T/TMOD.6控制定时器1用作定时器或计数器清零则用作定时器(从内部系统时钟输入)置1用作计数器(从T1/P3.5脚输入)这里也不需要——C/T/TMOD.60使用定时器1并且设定定时器1位8位自动重装方式——M1/TMOD.51M0/TMOD.40综合得TMOD0x20如下图 第四步设定计数寄存器的初值因为使用的是定时器1需设定计数寄存器TL1、TH1的初始值这里我以单片机晶振为11.0592、波特率为9600bps为例注意不同晶振的初始值设定的会有不一样——TL10xFD、TH10xFD定时器1计数寄存器的初值为TL10xFDTH10xFD这里无图 第五步配置中断允许寄存器IE①开启CPU的总中断允许控制位——EA/IE.71②开启串行口中断允许位——ES/IE.41③禁止定时器1中断——ET1/IE.30其他位都不需要全部置零综合得IE0x90(等同于ET10ES1EA1)如下图 综合上述所有步骤串口初始化我们将它封装成一个函数如下 /*** brief 串口初始化9600bps11.0592MHz* param 无* retval 无*/
void Uart_Init(void) //9600bps11.0592MHz
{PCON 0x7F; //波特率不倍速SCON 0x50; //8位数据,可变波特率TMOD 0x0F; //清除定时器1模式位(可有可无)TMOD | 0x20; //设定定时器1为8位自动重装方式位或也是一样的TL1 0xFD; //设定定时初值TH1 0xFD; //设定定时器重装值TR1 1; //启动定时器1ET1 0; //禁止定时器1中断ES1; //串口中断允许控制位EA1; //中断允许总控制位//IE0x90; //也可这样代替倒数的三个分别是ET10ES1EA1
} 串行口数据缓冲寄存器SBUF、从机地址控制寄存器SADEN和SADDR、中断优先级控制寄存器IPH、IP初始化用不到我们这里不需要配置。 下面我们开始用我们写好的串行口初始化驱动程序进行实操了实操内容为电脑通过串口控制LED程序如下
#include REGX52.H/*** brief 串口初始化9600bps11.0592MHz* param 无* retval 无*/
void Uart_Init(void) //9600bps11.0592MHz
{PCON 0x7F; //波特率不倍速SCON 0x50; //8位数据,可变波特率TMOD 0x0F; //清除定时器1模式位(可有可无)TMOD | 0x20; //设定定时器1为8位自动重装方式位或也是一样的TL1 0xFD; //设定定时初值TH1 0xFD; //设定定时器重装值TR1 1; //启动定时器1ET1 0; //禁止定时器1中断ES1; //串口中断允许控制位EA1; //中断允许总控制位//IE0x90; //也可这样代替倒数的三个分别是ET10ES1EA1
}
/*** brief 串口发送一个字节数据* param Byte 要发送的一个字节数据* retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUFByte;while(TI0);TI0;
}
void main()
{Uart_Init(); //串口初始化while(1);
}void UART_Routine() interrupt 4
{if(RI1) //如果接收标志位为1接收到了数据{P2~SBUF; //读取数据取反后输出到LEDUART_SendByte(SBUF); //将受到的数据发回串口RI0; //接收标志位清0}
} 将上面的代码例程的hex文件下载到我们单片机开发板中就可以通过串口助手发送数据控制单片机的LED的亮灭了前提是开发板和电脑已经建立起连接了如下图 现象图如下 通过上例就发现了串行口数据缓冲寄存器SBUF是如此用的写操作时写入的是发送寄存器读操作时读出的是接收寄存器意思就是单片机要接收外部设备发送过来的数据时就将SBUF赋值给一个变量就如本例子的P2~SBUF 读取数据取反后输出到P2口反之也是单片机要将数据发送给外部设备那么就将需要发送的数据赋值给SBUF就可以了如本例子的SBUFByte将Byte的值赋值给SBUF就可以了这个串口数据缓存寄存器就是这么用来着很简单相信看了就都懂的串口通信能做很多有趣的事情比如我们可以在单片机上装一个蓝牙然后拿手机来远程控制单片机这个时候我们就可以拿来做一个遥控小车手机控制小车等等具体的拓展看个人 为了更加方便大家的理解可以结合下图进行对51单片机串行口的理解 51单片机串行口发送接收数据数字、字符、符号等等各个进制之间的关系如下图 突然想到一个问题最后提醒一下大家定时器/计数器的工作模式和串行口的工作模式不是同一个概念的大家不要混淆了有的人就很容易弄乱的。51单片机串行口就是这么简单只要把几个相关寄存器的功能作用弄明白了就按自己需求配置寄存器初始化就可以了。