标题: 单片机电子锁的proteus仿真程序 [打印本页]
作者: 风起苍岚 时间: 2019-11-19 08:48
标题: 单片机电子锁的proteus仿真程序
密码锁的仿真程序由延时、报警延时、键盘扫描、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)
作者: 2053395846 时间: 2021-2-23 12:22
觉得很有用,谢啦
作者: sss9 时间: 2021-6-20 11:08
用不了,下我个锤子
作者: 51hei团团 时间: 2021-6-20 17:08
可以用啊,楼主的程序完全正确,我自己建立了一个工程文件 输入楼主的程序后,仿真成功了,你是不是没有建立工程,没有hex?当然不能仿真啦,我建立的工程已经放在附件了
对了楼主的密码是
if(n0=='1'&&n1=='6'&&n2=='3'&&n3=='0'&&n4=='1'&&n5=='8')
-
51hei.png
(26.42 KB, 下载次数: 20)
-
-
电子锁Keil工程.7z
66.32 KB, 下载次数: 8, 下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |