導航:首頁 > 操作系統 > 單片機十六按鍵電子密碼鎖焊接

單片機十六按鍵電子密碼鎖焊接

發布時間:2022-05-30 19:22:43

A. 51單片機電子密碼鎖程序與接線圖

【十四】密碼鎖防火防盜系列
[1]單片機多功能密碼鎖系統/防火防盜系統設計
實現功能:
1、密碼鎖功能/可以修改密碼,下次開機後新密碼仍然有效
2、支持一鍵恢復初始密碼
3、可添加防火防盜報警功能
4、可根據顧客要求進行功能定製
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTUwMjg3MjQyOA==.html

[2]單片機藍牙密碼鎖系統
實現功能:
1、密碼鎖功能/可以修改密碼,下次開機後新密碼仍然有效
2、支持一鍵恢復初始密碼
3、手機藍牙可以實現輸入密碼進行開鎖
4、可根據顧客要求進行功能定製
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMjgxNjQ0MjA4MA==.html

[3]單片機雙控密碼鎖系統+GSM 簡訊遠程防盜報警
實現功能:
1、輸入密碼前必須通過無線端進行數據匹配才能進入輸入密碼界面
2、密碼鎖功能/可以修改密碼,下次開機後新密碼仍然有效
3、支持一鍵恢復初始密碼
4、三次開鎖失敗後將判為有不法分子強行輸入密碼, GSM 模塊會以簡訊方式進行通知戶主
5、可根據顧客要求進行功能定製
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMjgxNjQ1NTg5Mg==.html

B. 求單片機電子密碼鎖設計原理圖和程序

1、鍵盤式按鍵鎖保密性非常差,首先按鍵經常使用,磨損痕跡可以作為密碼破解,再安裝一個針孔攝像頭你就死定了。
2、LED顯示故障高。
建議開發高級鎖、安全鎖。

C. 基於51單片機的鍵盤式電子密碼鎖

這個問題很簡單!你主要檢查一下電路連接是否正確,重點檢查一下按鍵電路及AT24C02的這塊的電路。還有就是晶振用對沒有。

D. 基於單片機的電子密碼鎖設計

功能鍵
S6---S15 數字鍵0-9
S16---更改密碼 S17---更改密碼完畢後確認
S18---重試密碼、重新設定 S19---關閉密碼鎖
初始密碼:000000 密碼位數:6位
注意:掉電後,所設密碼會丟失,重新上點時,密碼恢復為原始的000000
與P1相連的8位發光LED點亮代表鎖被打開;熄滅代表鎖被鎖上

程序功能: 本程序結合了24C02存儲器的存儲功能,可以掉電保存密碼。
第一次運行時,若輸入000000原始密碼後無反應,可以試驗著將主程序中前面的
一小段被注釋線屏蔽的程序前的注釋線刪掉,然後重新編譯下載(可以將密碼還原為000000)。
此後,再將這小段程序屏蔽掉,再編譯下載。方可正常使用。
1、開鎖:
下載程序後,直接按六次S7(即代表數字1),8位LED亮,鎖被打開,輸入密碼時,
六位數碼管依次顯示小橫杠。
2、更改密碼:
只有當開鎖(LED亮)後,該功能方可使用。
首先按下更改密碼鍵S16,然後設置相應密碼,此時六位數碼管會顯示設置密碼對應
的數字。最後設置完六位後,按下S17確認密碼更改,此後新密碼即生效。
3、重試密碼:
當輸入密碼時,密碼輸錯後按下鍵S18,可重新輸入六位密碼。
當設置密碼時,設置中途想更改密碼,也可按下此鍵重新設置。
4、關閉密碼鎖:
按下S19即可將打開的密碼鎖關閉。
推薦初級演示步驟:輸入原始密碼000000---按下更改密碼按鍵S16---按0到9設置密碼---按S17
確認密碼更改---按S18關閉密碼鎖---輸入新的密碼打開密碼鎖
*******************************************************************************/
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
uchar new1,new2,new3,new4,new5,new6; //每次MCU採集到的密碼輸入
uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數碼管顯示的變數
uchar wei,key,temp;

bit allow,genggai,ok,wanbi,retry,close; //各個狀態位

sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit sda=P2^0; //IO口定義
sbit scl=P2^1;

unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

/*****************IIC晶元24C02存儲器驅動程序************************************/

void nop()
{
_nop_();
_nop_();
}
/////////24C02讀寫驅動程序////////////////////
void delay1(unsigned int m)
{ unsigned int n;
for(n=0;n<m;n++);
}

void init() //24c02初始化子程序
{
scl=1;
nop();
sda=1;
nop();
}

void start() //啟動I2C匯流排
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}

void stop() //停止I2C匯流排
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}

void writebyte(unsigned char j) //寫一個位元組
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY; //temp左移時,移出的值放入了CY中
nop();
scl=1; //待sda線上的數據穩定後,將scl拉高
nop();
}
scl=0;
nop();
sda=1;
nop();
}

unsigned char readbyte() //讀一個位元組
{
unsigned char i,j,k=0;
scl=0; nop(); sda=1;
for (i=0;i<8;i++)
{
nop(); scl=1; nop();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
}
nop();
return(k);
}

void clock() //I2C匯流排時鍾
{
unsigned char i=0;
scl=1;
nop();
while((sda==1)&&(i<255))
i++;
scl=0;
nop();
}

////////從24c02的地址address中讀取一個位元組數據/////
unsigned char read24c02(unsigned char address)
{
unsigned char i;
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
start();
writebyte(0xa1);
clock();
i=readbyte();
stop();
delay1(100);
return(i);
}

//////向24c02的address地址中寫入一位元組數據info/////
void write24c02(unsigned char address,unsigned char info)
{
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
writebyte(info);
clock();
stop();
delay1(5000); //這個延時一定要足夠長,否則會出錯。因為24c02在從sda上取得數據後,還需要一定時間的燒錄過程。
}
/****************************密碼鎖程序模塊********************************************************/

void delay(unsigned char i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}

void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
{
la=0;
P0=table[a];
la=1;
la=0;

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);

P0=table[b];
la=1;
la=0;

P0=0xfd;
wela=1;
wela=0;
delay(5);

P0=table[c];
la=1;
la=0;

P0=0xfb;
wela=1;
wela=0;
delay(5);

P0=table[d];
la=1;
la=0;

P0=0xf7;
wela=1;
wela=0;
delay(5);

P0=table[e];
la=1;
la=0;

P0=0xef;
wela=1;
wela=0;
delay(5);

P0=table[f];
la=1;
la=0;

P0=0xdf;
wela=1;
wela=0;
delay(5);
}

void keyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
wei++;
break;

case 0xde:
key=1;
wei++;
break;

case 0xbe:
key=2;
wei++;
break;

case 0x7e:
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
wei++;
break;

case 0xdd:
key=5;
wei++;
break;

case 0xbd:
key=6;
wei++;
break;

case 0x7d:
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
wei++;
break;

case 0xdb:
key=9;
wei++;
break;

case 0xbb:
genggai=1;
wei=0;
break;

case 0x7b:
if(allow)
ok=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
retry=1;
break;

case 0xd7:
close=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}

void shumima() //對按鍵採集來的數據進行分配
{
if(!wanbi)
{
switch(wei)
{
case 1:new1=key;
if(!allow) a=17;
else a=key; break;
case 2:new2=key;
if(a==17) b=17;
else b=key; break;
case 3:new3=key;
if(a==17) c=17;
else c=key; break;
case 4:new4=key;
if(a==17) d=17;
else d=key; break;
case 5:new5=key;
if(a==17) e=17;
else e=key; break;
case 6:new6=key;
if(a==17) f=17;
else f=key;
wanbi=1; break;
}
}
}

void yanzheng() //驗證密碼是否正確
{
if(wanbi) //只有當六位密碼均輸入完畢後方進行驗證
{
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
allow=1; //當輸入的密碼正確,會得到allowe置一
}
}

void main()
{

init(); //初始化24C02
/*********下面的一小段程序的功能為格式化密碼存儲區。************
******當24c02中這些存儲區由於其他程序的運行而導致***************
*******所存數據發生了變化,或者密碼遺忘時, ********************
******可以刪掉其前面的注釋線,然後重新編譯下載。****************
******而將密碼還原為000000後,請將下面的程序用******************
******注釋屏蔽掉,重新編譯、下載,方可正常使用****************/
// write24c02(110,0x00);
// write24c02(111,0x00);//24c02的第110到115地址單元作為密碼存儲區
// write24c02(112,0x00);
// write24c02(113,0x00);
// write24c02(114,0x00);
// write24c02(115,0x00);
/*******************************************************************/

old1=read24c02(110);
old2=read24c02(111);
old3=read24c02(112);
old4=read24c02(113);
old5=read24c02(114);
old6=read24c02(115);

while(1)
{
keyscan();
shumima();
yanzheng();
if(allow) //驗證完後,若allow為1,則開鎖
{
P1=0x00;
if(!genggai)
wanbi=0;
}
if(genggai) //當S16更改密碼鍵被按下,genggai會被置一
{
if(allow) //若已經把鎖打開,才有更改密碼的許可權
{
while(!wanbi) //當新的六位密碼沒有設定完,則一直在這里循環
{
keyscan();
shumima();
if(retry|close) //而當探測到重試鍵S18或者關閉密碼鎖鍵S19被按下時,則跳出
{ wanbi=1;
break;
}
display(a,b,c,d,e,f);
}
}
}
if(ok) //更改密碼時,當所有六位新密碼均被按下時,可以按下此鍵,結束密碼更改
{ //其他時間按下此鍵無效
ok=0; wei=0;
genggai=0;
old1=new1;old2=new2;old3=new3; //此時,舊的密碼將被代替
old4=new4;old5=new5;old6=new6;
//新密碼寫入存儲區。
write24c02(110,old1);
write24c02(111,old2);
write24c02(112,old3);
write24c02(113,old4);
write24c02(114,old5);
write24c02(115,old6);
a=16;b=16;c=16;d=16;e=16;f=16;
}
if(retry) //當重試按鍵S18被按下,retry會被置位
{
retry=0; wei=0;wanbi=0;
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
}
if(close) //當關閉密碼鎖按鍵被按下,close會被置位
{
close=0;genggai=0;//所有變數均被清零。
wei=0; wanbi=0;
allow=0;
P1=0xff;
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
}
display(a,b,c,d,e,f); //實時顯示
}
}
對著代碼自己做吧,,要是還做不出來,,那我就不說什麼了,,

E. 請問如何自己焊接單片機電路板

學習單片機是需要買挺多元件的。

1、注意電解電容、發光二極體、蜂鳴器的正負極性不能接反、三者均是長的管腳接正極、短的管腳接負極,如接反輕則燒毀元氣件,重則發生輕微爆炸。

2、三極體9015的E、B、C、注意接法,板子上面有相應的圖形形狀。按照那個圖形焊接。

3、焊接元氣件的過程之中焊接時間應在2-4秒。焊接時間不宜過長,否則不僅會燒毀元氣件、而且易使焊點容易脆裂。

4、電阻焊接過程中注意相應的阻值對應,不要焊錯。否則影響相應的電流大小。

5、排阻焊接過程之中、RP1、RP2、RP3、有公共端應該接VCC、其餘管腳為相應的獨立端、排阻焊接過程之中用萬用表測量各排阻的阻值、對照說明書焊接相應的排阻。

(5)單片機十六按鍵電子密碼鎖焊接擴展閱讀:

器件的封裝引腳與內核電路引線的連接處處理,電路的半導體材質特性以及器件的封裝材質都會影響其高溫焊接時的耐受度,具體講來一篇論文都說不完。

從經驗上說,如果使用的是非高溫的鉛錫合金焊錫,熔化溫度在300度以下,那麼焊接時當觀察到焊錫在焊點充分熔化後,應該在5秒內完成焊接動作。

器件是不會因為這幾秒的高溫而損壞的。 如果一定要挑選烙鐵的功率,寧可選擇功率大的烙鐵,因為烙鐵頭升溫更快,那樣反而不容易因為長時間加熱焊點而造成器件損壞。

F. 電子密碼鎖 用單片機實現

我博客有相關程序,包含兩個單片機的通信,一個為呼叫,另一單片機為應答,當然,如果知道密碼也不需要呼叫的密碼鎖。

說明:

1.基本部分為單片機的串口通信,包含串口通信,鍵盤掃描

2.程序部分有詳細的注釋。
/*-------------------------------------------
Project: mimasuo program (V0.1)
Filename: mimasuo.c

Prozessor: 80C51 family
Compiler: Keil Version 6.14

Autor: ********
Copyrigth: 041151**
date: 2008.3.17
------------------------------------------ */

#include<reg51.h>
#define uchar unsigned char
sbit ADCS =P3^6;
sbit ADC =P3^7;
sbit AD =P1^0;
int fafu=0;
uchar key,key1,i,count1=1,yidong=256;
uchar jgh[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//輸出指示
uchar jgh1[9]; //輸入鍵盤緩存
uchar mima[9]={0,1,2,3,4,5,6,7,8};//初始8位密碼 : 12345678 第0位未用
uchar fangjian[4]={0,2,5,2}; //初始門牌號 252 第0位未用
char count=0;

void init_serialcomm(void) //串口波特率設置
{
SCON=0x50;
TMOD=0x20;
PCON=0x80;
TH1=0x40;
TL1=0x40;//300
TR1=1;
EA=1;
TI=0;
RI=0;
}
void delay10ms(void) //10毫秒延時程序

{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
uchar kbscan(void) // 鍵盤掃描程序
{
uchar sccode,recode;
P1=0xf0; //置所有行為低電平,行掃描,列線輸入(此時)
if((P1&0xf0)!=0xf0) //判斷是否有有鍵按下(讀取列的真實狀態,若第4列有鍵按下則P1的值會變成0111 0000),有往下執行
{
delays(); //延時去抖動(10ms)
if((P1&0xf0)!=0xf0) //再次判斷列中是否是干擾信號,不是則向下執行
{
sccode=0xFE; //逐行掃描初值(即先掃描第1行)
while((sccode&0x10)!=0)//行掃描完成時(即4行已經全部掃描完成)sccode為1110 1111 停止while程序
{
P1=sccode; //輸出行掃描碼
if ((P1&0xf0)!=0xf0) //本行有鍵按下(即P1(真實的狀態)的高四位不全為1)
{
recode=(P1&0xf0)|0x0f; //列
return(sccode&recode); //返回行和列
}
else //所掃描的行沒有鍵按下,則掃描下一行,直到4行都掃描
{
sccode=(sccode<<1)|0x01;//行掃描碼左移一位
}
}
}
}
else
{
return 0; //無鍵按下,返回0
}
}

uchar readnumber(uchar tmp) //按鍵掃描的結果,轉換為數字,便於程序對按鍵數據處理
{
switch(tmp)
{
case 0x28:return 0 ;break;
case 0x14:return 1 ;break;
case 0x24:return 2 ;break;
case 0x44:return 3 ;break;
case 0x12:return 4 ;break;
case 0x22:return 5 ;break;
case 0x42:return 6 ;break;
case 0x11:return 7 ;break;
case 0x21:return 8 ;break;
case 0x41:return 9 ;break;
case 0x88:return 10 ;break;
case 0x82:return 11 ;break;
default:break;
}
}

void main(void) //主程序
{
P2=0xff;
init_serialcomm();
while(1)
{
key=kbscan();
// P2=key;
fafu++;
if(fafu==10000){
fafu=0;
ADCS = 1;
ADC = 1;}

if(RI) //呼叫應答
{
RI=0;
ADCS = 0;
// P2=~P2;
}

if(key!=0){
do{
key1=kbscan();
AD = 0;
}while(key1!=0);//等待按鍵釋放
AD = 1;

if(readnumber(key)==10) // 密碼比較
{ count1=1;
for(i=1;i<=8;i++)
{
if(mima[i]==jgh1[i])
count1++;
}
if(count1==9)
{
// P2=~P2;
ADCS = 0;
}
else ADC=0;
}

if(readnumber(key)==11) // 呼叫房間
{ count1=1;
for(i=1;i<=3;i++)
{
if(fangjian[i]==jgh1[i])
count1++;
}
if(count1==4) //發送傳送碼
{
SBUF=0xf0;
while(TI==0);
TI=0;
P2=~P2;
}
}

if((key!=0x88)&&(key!=0x84)&&(key!=0x82)) //數字鍵輸入,並把輸入的數據存到數組中
{ count++;
P2=jgh[count];
jgh1[count]=readnumber(key);
if(count==8)
count=0;
}
if(key==0x84)
{ //取消功能鍵
count--;
if(count<=0)count=0;
P2=jgh[count];
}
}
}

}
詳細代碼可以到我博客下載:
http://www.shenzhenwangzhanyouhua.com/seo/danpianji-key-machine.html

G. 急需要單片機AT89C51的16鍵單片機電子密碼鎖電路和C語言源程序!

你倒是說清楚呀,你需要幾位的密碼?你的顯示器是用來顯示密碼的還是密碼透過後顯示數據的,程序需要調試的,就是給你寫出來也是問題多多。。
假如是6位密碼的吧,你的16個鍵假設是從0到9,要有一個清除鍵、一個修改鍵,你在程序里預設6位數字,然後存儲從鍵盤上輸入的6位數字,如果相同就執行下一步操作,如果不同就提示密碼錯誤,你也可以設定密碼輸入次數。。太麻煩 一兩句說不清楚

H. 用單片機做個簡單的密碼鎖設計~~~~~~~~

物品清單
ATMAGE16單片機(內部有EEPROM)
16個按鍵(十個數字鍵,加確認、取消,還有設置、保存、開鎖、關鎖)
三位數碼管加幾個LED
驅動數碼管的三極體,電阻
104電容若干
5V電源(7805也可以)
程序大概就是:
設置密碼,要求輸入上次密碼,正確後,輸入新密碼,確認,保存
開鎖,輸入密碼,正確,點燈/錯誤,點燈

I. 基於單片機的智能電子密碼鎖怎麼做

//實例80:矩陣式鍵盤實現的電子密碼鎖
#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位賦初值
}

J. 單片機電子密碼鎖設計

程序:

#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
uint num=10; //開始讓數碼管什麼都顯示
bit set=0; //定義設置密碼的位
char count=-1; //開始讓COUNT=-1,方便後面顯示數碼管
sbit Beep=P1^2; //蜂鳴器
uchar temp;
uchar pws[6]={8,8,8,8,8,8}; //原始密碼
uchar pwx[6]; //按下的數字存儲區
bit rightflag; //密碼正確標志位
uchar workbuf[6];
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40
}; //段選碼,共陰極
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
}; //位選碼
uint keyscan();
void delay(uchar z) //延時,ms級
{
uchar y;
for(;z>0;z--)
for(y=120;y>0;y--);
}
void setpw() //設置密碼函數
{
keyscan();
}
uint keyscan() //鍵盤掃描函數
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5); //鍵盤去抖,最好20ms以上,這里用了5ms
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;//按鍵計數加1
temp=P3;
switch(temp)
{
case 0xee:
{
num=7;
if(count<6) //六位密碼,所以COUNT<6
{
if(set==0) //設置密碼鍵沒有按下時
pwx[count]=num; //存儲按下的數字
else
pws[count]=num; //設置密碼鍵按下時,設置新密碼
workbuf[count]=table[11]; //相應位的數碼管顯示"--",不顯示相應的數字,密碼是保密的
}
}
break;
case 0xde:
{
num=8;
if(count<6) //以下掃描鍵盤的原理差不多同上
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xbe:
{
num=9;
{
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
}
break;
case 0x7e: //設置密碼鍵按下
{
set=1; //設置密碼標志位置1
P1_3=0; //設置密碼指示燈亮
workbuf[0]=0x00;//數碼管第一位不顯示
workbuf[1]=0x00;//......
workbuf[2]=0x00;//......
workbuf[3]=0x00;
workbuf[4]=0x00;
workbuf[5]=0x00;//......
count=-1; //按鍵計數復位為-1
if(count<6) //密碼沒有設置完,繼續設置密碼
{
setpw(); //設置密碼
}
}
break;
}
while(temp!=0xf0) //按鍵抬起檢測
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case 0xed:
{
num=4;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xdd:
{
num=5;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xbd:
{
num=6;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case 0xeb:
{
num=1;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xdb:
{
num=2;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xbb:
{
num=3;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case 0xd7:
{
num=0;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=table[11];
}
}
break;
case 0xe7: num=20;break; //確定鍵按下檢測
case 0x77: //復位鍵或者輸入密碼全部一次刪除
{
P1_1=0; //鎖關
P1_3=1; //密碼設置指示燈滅
set=0; //不設置密碼
num=10; //num復位
count=-1; //COUNT復位
workbuf[0]=table[10]; //第一位數碼管不顯示
workbuf[1]=table[10]; //第二位數碼管不顯示
workbuf[2]=table[10];
workbuf[3]=table[10];
workbuf[4]=table[10];
workbuf[5]=table[10]; //......
P1_0=1; //鎖關
}
break;
case 0xb7: //輸入密碼刪除鍵(一位一位刪除)
{
count--;
workbuf[count]=0x00; //因確定鍵按下時,COUNT也會加1,而確定鍵不是密碼,所以這里是COUNT,而不是COUNT+1
count--; //因確定鍵按下時,確定鍵不是密碼,COUNT也會加1,這里COUNT再自減1
if(count<=-1)
count=-1;
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return(num);
}
void init() //利用定時顯示數碼管
{
TMOD=0x01;
TH0=(65536-500)/200;
TL0=(65536-500)%200;
ET0=1;
EA=1;
TR0=1;
}
bit compare() //密碼比較函數
{
if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pwx[5]==pws[5]))
rightflag=1;
else
rightflag=0;
return(rightflag);
}
void main()
{
uint i,j;
init();
P0=0;
P1_1=0; //鎖關
while(1)
{
keyscan();
if(num==20) //如果確定鍵按下(修改密碼和輸入密碼共用的確定鍵)
{
if(count==6)
{
if(set==1) //修改密碼確定
{
P1_3=1;
workbuf[0]=0;
workbuf[1]=0;
workbuf[2]=0;
workbuf[3]=0;
workbuf[4]=0;
workbuf[5]=0;
}
else //輸入密碼確定
{
set=0;
compare();
if(rightflag==1) //如果密碼正確
{
P1_0=0; //鎖開
P1_1=1;
workbuf[0]=table[8]; //數碼管第一位顯示"8"
workbuf[1]=table[8]; //數碼管第二位顯示"8"
workbuf[2]=table[8];
workbuf[3]=table[8];
workbuf[4]=table[8];
workbuf[5]=table[8]; //......
}
else
{
P1_1=0; //鎖仍然是關
workbuf[0]=0X71; //數碼管第一位顯示"F"
workbuf[1]=0X71;
workbuf[2]=0X71;
workbuf[3]=0X71;
workbuf[4]=0X71;
workbuf[5]=0X71; //......
for(i=0;i<1000;i++) //密碼錯誤報警
{
for(j=0;j<80;j++);
Beep=~Beep;
}
break;
}
}
}
else //若輸入的密碼位數不為6位時
{
P1_1=0; //鎖仍然關
workbuf[0]=0X71; //數碼管第一位顯示"F"
workbuf[1]=0X71;
workbuf[2]=0X71;
workbuf[3]=0X71;
workbuf[4]=0X71;
workbuf[5]=0X71;
for(i=0;i<1000;i++)
{
for(j=0;j<80;j++);
Beep=~Beep;
}
break;
}
}
}
}
void timer0() interrupt 1 //顯示數碼管
{
uchar i;
TH0=(65536-500)/200;
TL0=(65536-500)%200;
for(i=0;i<6;i++)
{
P0=workbuf[i];
P2=tablewe[i];
delay(5);
P0=0;
}
}

電路圖就不貼出來了是Protues的模擬,你仔細看下程序電路很簡單無非是數碼管和鍵盤。看看程序中定義的引腳即可。
這個我模擬過的放心使用

閱讀全文

與單片機十六按鍵電子密碼鎖焊接相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:27
不能修改的pdf 瀏覽:751
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491