一、串口1的实现原理
a.查看STC15F2K60S2数据手册:
串口一在590页,此款单片机有两个串口。
串口1相关寄存器:
SCON:串行控制寄存器(可位寻址)
SCON寄存器说明:
需要PCON寄存器的SMOD0/PCON.6为0,使SM0和SM1一起指定工作模式,这里选择工作模式1,REN位置1,允许接受,
TI, R1 在中断里面 调用。
SCON=0X50; 0101 0000
PCON寄存器:
PCON寄存器说明:
SMOD无论0还是1,串口1波特率 都加倍,SMOD0必须为0,才可选择工作模式。所以PCON=0x00(默认也是0X00);
SBUF数据缓冲寄存器:
说明:实际上两个缓冲器,一个是度寄存器,一个是写寄存器。把要发送的数据写到SBUF里面,从SBUF立马接收数据,SBUF大小为1个字节。
AUXR辅助寄存器:
AUXR寄存器说明:控制串口1的速度都为1T,采用定时器1作为串口1的波特率发生器。
由于还用到了定时器1,所以还要 配置 定时器1的工作模式,工作模式为16位自动重装模式,设置定时器1初始值,禁止定时器1中断,开启定时器1.
//定时器1配置代码
{
TMOD&=0X0F;
TL1=0;
TH1=0;
ET1=0;
TR1=1;
}
串口1中断配置:
说明:可知其中断标志位为ES,可以位寻址,所以可以直接给ES赋值,我们需要开启,ES=1;EA=1;
2 串口1初始化代码:
void Uart1_Init(void) //4800bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x8F; //设置定时初始值
TH1 = 0xFD; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
//记得开启中断
ES=1;
EA=1;
}
串口中断函数:
可知 中断号为4
串口1中断代码:
void UART1_Routine(void) interrupt 4
{
if(RI)
{
//接受定长字符
RI=0;
rx_clear_cnt=0;
rx_buf[rx_long++] = SBUF;
if(rx_long==3)
{
rx_long=0;
rx_flag=1;
}
//接受不定长字符
RI=0;
rx_clear_cnt=0;
rx_buf[rx_long++]=SBUF;
if(rx_buf=='\n')
{
rx_long=0;
rx_flag=1;
}
}
if(TI)
{
TI=0;
busy=0;//发送忙标志位
}
}
串口1发送函数:
void SendByte(u8 byte)
{
while(busy);
busy=1;//申请忙碌,进入保护,防止干扰
SBUF=byte;
}
void SendString(u8* str)
{
while(*str)
{
SendByte(*str++);
}
}
定时清除串口接收内容:
void RXClear_Process(void)
{
rx_clear_cnt++;
if(rx_clear_cnt>=50)
{
rx_cleat_cnt=0;
rx_long=0;
memset(rx_buf,'\0',sizeof(rx_buf);
}
}
2025蓝桥杯(单片机)备赛--扩展外设之超声波测距原理与应用(十一)-CSDN博客
2025蓝桥杯(单片机)备赛--扩展外设之DS1302的使用(九)_ds1302引脚图及功能-CSDN博客
2025蓝桥杯(单片机)备赛--扩展外设之I2C的重要应用--PCF8591(八)-CSDN博客
2025蓝桥杯(单片机)备赛--扩展外设之I2C的重要应用--AT24C02(七)-CSDN博客
2025蓝桥杯(单片机)备赛--扩展外设控制之DS18B20(六)-CSDN博客
2025蓝桥杯(单片机)备赛--基本外设控制之共阳数码管(四)-CSDN博客
2025蓝桥杯(单片机)备赛--基本外设控制之继电器和蜂鸣器(三)-CSDN博客
2025蓝桥杯(单片机)备赛--基本外设控制之LED(二)_2024蓝桥杯单片机资料-CSDN博客
2025蓝桥杯(单片机)备赛--基本框架搭建(一)_蓝桥杯单片机大赛-CSDN博客