串口内部结构
TXD和RXD是单片机的两个串口管脚
TXD对应P3.1的副用功能
RXD对应P3.0的一个附加功能
对P3.0和P3.1进行相应的配置就可以实现串口功能
SBUF数据缓存区,接受和发送数据都存储在SBUF
波特率由TH1、TL1产生
TH1、TL1是定时器定时器1的一个功能
SMOD来控制倍频,如果倍频的话要把相应的值除以二
例如接收数据
RXD接收数据--通过移位寄存器--存储到SBUF--然后相应的接接收中断标志RI置为1--然后向cpu发送请求中断,执行中断
发送数据
SBUF里的数据发送到--控制门--由发送控制器T1(同时T1置1向cpu发送请求中断并执行)控制控制门--由TXD管脚发送出去
串口相关的寄存器
(1)串口控制寄存器SCON
SM0和SM1来控制串口通信的工作方式(四种)
待会分开细说
SM2多机控制位;当SM2=1时,支持多机通信(就是TXD和RXD可以链接多个串口设备)主要用于方式2和方式3,此时RB8控制是否激活RI(接收中断)比如RB8=0时,表示不激活RI,如果为1则接收到的数据进入SBUF并激活R1=1;当SM2=0时不论RB8等于几RI均可以接收到数据并激活,比如用方式1时不用多机通信时,可以将SM2=0;如果要实现多机通信也可以使用软件层面来实现
REN是允许接收位,由软件置1,串行口接收数据,0时禁止接收
TB8和RB8是方式2和方式3用来发送数据的第9位,可以用软件来规定其第9位的作用,方式0和方式1是不用这两个的,因为只有8位数据
TI是发送中断标志位,在方式0时第8位数据发送结束的时候或者其他方式串行发送停止位,开始位的时候TI硬件置1向cpu请求中断,再发送下一次数据之前需要软件清0
RI是接收中断标志位,在方式0时第8位数据接收结束时或者在其他模式接收数据期间RI硬件置1向cup发送一个中断申请,也必须下一次接收数据前在中断服务程序中软件清0
(2)电源控制寄存器PCON
只用到了第8位
SMOD主要是对倍频的选择=1时倍频=0时不倍频
串口方式1、2、3时波特波特率和SMOD倍频值有关,波特率提高一倍当SMOD=1时
串口通信方式详细介绍
1、方式0(同步移位的输入输出方式)
主要用来扩展并行输入输出口,数据由RXD进行输入和输出的,同步移位脉冲由TXD即P3.1引脚接收,波特率固定为fosc/12(就是晶振/12)
2,方式1(10位数据的异步通信口)最常用
TXD是发送引脚,RXD是接收引脚
第1是起始位,最后一位是停止位,中间8位数据
异步通信由TH1来产生波特率,在波特率下TXD发送数据(由低位到高位)发送完停止位后T1硬件置1下一次发送之前需要软件清0,接收也是和发送一样,但这里的位采样脉冲就是波特率(由TH1和TR1的值来设置)
REN接收使能位为1,接收位就会进行波特率的一个16倍的采样
3、方式2和方式3(11位的异步数据通信)
TXD发送引脚,RXD为接收引脚(有9位数据)与方式1不同的是第9位是RB8/TB8
前8位数据存储在SBUF第9位放在RB8,
如果RB8=1,前8位数据存储在SB8,如果RB8=0则丢弃前8位的数据
波特率的计算方法
这里不是2的SMOD次方
T1的溢率
#include <STC89C5xRC.H>
void UartInit(int i)
{
SCON=0x50; //0101 0000 串口方式1
TMOD|=0x20; //0010设置定时器1,方式2(8位自动重载)
TH1=i; //设定定时器初值
TL1=i;
PCON =0x80; //1000 0000SMDO 打开倍频
TR1=1; //打开定时器
EA=1; //打开总中断
ES=1; //打开串行通信中断
}
void main()
{
UartInit(0xFA);
while(1)
{
};
}
void Uart() interrupt 4
{
int receive =0;
RI=0;
receive =SBUF;
SBUF = receive;
while(!TI);
TI =0;
}
后面的内容可以不看
最后也是我自己的问题;在我学习时,容易把定时器的TH1和TL1的计数,和串口里面的波特率混在一起
在 51 单片机中的串口通信中,波特率是用来确定数据传输速率的参数。波特率表示每秒传输的比特数。当波特率设置为每溢出一次就每输入一个数据时,意味着每当串口中断发生(溢出)一次,就会接收一个数据。
在 51 单片机中,串口通信通常使用中断方式进行数据的接收和发送。当接收缓冲区中有新的数据到达时,会触发串口中断,通过中断服务程序将数据从接收缓冲区读取出来。所以波特率的设置并不直接决定每次中断接收到的数据量,而是表示每秒能够传输的比特数。
具体每次中断接收到的数据量取决于中断服务程序的实现和数据的发送频率。如果发送端每秒发送多个数据,而中断服务程序及时处理每个中断,那么每次中断可能会接收到多个数据。反之,如果发送端每秒只发送一个数据,或者中断服务程序无法及时处理每个中断,那么每次中断可能只接收到一个数据。
因此,波特率的设置并不直接决定每次中断接收到的数据量,而是影响整体的数据传输速率