标题:
51单片机密码锁连接蓝牙
[打印本页]
作者:
a1034
时间:
2018-6-17 10:15
标题:
51单片机密码锁连接蓝牙
弄了个密码锁,通过矩阵键盘输入密码,然后想用手机输入密码,
要在原来的程序中加什么代码才可以实现蓝牙控制啊,还有手机蓝牙串口助手应该怎么设置那些按键,求大神帮帮忙
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar count; // 密码位计数
uchar pw[4]; // 初始密码存储区
uchar pwbuf[4]; // 输入密码存储区
uchar selfdefinebuf[4]; //自定义密码存储区
uchar error_cnt; //错误次数计数器
bit enterflag; // 确认键按下与否标志
bit pwflag; // 密码正确与否标志
bit last_pwflag; //前一次密码输入正确与否标志
sbit open=P2^5; //锁开指示灯,绿灯。低电平亮
sbit beep=P2^0; //蜂鸣器,低电平叫
sbit red=P2^1; //红灯,低电平亮
sbit close=P2^7; //锁合指示灯,黄色。低电平亮
sbit youxiao=P2^3; //蓝灯,按键有效指示。低电平亮
void flashred_L(void); //闪红灯,表示可输入自定义密码
void flashred_S(void); //快闪红灯,重新输入自定义密码
void flashall(void); //三盏灯全亮,不能继续输入
/* 键消抖延时函数 */
void delay(void)
{
uint i;
for (i=8000;i>0;i--);
}
//蓝灯亮一下,再灭,用来表示按键按下有效
void youxiaoled()
{
youxiao=0;
delay();
youxiao=1;
}
// 蜂鸣器短叫 报警
void baojing()
{
beep=0;
delay();
beep=1;
delay();
beep=0;
delay();
beep=1;
}
/* 键扫描函数 */
uchar keyscan() //键盘扫描函数
{ uchar temp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(); //键盘去抖,
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled(); //按键有效指示灯亮,即蓝灯亮
temp=P1;
switch(temp)
{
case 0xee: return 1;break;
case 0xde: return 2;break;
case 0xbe:return 3;break;
case 0x7e:return 11;break; //确定键 11
}
while(temp!=0xf0) //按键抬起检测
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;//无键按下返回0
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay();
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled();
temp=P1;
switch(temp)
{
case 0xed: return 4;break;
case 0xdd: return 5;break;
case 0xbd:return 6;break;
case 0x7d:return 12;break;//取消键12
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay();
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled();
temp=P1;
switch(temp)
{
case 0xeb:return 7;break;
case 0xdb: return 8;break;
case 0xbb:return 9;break;
case 0x7b:return 13;break;//重设密码键13
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay();
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled();
temp=P1;
switch(temp)
{
case 0xe7:return 10;break;//数字0
default :break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;
}
}
/* 密码比较函数 */
bit pwcmp(void)
{
bit flag;
uchar i;
for (i=0;i<4;i++)
{
if (pw[i]==pwbuf[i])
flag = 1;
else
{
flag = 0;
i = 4;
error_cnt++; //错误次数加1
}
}
return(flag);
}
//初始化设置函数
void init_main()
{
count = 0; // 初始没有输入密码,计数器设为0
error_cnt=0; //错误次数归0
enterflag = 0; // 没有按下确认键
pwflag = 0; // 密码标志先置为0
last_pwflag=0;
close=0; //锁合灯亮,其它灯灭
open = 1;
beep = 1;
red=1;
/* 假设内定密码为1234, 修改初始密码可在这里改*/
pw[0] = 1;
pw[1] = 2;
pw[2] = 3;
pw[3] = 4;
}
//长闪红灯,表示可输入自定义密码
void flashred_L(void)
{
red=0;
delay();
delay();
delay();
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
}
//快闪红灯,重新输入自定义密码
void flashred_S(void)
{
red=0;
delay();
delay();
red=1;
delay();
delay();
red=0;
delay();
delay();
red=1;
delay();
delay();
red=0;
delay();
delay();
red=1;
}
void flashall(void)
{
beep=0;
open=0;
red=0;
delay();
delay();
beep=1;
open=1;
red=1;
}
/* 主程序 */
void main()
{
uchar j, key;
uchar tempkey;
init_main();
while(1)
{
if(error_cnt<3) //错误次数小于3
{
key = keyscan(); // 调用键盘扫描函数
if(key>0&&key<=10) //用户输入密码
{
if(key==10)
key=0;
if (count<4)
{
pwbuf[count] = key;
count++;
}
}
else if(key==11) // 确认键按下
{
enterflag = 1; // 确认键按下
if (count==4) // 只有输入4个密码后按确认键才作密码比较
{
delay( );
pwflag = pwcmp();
}
else
{
pwflag = 0; // 否则直接pmflag赋0
error_cnt++; //错误次数加一
}
last_pwflag=pwflag; //前一次密码输入正确与否标志
enterflag = 0; // 标志位置回0
count = 0; // 密码位计数器清零
delay( );
if (pwflag==1)
{open = 0; close=1;red=1;beep=1;} //密码正确时,绿灯亮,其它灯灭
else
{open=1;close=0;red=1;baojing(); } //密码错误时,黄灯亮并短报警
}
else if(key==12) // 取消键按下
{
count = 0; // 密码计数清零
}
else if(key==13) //重设密码键按下
{ open=1;
if(last_pwflag==1) //判断上次用户输入密码正确与否
{
flashred_L(); //闪红灯表示可输入自定义密码
while(last_pwflag)
{
tempkey=keyscan();
if(tempkey>0&&tempkey<=10) //用户输入密码
{
if(tempkey==10)
tempkey=0;
if (count<4)
{
selfdefinebuf[count] = tempkey; //保存用户自定义密码
count++;
}
}
else if(tempkey==11) //确认键按下
{
enterflag=1;
if(count==4)
{close=0;open=1;beep=1;
for(j=0;j<4;j++)
pw[j]=selfdefinebuf[j]; //修改密码存储数组
last_pwflag=0;
enterflag=0;
count=0;
}
else //如果输入数据不足四位或大于四位,输入作废,重新输入
{
flashred_S(); //快闪红灯,重新输入自定义密码
count = 0; // 密码计数清零
}
}
}
}
}
}
else
{
while(1) //错误次数超过三次,停止工作蜂鸣器一直叫
beep=0;
}
}
}
复制代码
作者:
小猫猫爱吃鱼
时间:
2018-6-17 12:12
你好!要实现这个功能,程序改动会很大;
1、单片机选择合适的晶振
2、单片机增加串口电路,接入蓝牙
3、编写单片机串口部分的程序,和蓝牙通讯
4、设计手机 APP ,看你会什么语言
5、APP 增加蓝牙控件, 实现和单片机蓝牙配对
6、如果还是不明白,看我头像,代做设计
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1