標(biāo)題:
51單片機(jī)密碼鎖源程序 超強(qiáng)防破解,輸入錯(cuò)一位就進(jìn)入死循環(huán)
[打印本頁(yè)]
作者:
hb-l
時(shí)間:
2018-7-13 15:06
標(biāo)題:
51單片機(jī)密碼鎖源程序 超強(qiáng)防破解,輸入錯(cuò)一位就進(jìn)入死循環(huán)
超強(qiáng)防破解,輸入錯(cuò)一位就進(jìn)入死循環(huán),本密碼我設(shè)置的了7位數(shù),程序清晰易懂,
圖片1.png
(147.98 KB, 下載次數(shù): 50)
下載附件
2018-7-13 15:06 上傳
單片機(jī)源程序如下:
//實(shí)例80:2272無(wú)線遙控鍵盤(pán)實(shí)現(xiàn)的電子密碼鎖 1434341
#include<reg51.h> //包含51單片機(jī)寄存器定義的頭文件
sbit P14=P2^2; //將P14位定義為P1.4引腳
sbit P15=P2^3; //將P15位定義為P1.5引腳
sbit P16=P2^4; //將P16位定義為P1.6引腳
sbit k1=P1^3; //電機(jī)兩級(jí)控制端口位P2.5引腳
sbit k2=P1^4; //電機(jī)兩級(jí)控制端口位P2.6引腳
sbit led=P2^6;//將led位定義為P2.6引腳
unsigned char keyval; //儲(chǔ)存按鍵值
/*************************************************************
***********************延時(shí)函數(shù)*******************************/
void delayms(xms) //誤差 -0.651041666667us
{
unsigned int a,b;
for(b=xms;b>0;b--)
for(a=115;a>0;a--);
}
/**************************************************************
函數(shù)功能:主函數(shù)
**************************************************************/
void main()
{
char aa=0,bb=1;
keyval=0xff; //按鍵值初始化
led=aa;delayms(200);led=bb; //led亮,復(fù)位成功
k1=0;k2=0; //電機(jī)初始化
P2=0xff; //P2端口初始化,按鍵賦初值高電平,led驅(qū)動(dòng)9012賦值
while(keyval!=0) //第一位密碼輸入********1************
{
if((P2&0xff)!=0xff) //有一位為低電平“0”,說(shuō)明有鍵按下
delayms(10); //延時(shí)一段時(shí)間、軟件消抖
if((P2&0xff)!=0xff) //確實(shí)有鍵按下
{
if(P14==0) //P1.1引腳的為低電平“0”
{
led=aa;delayms(200);led=bb; //led亮,第三位密碼輸入成功
while(!P14); //等待P14端口釋放,即按鈕松開(kāi)
keyval=0; //可判斷是S1鍵被按下
}
if(P14==0||P15==0||P16==0) //如果檢測(cè)到接P1.5或者P1.6引腳為低電平“0”
while(1) if(P14==0||P15==0||P16==0) {led=aa;delayms(200);led=bb;} //進(jìn)入死循環(huán)
}
}
while(keyval!=1) //第二位密碼輸入 **************** 3*************
{
if((P2&0xff)!=0xff) //有一位為低電平“0”,說(shuō)明有鍵按下
delayms(10); //延時(shí)一段時(shí)間、軟件消抖
if((P2&0xff)!=0xff) //確實(shí)有鍵按下
{
if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
{
led=aa;delayms(200);led=bb; //led亮,第二位密碼輸入成功
while(!P16); //等待P16端口釋放,即按鈕松開(kāi)
keyval=1; //可判斷是S3鍵被按下
}
if(P14==0||P15==0||P16==0) //如果檢測(cè)到接P1.5或者P1.6引腳為低電平“0”
while(1) if(P14==0||P15==0||P16==0) {led=aa;delayms(200);led=bb;} //進(jìn)入死循環(huán)
}
}
while(keyval!=2) //第三位密碼輸入 ****************2*************
{
if((P2&0xff)!=0xff) //有一位為低電平“0”,說(shuō)明有鍵按下
delayms(10); //延時(shí)一段時(shí)間、軟件消抖
if((P2&0xff)!=0xff) //確實(shí)有鍵按下
{
if(P15==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
{
led=aa;delayms(200);led=bb; //led亮,第三位密碼輸入成功
while(!P15); //等待P14端口釋放,即按鈕松開(kāi)
keyval=2; //可判斷是S3鍵被按下
}
if(P14==0||P15==0||P16==0) //如果檢測(cè)到接P1.5或者P1.6引腳為低電平“0”
while(1) if(P14==0||P15==0||P16==0) {led=aa;delayms(200);led=bb;} //進(jìn)入死循環(huán)
}
}
while(keyval!=3) //第四位密碼輸入 **************** 3*************
{
if((P2&0xff)!=0xff) //有一位為低電平“0”,說(shuō)明有鍵按下
delayms(10); //延時(shí)一段時(shí)間、軟件消抖
if((P2&0xff)!=0xff) //確實(shí)有鍵按下
{
if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
{
led=aa;delayms(200);led=bb; //led亮,第四位密碼輸入成功
while(!P16); //等待P16端口釋放,即按鈕松開(kāi)
keyval=3; //可判斷是S3鍵被按下
}
if(P14==0||P15==0||P16==0) //如果檢測(cè)到接P1.5或者P1.6引腳為低電平“0”
while(1) if(P14==0||P15==0||P16==0) {led=aa;delayms(200);led=bb;} //進(jìn)入死循環(huán)
}
}
while(keyval!=4) //第五位密碼輸入 ****************2*************
{
if((P2&0xff)!=0xff) //有一位為低電平“0”,說(shuō)明有鍵按下
delayms(10); //延時(shí)一段時(shí)間、軟件消抖
if((P2&0xff)!=0xff) //確實(shí)有鍵按下
{
if(P15==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
{
led=aa;delayms(200);led=bb; //led亮,第五位密碼輸入成功
while(!P15); //等待P14端口釋放,即按鈕松開(kāi)
keyval=4; //可判斷是S3鍵被按下
}
if(P14==0||P15==0||P16==0) //如果檢測(cè)到接P1.5或者P1.6引腳為低電平“0”
while(1) if(P14==0||P15==0||P16==0) {led=aa;delayms(200);led=bb;} //進(jìn)入死循環(huán)
}
}
while(keyval!=5) //第六位密碼輸入 **************** 3*************
{
if((P2&0xff)!=0xff) //有一位為低電平“0”,說(shuō)明有鍵按下
delayms(10); //延時(shí)一段時(shí)間、軟件消抖
if((P2&0xff)!=0xff) //確實(shí)有鍵按下
{
if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
{
led=aa;delayms(200);led=bb; //led亮,第六位密碼輸入成功
while(!P16); //等待P16端口釋放,即按鈕松開(kāi)
keyval=5; //可判斷是S3鍵被按下
}
if(P14==0||P15==0||P16==0) //如果檢測(cè)到接P1.5或者P1.6引腳為低電平“0”
while(1) if(P14==0||P15==0||P16==0) {led=aa;delayms(200);led=bb;} //進(jìn)入死循環(huán)
}
}
while(keyval!=0) //第七位密碼輸入********1************
{
if((P2&0xff)!=0xff) //有一位為低電平“0”,說(shuō)明有鍵按下
delayms(10); //延時(shí)一段時(shí)間、軟件消抖
if((P2&0xff)!=0xff) //確實(shí)有鍵按下
{
if(P14==0) //P1.1引腳的為低電平“0”
{
led=aa;delayms(200);led=bb; //led亮,第七位密碼輸入成功
while(!P14); //等待P14端口釋放,即按鈕松開(kāi)
keyval=0; //可判斷是S1鍵被按下
}
if(P14==0||P15==0||P16==0) //如果檢測(cè)到接P1.5或者P1.6引腳為低電平“0”
while(1) if(P14==0||P15==0||P16==0) {led=aa;delayms(200);led=bb;} //進(jìn)入死循環(huán)
}
}
k1=1;k2=0;led=0; //密碼正確,電機(jī)正轉(zhuǎn)開(kāi)鎖
delayms(1000); //延時(shí)轉(zhuǎn)動(dòng)1s
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;led=1;delayms(50); k1=1;k2=0;led=0;delayms(90); //緊松,延長(zhǎng)開(kāi)門(mén)時(shí)間
k1=0;k2=1;delayms(500); //反轉(zhuǎn)關(guān)鎖
k1=0;k2=0;//電機(jī)電壓復(fù)位
}
復(fù)制代碼
//實(shí)例80:矩陣式鍵盤(pán)實(shí)現(xiàn)的電子密碼鎖
#include<reg51.h> //包含51單片機(jī)寄存器定義的頭文件
sbit P14=P1^4; //將P14位定義為P1.4引腳
sbit P15=P1^5; //將P15位定義為P1.5引腳
sbit P16=P1^6; //將P16位定義為P1.6引腳
sbit P17=P1^7; //將P17位定義為P1.7引腳
sbit sound=P3^7; //將sound位定義為P3.7
unsigned char keyval; //儲(chǔ)存按鍵值
/**************************************************************
函數(shù)功能:延時(shí)輸出音頻
**************************************************************/
void delay(void)
{
unsigned char i;
for(i=0;i<200;i++)
;
}
/**************************************************************
函數(shù)功能:軟件延時(shí)子程序
**************************************************************/
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
/**************************************************************
函數(shù)功能:主函數(shù)
**************************************************************/
void main(void)
{
unsigned char D[ ]={0,8,0,8,7,4,11}; //設(shè)定密碼
EA=1; //開(kāi)總中斷
ET0=1; //定時(shí)器T0中斷允許
TMOD=0x01; //使用定時(shí)器T0的模式1
TH0=(65536-500)/256; //定時(shí)器T0的高8位賦初值
TL0=(65536-500)%256; //定時(shí)器T0的高8位賦初值
TR0=1; //啟動(dòng)定時(shí)器T0
keyval=0xff; //按鍵值初始化
while(keyval!=D[0]) //第一位密碼輸入不正確,等待
;
while(keyval!=D[1]) //第二位密碼輸入不正確,等待
;
while(keyval!=D[2]) //第三位密碼輸入不正確,等待
;
while(keyval!=D[3]) //第四位密碼輸入不正確,等待
;
while(keyval!=D[4]) //第五位密碼輸入不正確,等待
;
while(keyval!=D[5]) //第六位密碼輸入不正確,等待
;
while(keyval!=D[6]) //沒(méi)有輸入“OK”,等待
;
P2=0x00; //P3.0引腳輸出低電平,點(diǎn)亮LED
}
/**************************************************************
函數(shù)功能:定時(shí)器0的中斷服務(wù)子程序,進(jìn)行鍵盤(pán)掃描,判斷鍵位
**************************************************************/
void time0_interserve(void) interrupt 1 using 1 //定時(shí)器T0的中斷編號(hào)為1,使用第一組寄存器
{
unsigned char i;
TR0=0; //關(guān)閉定時(shí)器T0
P1=0xf0; //所有行線置為低電平“0”,所有列線置為高電平“1”
if((P1&0xf0)!=0xf0) //列線中有一位為低電平“0”,說(shuō)明有鍵按下
delay20ms(); //延時(shí)一段時(shí)間、軟件消抖
if((P1&0xf0)!=0xf0) //確實(shí)有鍵按下
{
P1=0xfe; //第一行置為低電平“0”(P1.0輸出低電平“0”)
if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
keyval=1; //可判斷是S1鍵被按下
if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
keyval=2; //可判斷是S2鍵被按下
if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
keyval=3; //可判斷是S3鍵被按下
if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
keyval=4; //可判斷是S4鍵被按下
P1=0xfd; //第二行置為低電平“0”(P1.1輸出低電平“0”)
if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
keyval=5; //可判斷是S5鍵被按下
if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
keyval=6; //可判斷是S6鍵被按下
if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
keyval=7; //可判斷是S7鍵被按下
if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
keyval=8; //可判斷是S8鍵被按下
P1=0xfb; //第三行置為低電平“0”(P1.2輸出低電平“0”)
if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
keyval=9; //可判斷是S9鍵被按下
if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
keyval=0; //可判斷是S10鍵被按下
if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
keyval=11; //可判斷是S11鍵被按下
if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
keyval=12; //可判斷是S12鍵被按下
P1=0xf7; //第四行置為低電平“0”(P1.3輸出低電平“0”)
if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
keyval=13; //可判斷是S13鍵被按下
if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
keyval=14; //可判斷是S14鍵被按下
if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
keyval=15; //可判斷是S15鍵被按下
if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
keyval=16; //可判斷是S16鍵被按下
for(i=0;i<200;i++) //讓P3.7引腳電平不斷取反輸出音頻
{
sound=0;
delay();
sound=1;
delay();
}
}
TR0=1; //開(kāi)啟定時(shí)器T0
TH0=(65536-500)/256; //定時(shí)器T0的高8位賦初值
TL0=(65536-500)%256; //定時(shí)器T0的高8位賦初值
}
復(fù)制代碼
所有資料51hei提供下載:
實(shí)驗(yàn)9:宿舍遙控密碼.zip
(29.04 KB, 下載次數(shù): 30)
2018-7-13 15:04 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
zuiqf1978
時(shí)間:
2018-7-15 21:21
一位輸錯(cuò)太強(qiáng)悍,應(yīng)該是二至三位,畢竟有時(shí)難免犯錯(cuò)!
作者:
2467214876
時(shí)間:
2020-6-24 17:14
樓主,有仿真嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1