导航:首页 > 操作系统 > 单片机十六按键电子密码锁焊接

单片机十六按键电子密码锁焊接

发布时间: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劈开合并 浏览:28
不能修改的pdf 浏览:752
同城公众源码 浏览:488
一个服务器2个端口怎么映射 浏览:297
java字符串ascii码 浏览:78
台湾云服务器怎么租服务器 浏览:475
旅游手机网站源码 浏览:332
android关联表 浏览:945
安卓导航无声音怎么维修 浏览:332
app怎么装视频 浏览:430
安卓系统下的软件怎么移到桌面 浏览:96
windows拷贝到linux 浏览:772
mdr软件解压和别人不一样 浏览:904
单片机串行通信有什么好处 浏览:340
游戏开发程序员书籍 浏览:860
pdf中图片修改 浏览:288
汇编编译后 浏览:491