標題:
51單片機密碼鎖連接藍牙
[打印本頁]
作者:
a1034
時間:
2018-6-17 10:15
標題:
51單片機密碼鎖連接藍牙
弄了個密碼鎖,通過矩陣鍵盤輸入密碼,然后想用手機輸入密碼,
要在原來的程序中加什么代碼才可以實現(xiàn)藍牙控制啊,還有手機藍牙串口助手應該怎么設置那些按鍵,求大神幫幫忙
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar count; // 密碼位計數(shù)
uchar pw[4]; // 初始密碼存儲區(qū)
uchar pwbuf[4]; // 輸入密碼存儲區(qū)
uchar selfdefinebuf[4]; //自定義密碼存儲區(qū)
uchar error_cnt; //錯誤次數(shù)計數(shù)器
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); //三盞燈全亮,不能繼續(xù)輸入
/* 鍵消抖延時函數(shù) */
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;
}
/* 鍵掃描函數(shù) */
uchar keyscan() //鍵盤掃描函數(shù)
{ 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;//數(shù)字0
default :break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
else return 0;
}
}
/* 密碼比較函數(shù) */
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++; //錯誤次數(shù)加1
}
}
return(flag);
}
//初始化設置函數(shù)
void init_main()
{
count = 0; // 初始沒有輸入密碼,計數(shù)器設為0
error_cnt=0; //錯誤次數(shù)歸0
enterflag = 0; // 沒有按下確認鍵
pwflag = 0; // 密碼標志先置為0
last_pwflag=0;
close=0; //鎖合燈亮,其它燈滅
open = 1;
beep = 1;
red=1;
/* 假設內(nèi)定密碼為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) //錯誤次數(shù)小于3
{
key = keyscan(); // 調(diào)用鍵盤掃描函數(shù)
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++; //錯誤次數(shù)加一
}
last_pwflag=pwflag; //前一次密碼輸入正確與否標志
enterflag = 0; // 標志位置回0
count = 0; // 密碼位計數(shù)器清零
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; // 密碼計數(shù)清零
}
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]; //修改密碼存儲數(shù)組
last_pwflag=0;
enterflag=0;
count=0;
}
else //如果輸入數(shù)據(jù)不足四位或大于四位,輸入作廢,重新輸入
{
flashred_S(); //快閃紅燈,重新輸入自定義密碼
count = 0; // 密碼計數(shù)清零
}
}
}
}
}
}
else
{
while(1) //錯誤次數(shù)超過三次,停止工作蜂鳴器一直叫
beep=0;
}
}
}
復制代碼
作者:
小貓貓愛吃魚
時間:
2018-6-17 12:12
你好!要實現(xiàn)這個功能,程序改動會很大;
1、單片機選擇合適的晶振
2、單片機增加串口電路,接入藍牙
3、編寫單片機串口部分的程序,和藍牙通訊
4、設計手機 APP ,看你會什么語言
5、APP 增加藍牙控件, 實現(xiàn)和單片機藍牙配對
6、如果還是不明白,看我頭像,代做設計
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1