|
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
单片机源程序如下:
- #include<reg51.h>
- #include<keyinput.h>
- #include<12864.h>
- #include<24C01.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED1=P1^5;
- sbit LED2=P1^6;
- sbit INIT=P2^2;
- sbit SOUND=P1^7;
- uchar idata key[6]={0,0,0,0,0,0};
- uchar idata iic[6]={0,1,2,3,4,5};
- /************************ 密码校验函数 **************************/
- void press(uchar *s) {
- uchar dat;
- P3=0xf0; //第一位密码
- while(P3==0xf0);
- dat=key_scan();
- if((dat!=0x0a)&&(dat!=0x0b))
- { *s=dat;
- Left();
- star_12864(star,0x05,16);
- }
- s++;
- P3=0xf0; //第二位密码
- while(P3==0xf0);
- dat=key_scan();
- if((dat!=0x0a)&&(dat!=0x0b))
- { *s=dat;
- Left();
- star_12864(star,0x05,24);
- }
- s++;
- P3=0xf0; //第三位密码
- while(P3==0xf0);
- dat=key_scan();
- if((dat!=0x0a)&&(dat!=0x0b))
- { *s=dat;
- Left();
- star_12864(star,0x05,32);
- }
- s++;
- P3=0xf0; //第四位密码
- while(P3==0xf0);
- dat=key_scan();
- if((dat!=0x0a)&&(dat!=0x0b))
- { *s=dat;
- Left();
- star_12864(star,0x05,40);
- }
- s++;
- P3=0xf0; //第五位密码
- while(P3==0xf0);
- dat=key_scan();
- if((dat!=0x0a)&&(dat!=0x0b))
- { *s=dat;
- Left();
- star_12864(star,0x05,48);
- }
- s++;
- P3=0xf0; //第六位密码
- while(P3==0xf0);
- dat=key_scan();
- if((dat!=0x0a)&&(dat!=0x0b))
- { *s=dat;
- Left();
- star_12864(star,0x05,56);
- }
- do{P3=0xf0; //键入Enter键盘继续执行下面语句,否则等待
- while(P3==0xf0);
- dat=key_scan();
- }while(dat!=0x0b);
- }
- /****************************** 延时10ms函数 *******************************/
- void Delay10ms(void) {
- uint i,j,k;
- for(i=5;i>0;i--)
- for(j=4;j>0;j--)
- for(k=248;k>0;k--);
- }
- /****************************** 主函数 *******************************/
- void main() {
- uchar dat;
- uchar i=0,j=0,k;
- uchar x;
- LED1=1;
- LED2=1;
- SOUND=0;
- INIT=1;
- if(INIT==0){ //密码初始化,先从IIC器件中读出密码以供下面输入密码进行比较
- x=SendB(iic,0x50,6);
- Delay10ms();
- }
- x=ReadB(iic,0x50,6);
- Init_12864();
- for(i=0;i<50;i++){Delay10ms();}
- do{ //若密码不正确,循环执行do{}while()
- LED1=1;
- System(); //显示:请输入密码
- press(key);
- if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3])&&(key[4]==iic[4])&&(key[5]==iic[5])) //密码比较,若密码正确责进入系统,若密码不正确则显示密码错误,重新输入密码
- {
- true();
- do {
- P3=0xf0; //键入1或2继续执行下面语句,否则等待
- while(P3==0xf0);
- dat=key_scan();
- }while(dat!=0x01&&dat!=0x02);
- if(dat==1) { //开锁
- LED1=0; j=0;
- unlock();
- for(i=0;i<100;i++){Delay10ms();}
- continue;
- }
- if(dat==2) { //修改密码
- do{
- j=0;
- System();
- press(key);
- again();
- press(iic);
- if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3])&&(key[4]==iic[4])&&(key[5]==iic[5]))
- {
- succeed(); //修改密码成功
- for(i=0;i<100;i++){Delay10ms();}
- Delay10ms();
- x=SendB(iic,0x50,6);
- Delay10ms();
- x=ReadB(iic,0x50,6);break;
- }
- else { //修改密码不成功,重新修改
- repeat();
- for(i=0;i<100;i++){Delay10ms();}
- }
- }while(1);
- }
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电子密码锁.zip
(121.93 KB, 下载次数: 141)
|
评分
-
查看全部评分
|