01-串口通信01_发送一个字符a给PC(软件生成初始化)
代码:
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8e;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
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 data1 = 'a';
UartInit();
while(1)
{
Delay1000ms();
SBUF = data1;
}
}
02-串口通信01_发送一个字符a给PC(自己配置寄存器)
1.SCON
2.定时器1
1.选择SCON为方式1 SM0 = 0 SM1 = 1;为0x40;
SCON = 0x40;
2.因为方式1要用到定时器1我们要初始化定时器1 为8位自动重在
1.控制定时器1为高4位 低4位控制定时器0 利用&运算使高4位清0低4位不变
0000 0000
&
0000 1111
=
0000 0000
TMOD &= 0x0f;
2.8位自动重载为1 0 为 0010
0000 0000
|
0010 0000
=
0010 0000
TMOD |= 0x20;
3.利用定时器1计算波特率的公式如上得
TH1 = 0xFD;
TL1 = 0xFD;
4.打开定时器1
TR1 = 1;
代码:
void UartInit(void)
{
SCON = 0x40;
TMOD &= 0x0f;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
03-串口通信02_ 发送字符串给PC
1.封装一个发送单个字符的函数
2.封装一个发送字符串的函数 利用指针
代码:
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8e;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x40;
TMOD &= 0x0f;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
//1.封装发送单个字符串的函数体
void sendstr(char data1)
{
SBUF = data1;//将接收到的单个字符保存到SBUF缓冲区中
while(!TI); //循环执行判断TI是一个发送中断请求标志位
TI = 0; //手动置0
}
//2.封装发送字符串的函数体 利用指针传参给单个字符串函数体发送
void sendstring(char *str)
{
while(*str != '\0')//循环判断字符串到达末尾没有
{
sendstr(*str);
str++;
}
}
//主函数
void main()
{
UartInit();//串口初始化函数
while(1)
{
Delay1000ms();//延时 每1秒发送一次
sendstring("chenlichen shuai\r\n");//需要发送的内容
}
}
04-串口通信03_ PC发送指令控制LED
1.REN
2.RI
1.让REN = 1;允许接收 SCON = 0x50;
2.判断RI = 1;时接收到数据
代码:
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8e;
sbit D5 = P3^6;
char cmd;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //
TMOD &= 0x0f;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
//1.封装发送单个字符串的函数体
void sendstr(char data1)
{
SBUF = data1;//将接收到的单个字符保存到SBUF缓冲区中
while(!TI); //循环执行判断TI是一个发送中断请求标志位
TI = 0; //手动置0
}
//2.封装发送字符串的函数体 利用指针传参给单个字符串函数体发送
void sendstring(char *str)
{
while(*str != '\0')//循环判断字符串到达末尾没有
{
sendstr(*str);
str++;
}
}
//主函数
void main()
{
UartInit();//串口初始化函数
while(1)
{
Delay1000ms();//延时 每1秒发送一次
sendstring("chenlichen shuai\r\n");//需要发送的内容
if(RI == 1)
{
RI = 0;
cmd = SBUF;
if(cmd == 'o')
{
D5 = 0;
}
if(cmd == 'c')
{
D5 = 1;
}
}
}
}
5.串口通信04_PC串口中断控制LED
1.串口中断
2.串口中断寄存器
1.查询串口中断服务函数的interrupt 4
2.使能串口中断寄存器 ES = 1; EA = 1;
3.编写串口中断函数体
代码:
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8e;
sbit D5 = P3^6;
char cmd;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //
TMOD &= 0x0f;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ES = 1;//打开串口中断
EA = 1;//打开总中断
}
//1.封装发送单个字符串的函数体
void sendstr(char data1)
{
SBUF = data1;//将接收到的单个字符保存到SBUF缓冲区中
while(!TI); //循环执行判断TI是一个发送中断请求标志位
TI = 0; //手动置0
}
//2.封装发送字符串的函数体 利用指针传参给单个字符串函数体发送
void sendstring(char *str)
{
while(*str != '\0')//循环判断字符串到达末尾没有
{
sendstr(*str);
str++;
}
}
//主函数
void main()
{
UartInit();//串口初始化函数
while(1)
{
Delay1000ms();//延时 每1秒发送一次
sendstring("chenlichen shuai\r\n");//需要发送的内容
}
}
void UART_Handler() interrupt 4 //串口中断标志是interrupt 4
{
if(RI)
{
RI = 0;
cmd = SBUF;
if(cmd == 'o')
{
D5 = 0;
}
if(cmd == 'c')
{
D5 = 1;
}
}
}
6.串口通信05_字符串型指令如何处理
#include "reg52.h"
#include "intrins.h"
#include <string.h>
sfr AUXR = 0x8e;
sbit D5 = P3^6;
char cmd[12];
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //
TMOD &= 0x0f;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ES = 1;//打开串口中断
EA = 1;//打开总中断
}
//1.封装发送单个字符串的函数体
void sendstr(char data1)
{
SBUF = data1;//将接收到的单个字符保存到SBUF缓冲区中
while(!TI); //循环执行判断TI是一个发送中断请求标志位
TI = 0; //手动置0
}
//2.封装发送字符串的函数体 利用指针传参给单个字符串函数体发送
void sendstring(char *str)
{
while(*str != '\0')//循环判断字符串到达末尾没有
{
sendstr(*str);
str++;
}
}
//主函数
void main()
{
UartInit();//串口初始化函数
while(1)
{
Delay1000ms();//延时 每1秒发送一次
sendstring("chenlichen shuai\r\n");//需要发送的内容
}
}
void UART_Handler() interrupt 4 //串口中断标志是interrupt 4
{
static int i = 0;
if(RI)
{
RI = 0;
cmd[i] = SBUF;
i++;
if(i == 12)
{
i = 0;
}
if(strstr(cmd,"en"))
{
D5 = 0;
i = 0;
memset(cmd,'\0',12);
}
if(strstr(cmd,"se"))
{
D5 = 1;
i = 0;
memset(cmd,'\0',12);
}
}
}
7.通过蓝牙控制LED
8.通过CH340连接蓝牙模块进行名字的修改
利用AT指令