微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于单片机AT89C51的电子密码锁设计

基于单片机AT89C51的电子密码锁设计

时间:11-11 来源:互联网 点击:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

实现功能:

预先设置好密码,按START键开始输入,输入6位密码后,显示均为“*”,按ENTER结束输入,显示“ENTER PLEASE:”。如果正确显示“OK”,绿灯亮;如果错误显示“YOU ARE WRONG”,禁止键盘输入3秒,并且红灯亮,如果按除START键以外的其他键,继续禁止输入3秒,如果此时按的是START键,可以重新输入。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include

#define uint unsigned int

#define uchar unsigned char

#define KEY P3 //键盘输入端

#define No_key 20 //无按键时返回值

#define lcddata P2 //1602的数据输入端口

sbit lcden=P1^2;

sbit lcdrs=P1^0; //0输入指令,1输入数据

sbit lcdrw=P1^1; //0向LCD写入数据或指令,1从LCD读取信息

sbit light_red=P1^3;

sbit light_green=P1^4;

uchar j; //用来统计输入个数的全局变量

uchar aa; //用来在定时器中计数的全局变量

uchar code table[]="Hello! ";

uchar code table1[]="OK! ";

uchar code table3[]="YOU ARE WRONG!";

uchar code table2[]="ENTER PLEASE:";

uchar code key_table[]={1,2,3,10,

4,5,6,11,

7,8,9,12,

0,13,14,15};

uchar password[]={2,8,1,6,9,3}; //设定初始密码

uchar save[6]; //保存输入数据

uchar conflag;

uchar startflag;

uchar lockflag;

void delay(uint z);

void wright_com(uchar com); //写命令函数

void wright_data(uchar date); //写数据函数

void init();

void display_OK(); //显示OK

void delete();

uchar keyscan();

void enter_code(uchar t); //输入密码,并把输入的数据存入数组中

void confirm(); //输入密码逐一对比

void succeed_an();

void fail_an();

void lockkey();

void reset();

void display_enter();

void display_wrong();

void main(void)

{

uchar temp;

init();

while(1)

{

if(lockflag) //输入错误,才会锁存

{

temp=keyscan();

if(temp != No_key)

{

aa=0; //重新计时

if(temp==10)

{

lcdrw=0; //清屏

lcden=0;

wright_com(0x01);

reset();

light_red=1;

startflag=1; //开始标志置位

}

}

}

else

{

temp=keyscan();

if(temp != No_key)

{

if(temp==10)

{

lcdrw=0; //清屏

lcden=0;

wright_com(0x01);

reset();

startflag=1; //开始标志置位

}

if(startflag)

{

enter_code(temp);

if(temp==13)

{

confirm();

if(conflag)

{

succeed_an();

}

else

{

fail_an();

}

}

if(temp==14)

{

delete();

}

}

}

}

}

}

/*显示enter*/

void display_enter()

{

uchar num;

wright_com(0x80);

for(num=0;num<13;num++)

{

wright_data(table2[num]);

}

}

/*显示OK*/

void display_ok()

{

uchar num;

wright_com(0x80);

for(num=0;num<13;num++)

{

wright_data(table1[num]);

}

}

/*显示错误*/

void display_wrong()

{

uchar num;

wright_com(0x80);

for(num=0;num<14;num++)

{

wright_data(table3[num]);

}

}

void delete()

{

wright_com(0x80+0x40+j);

wright_data( );

save[--j]=0;

wright_com(0x80+0x40+j);

}

/*复位各种变量*/

void reset()

{

uchar num;

display_enter();

wright_com(0x80+0x40);

for(num;num<6;num++)

{

save[num]=0;

wright_data( );

}

wright_com(0x80+0x40);

lockflag=0;

conflag=0;

j=0;

}

void succeed_an()

{

light_green=0;

display_ok();

delay(1000);

light_green=1;

}

void fail_an()

{

display_wrong();

lockkey();

}

void lockkey()

{

lockflag=1;

}

void enter_code(uchar t)

{

if(t>=0&&t<10)

{

if(j==0)

{

wright_com(0x80+0x40);

wright_data(*);

}

else

{

wright_data(*);

}

save[j++]=t;

}

}

void confirm()

{

uchar k;

for(k=0;k<6;k++)

{ if(password[k]!=save[k])

{

break;

}

}

if(k==6)

{

conflag=1;

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

if(lockflag)

{

aa++;

light_red=0;

if(aa>=60)

{

aa=0;

light_red=1;

lockflag=0;

}

}

}

void init()

{

uchar num;

TMOD=1;

ET0=1;

EA=1;

TR0=1;

lcdrw=0;

lcden=0;

wright_com(0x38);

wright_com(0x0c);

wright_com(0x01);

wright_com(0x80);

for(num=0;num<9;num++)

{

wright_data(table[num]);

delay(1);

}

}

void wright_com(uchar com)

{

lcdrs=0;

lcddata=com;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

void wright_data(uchar date)

{

lcdrs=1;

lcddata=date;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

void del

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top