什么可以用手机蓝牙控制LED???#串口通信【上】
前言
本篇博文介绍的是用51单片机的串口通信【上】,包含串口的接线方式,串口编程要系,编程实现每秒发送数据给电脑,串口编程寄存器分析。看到这篇博文的朋友,可以先赞再看吗?
预备知识
一、数学分数计算。
二、数字电子时序图
三、数字电子中与或运算
四、计算机中的进制转换
五、C变量
六、基本输入输出
七、流程控制
八、函数
九、指针
十,字符串
如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!
1.串口的接线方式
- RXD;数据输入引脚,数据接受;STC89系列对应P3.0口,上官一号有单独引出。
- TXD:数据发送引脚,数据发送;STC89系列对应P3.1口,上官一号有单独引出。
- 接线方式
2.串口编程要素
印象塑造
-
输入/输出数据缓冲器叫做SBUF,都用99H地址码,但是是两个独立的8位寄存器
-
代码体现为: 想要接收数据
char data = SBUF
想要发送数据SBUF = data
-
手册资料
- 课程笔记
-
回忆UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信速度,叫做波特率
对于电脑来说,别人做好了软件,鼠标点点点就能配置好,而苦逼单片机的波特率配置需要我们写代码
点点点配置什么,我们代码也要配置对应参数
3.编程实现每秒发送数据给电脑
3.1使用单片机下载器生成1000ms延时函数
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
3.2使用单片机下载器实现波特率计算
-
系统频率选择晶振的频率
110592MHZ
-
波特率选择
9600
-
URAT选择串口一
-
URAT数据位选择8位数据
-
波特率发生器选择定时器1(8位自动重载)
-
定时器时钟选择
12T(FOSC/12)
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
3.3查阅手册配置寄存器AUXR
-
手册内容
-
代码
sfr AUXR = 0x8e;
3.4完整程序代码
#include "reg52.h"
sfr AUXR = 0x8e; //声明AUXR寄存器地址
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void main()
{
char data_mas = 'a';
//初始化串口,配置波特率
UartInit();
//每延时1秒向电脑发送数据a
while(1)
{
Delay1000ms();
SBUF = data_mas;
}
}
3.5串口助手设置及显示
-
接收缓冲区选择文本模式
-
串口选择
COM7
-
波特率选择
9600
-
校验位选择无校验
-
停止位选择1位
-
最后打开串口
4.串口编程寄存器分析
4.1 PCON电源控制寄存器配置
4.1.1 PCON
电源控制寄存器示意图
4.1.2 SMOD(bit7)
位的解释
4.1.3 SMOD0(bit6)
位解释
串口通信帧错误检测的原因
在串口通信中,帧错误检测是一种用于验证数据传输准确性的重要机制。串口通信将数据分割成一帧一帧进行传输,每一帧包含起始位、数据位、校验位和停止位。帧错误指的是在传输过程中发生的数据错误,可能是由于噪声、干扰或其他传输问题导致的。
帧错误检测的主要目的是确保接收端能够检测到并纠正任何可能导致数据错误的情况。
4.1.4代码中PCON
电源控制寄存器的含义
PCON &= 0x7F; //波特率不倍速
8 4 2 1 8 4 2 1
0 1 1 1 1 1 1 1
(bit7)SMOD = 1 波特率不加倍
(bit6)SMOD0 = 1 开启帧错误检测
4.2 SCON串行控制寄存器配置
4.2.1 SCON
串行控制寄存器示意图
4.2.2 SM0/FE(bit7)
位的解释
4.2.3 SMO
、SM1
组合确定串行的工作方式
4.2.4 SM2(bit5)
位的解释
4.2.5 REN(bit4)
位的解释
注意:如果在开发过程中出现无法接受数据,请检查此位是否配置。
TI(bit1)
位的解释
4.2.6代码中SCON
串行控制寄存器含义
SCON = 0x50; //8位数据,可变波特率
8 4 2 1 8 4 2 1
0 1 0 1 0 0 0 0
SM0/FE(bit7) = 0 启用了帧错误检测,所以软件置零
SM1(bit6) = 1 与SM0 = 0 构成了工作方式1,8位UART波特率可变
TI(bit1) = 0 工作在非方式0时需要软件置零
4.3 AUXR
辅助寄存器配置
4.3.1 AUXR
辅助寄存器示意图
4.3.2 ALEOFF(bit0)
位的解释
4.3.3 EXTRAM(bit1)
位的解释
4.3.4代码中AUXR
辅助寄存器的含义
AUXR &= 0xBF;
这条语句使用了位与(AND)操作符和掩码0xBF(二进制为10111111)。通过这个操作,将AUXR寄存器中的第6位(从右到左数,从0开始计数)置为0,而其他位的值保持不变。换句话说,这个操作将清除AUXR寄存器中的第6位。
AUXR &= 0xFE;
这条语句使用了位与(AND)操作符和掩码0xFE(二进制为11111110)。通过这个操作,将AUXR寄存器中的最低位(即第0位)置为0,而其他位的值保持不变。换句话说,这个操作将清除AUXR寄存器中的最低位。
总体含义为将bit6和ALEOFF(bit0)清零,不提升系统EMT性能
4.4 TMOD
定时器/计数器工作模式寄存器配置
4.4.1 TMOD
定时器/计数器工作模式寄存器示意图
4.4.2 M0(bit0)
、M1(bit1)
、M0(bit4)
、M1(bit5)
组合设置定时器/计数器模式
4.4.3代码中TMOD
定时器/计数器工作模式寄存器的含义
TMOD &= 0x0F; //清除定时器1模式位
高位清零,低位不变
0 0 0 0 1 1 1 1
1 0 1 0 1 0 0 1
0 0 0 0 1 0 0 1
TMOD |= 0x20; //设定定时器1为8位自动重装方式
高位置2,低位不变
0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 1
0 0 1 0 1 0 0 1
结束语
很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!