本篇博文介绍的是用51单片机的串口通信【下】,包含小白玩串口控制的ASSII避坑,串口支持单词型指令控制,串口原理协议概念收尾,通过手机蓝牙控制LED,HC-08蓝牙模块,AT指令修改蓝牙名字。看到这篇博文的朋友,可以先赞再看吗?
一、数学分数计算。
二、数字电子时序图
三、数字电子中与或运算
四、计算机中的进制转换
五、C变量
六、基本输入输出
七、流程控制
八、函数
九、指针
十,字符串
如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!
如果要用1控制开灯,0控制关灯。那么是直接改判断条件还是怎么做呢?
实验后观察可以开灯,也可以关灯
这是为什么呢?我们想一想,在C语言中为什么int
型和char
型是可以互通的呢?其实是因为ASSII
码的存在。也就是说计算机在处理文本时是用ASSII
码来处理,所以在代码为1开灯0关灯
时在文本模式下输入1开灯0关灯不执行,是因为代码下的1和0不是文本下的1和0的ASSII码
。若要实现在文本模式下输入1开灯0关灯,那么就要在代码内写49和48来控制开关灯,因为49是1的ASSII码,48是0的ASSII码。
当使用HEX模式时,在计算机中把16进制的1和二进制的1是互通的,
也就是此时输入1能被单片机识别并执行开灯。
利用字符数组来承接单词型指令
利用strstr函数来查找指令并执行
#define SIZE 32
char LEDStatus[SIZE];
static int i = 0;
LEDStatus[i] = SBUF;
i++; //数组标号增加,方便存放字符串
strstr
字符查找函数是因为:如果选用strcmp
字符串比较函数,必须一致才成立,但在传送字符串是会把字符顺序搞乱。所以使用查找函数来查找,查找函数只需要查找含有相应字符即可,不必顺序一致。string.h
#include "string.h"
i = 0; //清零是为了方便存放下一次指令
memset(LEDStatus,'\0',SIZE); //字符串清零函数,实参为清零的字符串变量,清理成什么字符,清理的大小或数量
#include "reg52.h"
#include "string.h"
#define SIZE 32
sfr AUXR = 0x8e; //声明AUXR寄存器地址
sbit LED1 = P3^7; //使用位定义声明LED1
//建立接收电脑开关灯的指令变量
char LEDStatus[SIZE];
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) //自己配
{
//配置串口工作方式为方式1,从只收不发改为能收能发
SCON = 0x50;
//配置辅助寄存器,减少电磁辐射,稳定晶振频率
AUXR = 0x01;
//设置定时器工作方式为定时器1的8位自动重装
TMOD &= 0x0F;
TMOD |= 0x20;
//设置串口波特率为9600,0误差
TH1 = 0xFD;
TL1 = 0xFD;
//打开定时器1
TR1 = 1;
//打开总中断
EA = 1;
//打开串口中断
ES = 1;
}
void sendByte(char data_mas)
{
SBUF = data_mas;
while(!TI);
TI = 0; //一定要软件置零,不然会出现乱序
}
void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
void main()
{
//初始化灯的状态
LED1 = 1;
//初始化串口,配置波特率
UartInit();
//每延时1秒向电脑发送数据a
while(1)
{
Delay1000ms();
sendString("一起来学串口通信!!!\r\n"); //\r\n 为串口中的换行,缺一不可
//怎么知道PC发了数据:由手册可知RI位为接受中断标志位,所以用查询的方法来判断RI是否等于1来开关灯
}
}
void UART_handler() interrupt 4
{
//定义一个静态整型变量,在多次函数调用中只被执行一次初始化
static int i = 0;
//在串口中段函数中可以对发送接收中断标志进行处理
if(RI == 1)
{
RI = 0; //必须软件置零
LEDStatus[i] = SBUF;
i++; //数组标号增加,方便存放字符串
//如果用开灯指令开灯,关灯指令关灯
if(strstr(LEDStatus,"开灯")) //运用C语言字符串知识,使用的是字符串查找函数,查找到即返回1
{
LED1 = 0;
i = 0; //清零是为了方便存放下一次指令
memset(LEDStatus,'\0',SIZE); //字符串清零函数,实参为清零的字符串变量,清理成什么字符,清理的大小或数量
}
if(strstr(LEDStatus,"关灯"))
{
LED1 = 1;
i = 0;
memset(LEDStatus,'\0',SIZE);
}
}
if(TI);
}
当软件设置SCON的SM0、SM1为“01”时,串行通信则以模式1工作。此模式为8位UART格式,**一帧信息为10
位:1
位起始位,8
位数据位(低位在先)和1
位停止位。**波特率可变,即可根据需要进行设置。TxD(TxD/P3.1)
为发送信息,RxD(RxD/P3.0)
为接收端接收信息,串行口为全双工接受/发送串行口。
#include "reg52.h"
#include "string.h"
#define SIZE 32
sfr AUXR = 0x8e; //声明AUXR寄存器地址
sbit LED1 = P3^7; //使用位定义声明LED1
//建立接收电脑开关灯的指令变量
char LEDStatus[SIZE];
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) //自己配
{
//配置串口工作方式为方式1,从只收不发改为能收能发
SCON = 0x50;
//配置辅助寄存器,减少电磁辐射,稳定晶振频率
AUXR = 0x01;
//设置定时器工作方式为定时器1的8位自动重装
TMOD &= 0x0F;
TMOD |= 0x20;
//设置串口波特率为9600,0误差
TH1 = 0xFD;
TL1 = 0xFD;
//打开定时器1
TR1 = 1;
//打开总中断
EA = 1;
//打开串口中断
ES = 1;
}
void sendByte(char data_mas)
{
SBUF = data_mas;
while(!TI);
TI = 0; //一定要软件置零,不然会出现乱序
}
void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
void main()
{
//初始化灯的状态
LED1 = 1;
//初始化串口,配置波特率
UartInit();
//每延时1秒向电脑发送数据a
while(1)
{
Delay1000ms();
sendString("一起来学串口通信!!!\r\n"); //\r\n 为串口中的换行,缺一不可
//怎么知道PC发了数据:由手册可知RI位为接受中断标志位,所以用查询的方法来判断RI是否等于1来开关灯
}
}
void UART_handler() interrupt 4
{
//定义一个静态整型变量,在多次函数调用中只被执行一次初始化
static int i = 0;
//在串口中段函数中可以对发送接收中断标志进行处理
if(RI == 1)
{
RI = 0; //必须软件置零
LEDStatus[i] = SBUF;
i++; //数组标号增加,方便存放字符串
//如果用开灯指令开灯,关灯指令关灯
if(strstr(LEDStatus,"开灯")) //运用C语言字符串知识,使用的是字符串查找函数,查找到即返回1
{
LED1 = 0;
i = 0; //清零是为了方便存放下一次指令
memset(LEDStatus,'\0',SIZE); //字符串清零函数,实参为清零的字符串变量,清理成什么字符,清理的大小或数量
}
if(strstr(LEDStatus,"关灯"))
{
LED1 = 1;
i = 0;
memset(LEDStatus,'\0',SIZE);
}
}
if(TI);
}
HC-08
的TXD
连接51
单片机的RXD
。HC-08
的RXD
连接51
单片机的TXD
。HC-08
的VCC
连接51
单片机的5V
。HC-08
的GND
连接51
单片机的GND
。透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。
HC-08
的TXD
连接USB
转TTL
转接器的RXD
。HC-08
的RXD
连接USB
转TTL
转接器的TXD
。HC-08
的VCC
连接USB
转TTL
转接器的5V
。HC-08
的GND
连接USB
转TTL
转接器的GND
。很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!