🎊专栏【51单片机】
🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
🎆音乐分享【Promise】
🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰
目录
🍔串口通信
😎代码
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void main()
{
UsartInit(); // 串口初始化
while(1);
}
void Usart() interrupt 4
{
u8 receiveData;
receiveData=SBUF; //出去接收到的数据
RI = 0; //清除接收中断标志位
SBUF=receiveData; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
🍔串口初始化
void UsartInit()
{
SCON=0X50; //设置为工作方式1 看视频P62 4:30
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
⭐分析
🏳️🌈确定T1的工作方式
🎈TMOD=0X20;
为什么是20
M1 M0 这两位控制的是工作方式,是方式2,M1 M0 是10
对应到前面就是0010,那么高四位对应的就是2
🏳️🌈确定T1的初值
🎈TH1=0XF3; TL1=0XF3;
根据下面的软件,设置 TH1 TL1
通过上图,可以读出是F3H
那么 TH1=0XF3; TL1=0XF3;
🏳️🌈波特率加倍(操作SMOD)
🎈PCON=0X80;
通过上图,发现SMOD是在PCON这个寄存器里面,
由于SMOD在最高位,二进制中最高位一般表示符号位,所以SMOD不能进行位操作
所以要对这整个寄存器进行操作,
由于SMOD=0,波特率不加倍,否则加倍
所以设置PCON=0X80;就是1000 0000 相当于对SMOD进行操作
🏳️🌈启动T1
🎈TR1=1
就是编程TCON的TR1位,打开计数器
🏳️🌈确定串行口控制(编程SCON寄存器)
🎈SCON=0x50
为什么是5
我们选择方式1,那么波特率就是可变的,
由图可知,方式1的SM0=0 SM1=1
SM2我们设置为0
REN,是允许串行接收位,我们设置为1
由下图可知,后四位都是0
⭐⭐⭐所以高四位是5,所以是0x50
🏳️🌈打开中断
🎈ES=1; EA=1
ES=1; 串口中断
EA=1; 打开总中断
🍔中断分析
void Usart() interrupt 4
{
u8 receiveData;receiveData=SBUF; //出去接收到的数据
RI = 0; //清除接收中断标志位
SBUF=receiveData; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
使用SBUF寄存器来存储数据
为什么要RI=0 TI=0
清零后,等待下一次的接收
发射完成后,TI为1,那么 !TI为0,就会跳出while循环
假设发射没有完成,那么TI为0,就不会跳出while循环
🍔串口通信控制LED灯
😎效果
串口通信控制LED灯
😎代码
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void main()
{
UsartInit(); // 串口初始化
while(1);
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while (!TI);
TI = 0;
}
void Usart() interrupt 4
{
if (RI == 1) //如果接收标志位为1,接收到了数据
{
P2 = ~SBUF; //读取数据,取反后输出到LED
UART_SendByte(SBUF); //将受到的数据发回串口
RI = 0; //接收标志位清0
}
}
🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰