設計自己的電子密碼鎖《單片機版》

軟件 騎士S12 浪雪飛鴿 2017-05-13

設計自己的電子密碼鎖《單片機版》

#include<reg51.h> //包含51單片機寄存器定義的頭文件

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; //儲存按鍵值

/**************************************************************

函數功能:延時輸出音頻

**************************************************************/

void delay(void)

{

unsigned char i;

for(i=0;i<200;i++)

;

}

/**************************************************************

函數功能:軟件延時子程序

**************************************************************/

void delay20ms(void)

{

unsigned char i,j;

for(i=0;i<100;i++)

for(j=0;j<60;j++)

;

}

/**************************************************************

函數功能:主函數

**************************************************************/

void main(void)

{

unsigned char D[ ]={0,8,0,8,7,4,11}; //設定密碼

EA=1; //開總中斷

ET0=1; //定時器T0中斷允許

TMOD=0x01; //使用定時器T0的模式1

TH0=(65536-500)/256; //定時器T0的高8位賦初值

TL0=(65536-500)%256; //定時器T0的高8位賦初值

TR0=1; //啟動定時器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]) //沒有輸入“OK”,等待

;

P3=0xfe; //P3.0引腳輸出低電平,點亮LED

}

/**************************************************************

函數功能:定時器0的中斷服務子程序,進行鍵盤掃描,判斷鍵位

**************************************************************/

void time0_interserve(void) interrupt 1 using 1 //定時器T0的中斷編號為1,使用第一組寄存器

{

unsigned char i;

TR0=0; //關閉定時器T0

P1=0xf0; //所有行線置為低電平“0”,所有列線置為高電平“1”

if((P1&0xf0)!=0xf0) //列線中有一位為低電平“0”,說明有鍵按下

delay20ms(); //延時一段時間、軟件消抖

if((P1&0xf0)!=0xf0) //確實有鍵按下

{

P1=0xfe; //第一行置為低電平“0”(P1.0輸出低電平“0”)

if(P14==0) //如果檢測到接P1.4引腳的列線為低電平“0”

keyval=1; //可判斷是S1鍵被按下

if(P15==0) //如果檢測到接P1.5引腳的列線為低電平“0”

keyval=2; //可判斷是S2鍵被按下

if(P16==0) //如果檢測到接P1.6引腳的列線為低電平“0”

keyval=3; //可判斷是S3鍵被按下

if(P17==0) //如果檢測到接P1.7引腳的列線為低電平“0”

keyval=4; //可判斷是S4鍵被按下

P1=0xfd; //第二行置為低電平“0”(P1.1輸出低電平“0”)

if(P14==0) //如果檢測到接P1.4引腳的列線為低電平“0”

keyval=5; //可判斷是S5鍵被按下

if(P15==0) //如果檢測到接P1.5引腳的列線為低電平“0”

keyval=6; //可判斷是S6鍵被按下

if(P16==0) //如果檢測到接P1.6引腳的列線為低電平“0”

keyval=7; //可判斷是S7鍵被按下

if(P17==0) //如果檢測到接P1.7引腳的列線為低電平“0”

keyval=8; //可判斷是S8鍵被按下

P1=0xfb; //第三行置為低電平“0”(P1.2輸出低電平“0”)

if(P14==0) //如果檢測到接P1.4引腳的列線為低電平“0”

keyval=9; //可判斷是S9鍵被按下

if(P15==0) //如果檢測到接P1.5引腳的列線為低電平“0”

keyval=0; //可判斷是S10鍵被按下

if(P16==0) //如果檢測到接P1.6引腳的列線為低電平“0”

keyval=11; //可判斷是S11鍵被按下

if(P17==0) //如果檢測到接P1.7引腳的列線為低電平“0”

keyval=12; //可判斷是S12鍵被按下

P1=0xf7; //第四行置為低電平“0”(P1.3輸出低電平“0”)

if(P14==0) //如果檢測到接P1.4引腳的列線為低電平“0”

keyval=13; //可判斷是S13鍵被按下

if(P15==0) //如果檢測到接P1.5引腳的列線為低電平“0”

keyval=14; //可判斷是S14鍵被按下

if(P16==0) //如果檢測到接P1.6引腳的列線為低電平“0”

keyval=15; //可判斷是S15鍵被按下

if(P17==0) //如果檢測到接P1.7引腳的列線為低電平“0”

keyval=16; //可判斷是S16鍵被按下

for(i=0;i<200;i++) //讓P3.7引腳電平不斷取反輸出音頻

{

sound=0;

delay();

sound=1;

delay();

}

}

TR0=1; //開啟定時器T0

TH0=(65536-500)/256; //定時器T0的高8位賦初值

TL0=(65536-500)%256; //定時器T0的高8位賦初值

}

設計自己的電子密碼鎖《單片機版》

相關推薦

推薦中...