密码锁的仿真程序由延时、报警延时、键盘扫描、LCD写命令、LCD写函数、LCD初始化、密码显示、error、open、“*”显示子程序和主程序构成。 延时:一段设定好时间的延时。 报警延时:延时并且报警器工作。 键盘扫描:扫描出键盘上被按下的键,并且对应到A、B、0~9。 LCD写命令:选择指令寄存器。 LCD写函数:选择数据寄存器。 LCD初始化:初始化LCD。 密码显示:在LCD上显示键入数值。 Error:LCD显示error并且红色LED点亮。 Open:LCD显示open并且绿色LED闪烁。 “*”显示:将在LCD上显示的数值在一段时间后变化为“*”。 主程序:设定6 位数的密码,进行对6位键入数值的和设定数值的对比,并且在前5位数值输入后进行一位位数移动,在第六位密码输入结束后进行密码正误判断。密码正确则显示open,并且绿灯闪烁,密码错误显示error,红灯常亮,报警器报警,在显示open/error一段时间后复位,可再次键入新密码,进行新一轮的密码判断。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- sbit RS=P1^0; //寄存器选择
- sbit RW=P1^1; //读写控制
- sbit EN=P1^2; //使能
- sbit ledg=P1^3; //红指示灯
- sbit ledr=P1^7; //蓝指示灯
- sbit relay=P1^4; //锁
- sbit buzz=P1^6; //报警器
- char table0[ ]= "error"; //显示
- char table1[ ] = "open";
- char table2[] = "password:";
- int temp,ch,m0 ,m1 ,p,n0 ,n1 ,n2 ,n3 ,n4 ,n5;
- void delay(int z) //延时
- {
- int x,c;
- for(x=z;x >0;x -- )
- for(c= 100;c >0;c--);
- }
- void Tdelay(int z) //报警延时
- {
- int x,c;
- for(x=z;x >0;x -- )
- for(c= 100;c >0;c--)
- buzz=!buzz;
- }
- keyscan( ) //键盘扫描
- { temp=P2&0xf0; //扫描行
- P2=0xfe;
- delay(1);
- temp=P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp) //789数字设定
- {
- case 0xe0:ch='7';break;
- case 0xd0:ch='8';break;
- case 0xb0:ch='9';break;
- default:ch=p;break;
- }
- while(temp!=0xf0) //等待键盘松开
- {
- temp= P2;
- temp = temp&0xf0;
- }}
- P2=0xfd; //456数字设定
- delay(1);
- temp = P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp)
- {
- case 0xe0:ch='4';break;
- case 0xd0:ch='5';break;
- case 0xb0:ch='6';break;
- default:ch=p;break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }}
- P2 = 0xfb; //123数字设定
- delay(1);
- temp=P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp)
- {
- case 0xe0:ch='1';break;
- case 0xd0:ch='2';break;
- case 0xb0:ch='3';break;
- default:ch=p;break;
- }
- while( temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }}
- P2=0xf7; //A0B设定
- delay(1);
- temp=P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp)
- {
- case 0xe0:ch='A';break;
- case 0xd0:ch='0';break;
- case 0xb0:ch='B';break;
- default:ch=p;break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }}
- return ch; //返回键入的值
- }
- void wcom(uchar com) //LCD写命令
- {
- RS=0; //选择指令寄存器
- P3=com;
- delay(1);
- EN=1; //使能
- delay(1);
- EN=0;
- }
- void wdat(uchar dat) //写函数
- {
- RS=1; //选择数据寄存器
- P3 = dat;
- delay(1);
- EN=1;
- delay(4);
- EN=0;
- }
- void init( ) //LCD初始化
- {
- EN=0;
- wcom(0x38);
- wcom(0x0c);
- wcom(0x06);
- wcom(0x01);
- }
- void error( ) //显示密码error
- {
- char m2;
- wcom(0xc6);
- for(m2=0;m2<5;m2++)
- {
- wdat(table0[m2]);
- }}
- void open( ) //密码open
- {
- char m2;
- wcom(0xc6);
- for(m2=0;m2<4;m2++ )
- {
- wdat(table1[m2]);
- }}
- void pass() //密码显示
- {
- char m2;
- wcom(0x80);
- for(m2=0;m2<9;m2++ )
- {
- wdat(table2[m2]);
- }}
- change(int m) //显示“ * ”
- {
- delay(500);
- wcom(m);
- wdat('*');
- }
- main( ) //主程序
- {
- RW=0;
- ledg=0;
- ledr=0;
- buzz=1;
- init();
- delay(5);
- pass();
- wcom(0x89);
- while(keyscan()==p)
- { //第一位密码
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n0=keyscan();
- change(0x89);
- delay(10);
- ch=p;
- while(keyscan()==p) //第二位密码
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n1=keyscan();
- change(0x8a);
- ch=p;
- while(keyscan()==p) //第三位密码
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n2=keyscan();
- change(0x8b);
- ch=p;
- while(keyscan()==p) //第四位密码
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n3=keyscan();
- change(0x8c);
- ch=p;
- while(keyscan()==p) //第五位密码
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n4=keyscan();
- change(0x8d);
- ch=p;
- while(keyscan()==p) //第六位密码
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n5=keyscan();
- change(0x8e);
- if(n0=='1'&&n1=='6'&&n2=='3'&&n3=='0'&&n4=='1'&&n5=='8')
- //密码设定
- {
- int m3=1;
- open();
- while(m3)
- {
- int m4,m5;
- ledg=0; //亮绿灯
- for(m4=200;m4>0;m4--)
- {
- keyscan( );
- if(keyscan()=='A')
- {
- m4=0;
- m3=0;
- }}
- ledg=1;
- if(m3!=0)
- {
- for(m5=200;m5>0;m5--)
- {
- keyscan();
- if(keyscan()=='A')
- {
- m3=0;
- }}}}
- }
- else //红灯亮,错误显示
- {
- ledr=1;
- error();
- buzz=1;
- Tdelay(5000);
- }
- }
复制代码
所有资料51hei提供下载:
电子锁.rar
(25.46 KB, 下载次数: 56)
|