`大家好, 今天测试一下HC02模块与51单片机进行串口通讯.
测试逻辑: 手机与HC02配对连接后, 逐次向HC02发送字符,51单片机将接收到的字符显示在LCD1602上,并将此字符通过HC02发送回手机端(为显示区别, 回传两次)
用到的工具/软件如下:
1.HC02蓝牙模块
2.安卓手机一部(需安装"蓝牙串口助手")
3.PC(安装Keil uVersion4,用于向单片机写入程序)
4.51单片机最小板
5.LCD1602
实验步骤:
1.向51单片机烧写程序
2.将51单片机与HC02模块连接
51最小板上有3.3V电源接口, 用杜邦线接到HC02的电源与GND端
HC02模块的TXD,RXD分别与单片机的P3.0(RXD),P3.1(TXD)连接. 注意TXD接RXD, RXD接TXD, 且模块的RX端与单片机TXD端中间有一个220欧电阻(按规格书所说,需要串一个220-1K欧电阻)
整体如下:
3.单片机通电, LCD显示预设字符"HC-02" + HC官网地址
4.手机与HC02配对并打开蓝牙串口助手,连接HC02模块
5.手机端发送字符S, 可观察到LCD1602第2行首字符变为S, 同时接收到单片机发送的字符"SS"(LCD图反了,不好意思)
6.继续发送E, 接收到两个E, LCD1602第2行第2字符显示为E
7.继续发送G, 接收到两个G, LCD1602第2行第3字符显示为G
8.逐字符发送, 一共发送16个字符至HC02, 将LCD1602第2行排满, 手机端接收到的是每个字符重复2次
测试完毕. 单片机关键代码附下(串口通讯与LCD1602显示代码百度很多,此处不贴):
//LCD1602接口
***it rs=P0^7;
***it rw=P0^6;
***it ep=P0^5;
uchar count = 0;//串口接收数量
uchar dis1 []={" HC-02 "};//LCD1602第一行字符
uchar dis2 []={""};//LCD1602第二行字符为HC官网地址
void main()
{
lcd_init();//LCD1602初始化
TMOD=0x20; //用定时器设置串口波特率 9600
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //开启总中断
ES=1;
delay2s();//启动时串口会触发一次中断,为避免单片机将此次中断视为蓝牙中断,因此延迟2秒后初始化参数及LCD显示内容
count=0;
dis2[0]='H';
lcd_writedata();//LCD显示内容
while(1);
}
//串口中断函数
void ser() interrupt 4
{
uchar rcv;
RI=0;
rcv=SBUF;
count++;
if(count>=16)
{
dis2[15] = rcv;//LCD1602第2行写入数据
count = 0;//重置计数,以便从第1个字符开始显示
}
else
{
dis2[count-1] = rcv;
}
lcd_writedata();
//接收到的数据向蓝牙发送两次
sendMsg(rcv);
sendMsg(rcv);
}
以上代码还有可优化的地方(比如接收一个字符就刷新LCD全部数据会占用一定时间, 可改为接收一个字符仅显示这个字符), 时间关系先这样.
谢谢.
测试完毕, 谢谢.
`
|