简易电子密码锁设计

来源:互联网 发布:照片合成用什么软件 编辑:程序博客网 时间:2024/04/27 13:30

    简易电子密码锁的设置,用矩阵键盘数字0~9设置六位数的密码,另外设置一个OK键,当六位密码数按键正确后再按下确认键后则数码管出现字符提示,并且亮起发光二极管。利用定时器T0中断函数处理按键程序。利用TR0=0,TR0=1启停定时器。P3^0至P3^3做为矩阵键盘的行,P3^4至P3^7做为矩阵键盘的行。初始密码设为012345。

 

 

 

 

/********************************************************************************
********************************简易电子锁设计**************************************
*********************************************************************时间2月16日*/
#include<reg52.h>
#define uchar unsigned char
sbit wei=P2^7;
sbit duan=P2^6;
uchar code table1[]={0x3e,0x3d,0x3b,0x37,0x2f,0x1f};//位选表
uchar code gf[]={0x65,0x3e,0x3f,0x71,0x79,0x54,0x65,0x40,0x80};//段码表最后一位是小数点倒数第二个位显示-
uchar mima[7]={0,1,2,3,4,5,10};//设定密码
uchar keynum;//键值
sbit led=P1^0;
sbit ln1=P3^4;//列
sbit ln2=P3^5;
sbit ln3=P3^6;
sbit ln4=P3^7;
/*******延时函数***************/
 void delay(uchar xms)
 {
   char x,y;
   for(x=xms;x>0;x--)
      for(y=110;y>0;y--);
 }
/**********初始化函数***************/
void init()
{
  wei=0;
  P0=0xff;
  duan=0;
  P0=0x00;// 初始化关显示
  EA=1;//开总中断
  TMOD=0x01;
  TH0=(65536-500)/256;
  TL0=(65536-500)%256;
  ET0=1;//开定时器0中断
  TR0=1;//启动计数

}

 

/*********** 定时器0中断函数************/
void t0_timer() interrupt 1
{
    TR0=0;//停止计数
 P3=0xf0;
 if((P3&0xf0)!=0xf0)
    delay(10);
    if((P3&0xf0)!=0xf0)
       {
P3=0xfe;
    if(ln1==0)
     keynum=0;
     if(ln2==0)
     keynum=1;
     if(ln3==0)
     keynum=2;
     if(ln4==0)
     keynum=3;
P3=0xfd;
    if(ln1==0)
     keynum=4;
     if(ln2==0)
     keynum=5;
     if(ln3==0)
     keynum=6;
     if(ln4==0)
     keynum=7;
P3=0xfb;
    if(ln1==0)
     keynum=8;
     if(ln2==0)
     keynum=9;
     if(ln3==0)
     keynum=10;
    }
TH1=(65536-500)/256;
TH0=(65536-500)%256;
TR0=1;
}


/************显示函数***********/
void display()
{
P0=0xff; //消隐
  wei=1;
  P0=table1[0];//第1个数码管选中
  wei=0;
  duan=1;
  P0=gf[0];
  duan=0;
  delay(1);
P0=0xff; //消隐
  wei=1;
  P0=table1[1];//第2个数码管选中
  wei=0;
  duan=1;
  P0=gf[1];
  duan=0;
  delay(1);
P0=0xff; //消隐
  wei=1;
  P0=table1[2];//第3个数码管选中
  wei=0;
  duan=1;
  P0=gf[2];//显示
  duan=0;
  delay(1);
P0=0xff; //消隐
  wei=1;
  P0=table1[3];//第4个数码管选中
  wei=0;
  duan=1;
  P0=gf[3];//显示
  duan=0;
  delay(1);
P0=0xff; //消隐
  wei=1;
  P0=table1[4];//第5个数码管选中
  wei=0;
  duan=1;
  P0=gf[4];//显示
  duan=0;
  delay(1);
P0=0xff;//消隐     
  wei=1;
  P0=table1[5];//第6个数码管选中
  wei=0;
  duan=1;
  P0=gf[5];//显示
  duan=0;
  delay(1);

}


void main()
{
init();
while(mima[0]!=keynum);//等待按键键值与密码是否相等
while(mima[1]!=keynum);
while(mima[2]!=keynum);
while(mima[3]!=keynum);
while(mima[4]!=keynum);
while(mima[5]!=keynum);
while(mima[6]!=keynum);//是否按下OK键 设置键值10为OK键
   while(1)
      {
    led=~led;
    delay(1000);
       display();
    }
}