资源描述
基于51单片机蓝牙模块数据传播设计(修订版)
摘要
本设计以STC89C52单片机为控制核心。经蓝牙模块实现无线连接,发送数据和接受数据,通过LCD1602显示接受数据和编辑发送数据,两个单片机通过内部程序实现实时接受、发送和显示,从而完毕有关规定。
1方案设定
1-1电路设计框图
LCD1602
液晶显示模块2
LCD1602
液晶显示模块1
蓝牙收发模块2
蓝牙收发模块1
STC89C52
主控制模块2
STC89C52
主控制模块1
矩阵键盘模块2
矩阵键盘模块1
无线信号
串口 串口
图4-1
注:由于STC89C52芯片串口寄存器容量限制,每次收发只能一种字节。
1-2功能论述
本作品通过HC-05主从机一体蓝牙模块实现与带蓝牙设备先通过OPP蓝牙合同来实现配对连接,实现连接配对可通过电路板上数字按键来实现输入,经STC89C52单片机解决后通过HC-05蓝牙无线传送到另一方单片机上,通过STC89C52单片机解决后可在LCD1602液晶显示所接受到数据!
1-3使用阐明
在接通电源前,先把蓝牙模块插到单片机上,紧接着启动电源。观测蓝牙模块批示灯,等待两个单片机之间连接匹配,待批示灯浮现双闪后就匹配连接成功。接下来可依照自己想要发送数据在单片机按键区域(0~9)按下,按下后显示屏便浮现你所要发送数据,确认无误之后就按下单片机上发送按钮即立即发送到另一方单片机上(两个单片机可以互相发送)!
2系统硬件设计
2-1主控制模块
图6-1
2-2蓝牙收发模块
图8-1
2-3液晶显示模块
图9-1
LCD1602资料:
1602采用原则16脚接口,其中:
第1脚:GND为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示屏对比度调节端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一种10K电位器调节对比度)。
第4脚:RS为寄存器选取,高电平1时选取数据寄存器、低电平0时选取指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳
变时执行指令。
第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电
源。
15脚背光正极。
16脚背光负极。
特性:
3.3V或5V工作电压,对比度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等各种功能有80字节显示数据存储器DDRAM
内建有192个5X7点阵字型字符发生器CGROM8个可由顾客自定义5X7字符发生器CGRAM特性应用微功耗、体积小、显示内容丰富、超薄轻巧,惯用在袖珍式仪表和低功耗应用系统中。操作控制
注:关于E=H脉冲——开始时初始化E为0,然后置E为1。
2-4矩阵键盘模块
图10-1
注:键盘输入某些使用矩阵键盘设计原理。
3系统软件设计
3-1源程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^6;
sbit en=P2^7;
sbit rw=P2^5;
sbit Key=P2^4;
uchar code table_Receive[]={"Receive:"};
uchar code table_Send[]={" Send:"};
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
uchar num,temp,temp2,a,flag,add;
uchar n,m;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_lcd_com(uchar com){
rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_data(uchar date){
rs=1;
P0=date;
delay(5);
en=(1);
delay(5);
en=0;
}
void lcdinit(){
en=0;
write_lcd_com(0x38);
write_lcd_com(0x0c);
write_lcd_com(0x06);
write_lcd_com(0x01);
for(m=0;m<8;m++)
{
write_data(table_Receive[m]);
delay(1);
}
write_lcd_com(0x80+0x40);
for(n=0;n<8;n++)
{
write_data(table_Send[n]);
delay(1);
}
}
void keyscan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(2);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=4;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
num=num-1;
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(2);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=5;break;
case 0xdd:num=6;break;
case 0xbd:num=7;break;
case 0x7d:num=8;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
num=num-1;
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(2);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=9;break;
case 0xdb:num=10;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
num=num-1;
}
}
}
void Key1()
{
if(Key==0)
{
delay(2);
if(Key==0)
{
switch(num)
{ case 0:SBUF=0x00; while(!TI); TI=0;break;
case 1:SBUF=0x01; while(!TI); TI=0;break;
case 2:SBUF=0x02; while(!TI); TI=0;break;
case 3:SBUF=0x03; while(!TI); TI=0;break;
case 4:SBUF=0x04; while(!TI); TI=0;break;
case 5:SBUF=0x05; while(!TI); TI=0;break;
case 6:SBUF=0x06; while(!TI); TI=0;break;
case 7:SBUF=0x07; while(!TI); TI=0;break;
case 8:SBUF=0x08; while(!TI); TI=0;break;
case 9:SBUF=0x09; while(!TI); TI=0;break;
}
while(!Key);
}
}
}
void get()
{
if(RI==1)
{
RI=0;
switch(SBUF)
{
case 0x00:temp2=0;break;
case 0x01:temp2=1;break;
case 0x02:temp2=2;break;
case 0x03:temp2=3;break;
case 0x04:temp2=4;break;
case 0x05:temp2=5;break;
case 0x06:temp2=6;break;
case 0x07:temp2=7;break;
case 0x08:temp2=8;break;
case 0x09:temp2=9;break;
}
write_lcd_com(0x80+add);
write_data(table[temp2]);
add++;
}
}
void main()
{
SCON = 0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
add=8;
Key=1;
rw=0;
lcdinit();
while(1)
{
keyscan();
write_lcd_com(0x80+0x40+8);
write_data(table[num]);
get();
Key1();
}
}
(以上为所有内容)
展开阅读全文