1.串口是什么?
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。
51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
STC89C52的UART有四种工作模式:
- 模式0:同步移位寄存器;
- 模式1:8位UART,波特率可变(常用);
- 模式2:9位UART,波特率固定;
- 模式3:9位UART,波特率可变;
51单片机有两个通信接口TXD——P3^0;RXD——P3^1;
2.串口模式1的配置
(1)串口模式1是用寄存器SCON配置串口模式1:
SM0 SM1 为1 0 //选择方式2;REN为1;//即REN=1为允许串行接收状态
综上所述:
SCON = 0x50; //8位数据,可变波特率
(2)波特率可变设置寄存器PCON的SMOD=1,
PCON=0X80;//波特率加倍
(3)由图可见,串口的波特率是由定时器T1来产生的,所以我们要先打开定时器T1
打开定时器T1用到TCON寄存器的TR1位:
TCON的低四位用于控制外部的中断。TCON的高4位用于控制定时/计数计时器的启动和申请中断。
TR1=1;//定时器1开始计时
(4)查stc52手册可知定时器要采用方式2(8位自动重装模式)
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
(5)同时我们还要禁止定时器1中断
ET1 = 0;//禁止定时器中断
(6)然后定时器要设置高低八位寄存器TH1/TL1的初值,来控制波特率的速率:可查表
或者直接用STC-ISP软件生成初值 :如下面软件的配置,初值为
TH1=0XFD;TL1=0XFD;//设置定时初始值
综上所述,串口的初始化配置总结如下:
void UartInit(void) //9600bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初始值
TH1 = 0xFA; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
}
也可以直接用stc-dsp软件进行配置,把AUXR的两行代码去掉即可;
3.串口的使用
SBUF寄存器
单片机的内部硬件自带发送和接收数据的功能,它是通过SBUF寄存器实现的。
SBUF地址都为99H,物理结构上,这是俩个完全独立的寄存器,
一个是发送寄存器,另一个是接收寄存器。
a=SBUF,代表单片机从计算机接收到了数据
//串口发送一个字节数据
void UART_SendByte(unsigned char Byte){
SBUF=Byte;
//检测是否完成
while(TI==0);
TI=0;//TI复位
}
SBUF=a,代表单片机要给计算机发送a数据
//串口发送一个字节数据
void UART_SendByte(unsigned char Byte){
SBUF=Byte;
//检测是否完成
while(TI==0);
TI=0;//TI复位
}
(1)单片机向PC发送数据
IT是发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,
即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则
在停止位开始发送时由内部硬件置位,必须用软件复位。
#include <REGX52.H>
#include "UART.H"
#include "DELAY.H"
void USART_Sendbit(unsigned char Byte)
{
SBUF=Byte;//发送的字节先存在SBUF寄存器后发出
while(TI==0);
TI=0;
}
void main()
{
UartInit();//串口初始化函数
while(1){
USART_Sendbit(0x66);//向电脑发送0x66
Delay(1000);//延时1s,使串口发送不会太快
}
}
结果如图:
(2)单片机接收PC的数据
RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1, 向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到 停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复 位,即RI=0.
单片机接收电脑的数据存到SBUF寄存器
接收要重新增加中断的配置:文章来源:https://www.toymoban.com/news/detail-428637.html
#include <REGX52.H>
void UART_Init(void) //9600bps@11.0592MHz
{
PCON |= 0x80;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xFA;
TH1 = 0xFA;
ET1 = 0;
TR1 = 1;
EA=1;//开启总中断
ES=1;//开启串口中断
}
#include <REGX52.H>
#include "UART.H"
void main()
{
UART_Init();
while(1){
}
}
void UART_Routine(void) interrupt 4
{
if(RI==0)
{
USART_Sendbit(SBUF);
P2=SBUF;
RI=0;
}
}
这里的"UART.H"是封装了串口的初始化UART_Init()与串口发送USART_Sendbit(SBUF)函数,模块化编程,可以使代码更加简洁。文章来源地址https://www.toymoban.com/news/detail-428637.html
到了这里,关于51单片机学习入门(三):串口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!