基于8051的电子密码锁程序

来源:互联网 发布:易语言手机编程 编辑:程序博客网 时间:2024/04/30 16:04
/****************************************功能:当电源接通时,LED灯以1S闪烁,键盘上可输入2位密码与预设密码比对,如相符则LED常亮,如不符仍需输入密码。为防止密码遗失,八段显示器会在2位密码输入后,过一段时间熄灭。****************************************/# include <reg52.h># define uchar unsigned char  # define uint  unsigned intuchar code table[]=    //共阳极八段显示器{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};sbit LED=P2^3;sbit pian1=P2^0;sbit pian2=P2^1;uchar count,num1,num2,flag,key;void init();void keyboard();void delay(uchar a);void main(){init();while(1){uchar x,y;while(num1==10)     {pian2=0;keyboard();P0=table[num1];}while(num2==10){keyboard();}for(x=2;x>0;x--)for(y=110;y>0;y--)   {pian1=0;pian2=1;P0=table[num2];delay(10);pian2=0;pian1=1;P0=table[num1];delay(10);   }if(num1==key/10&&num2==key%10){  TR0=0;LED=1;P0=0xff;num1=10;num2=10;flag=1;}else{P0=0xff;num1=10;num2=10;flag=1;} }}void keyboard(){  uchar temp,num;num=10;P1=0xef;  temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xcf: num=1;break;case 0xaf: num=2;break;case 0x6f: num=3;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}  P1=0xf7;  temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xd7: num=4;break;case 0xb7: num=5;break;case 0x77: num=6;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}  P1=0xfb;temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xdb: num=7;break;case 0xbb: num=8;break;case 0x7b: num=9;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}P1=0xfd;temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xdd: num=10;//这里星号键和井号键我是使数码管不显示任何数break;case 0xbd: num=0;break;case 0x7d: num=10;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}if(num!=10){if(flag!=0){flag=0;num1=num;}elsenum2=num;}}void init()//初始化函数{key=16;//对密码的初始化num1=10;num2=10;flag=1;P0=0xff;count=0;EA=1;ET0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TMOD=0X11;TR0=1;}void delay(uchar a){uchar x,y;for(x=a;x>0;x--)for(y=110;y>0;y--);}void pause() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20){count=0;LED=~LED;}}



在这个电路图中我只使用了两个八段数码管,旨在演示如何实现在利用8051实现密码锁功能,当密码正确时LED灯常亮,具体的使用可以视情况在中断服务程序中更改。