从经济实用的角度出发,采用51单片机AT89S51与低功耗CMOS型E2PROM AT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路,用汇编语言编写主控芯片的控制程序,设计了一款可以多次更改密码具有报警功能的电子密码锁。
只实现简单通讯功能,能够处理下位机传上来的数据。继电器打开(开锁)上位机显示1;继电器关闭(关锁)上位机显示0。
本设计中的数据库、手动发送未用到。
使用数字小键盘输入六位密码
密码锁在输入密码正确的条件下输出开锁电平,控制电控锁开启
同时显示0【改成OK】字样
当输入密码错误时
发出错误警告声音
同时显示C【改成ERROR】字样
当六次误码【为简便改成三次】输入时产生报警信号
还可以实现对密码的修改
修改成功后蜂鸣发出确认音
电控锁开启
可以通过使步进电机转动180度来模拟开锁和关锁动作
LED【改用LCD】显示电子锁当前状态
- /**************************************************************************************
- 矩阵键盘:
- 0 1 2 3
- 4 5 6 7
- 8 9 返回 确定
- [ DISCUZ_CODE_1 ]nbsp; [ DISCUZ_CODE_1 ]nbsp; [ DISCUZ_CODE_1 ]nbsp; [ DISCUZ_CODE_1 ]nbsp;
- ***************************************************************************************/
- #include "reg52.h"
- #include<intrins.h> //左右移函数
- #include "lcd.h"
- #include "key.h"
- #include "i2c.h"
- #define u16 unsigned int //对数据类型进行声明定义
- #define u8 unsigned char
- sbit AS=P2^2; //继电器
- sbit beep=P2^3; //蜂鸣器
- sbit MOTOA = P3^0; //步进电机
- sbit MOTOB = P3^1;
- sbit MOTOC = P3^2;
- sbit MOTOD = P3^3;
- #define SPEED 200 //步进电机脉冲
- /*****************************************************************************/
- u8 pw_num,Error_Num,Error_Num1,PassWord_Length=6;
- u8 PASSWORD[]={8,8,8,8,8,8,0,0,0,0};
- u8 INPUT_PW_Tab[10];
- u8 key_num,Step,Step5,Load_first_flag=0;
- u8 dianping;
- /*******************************************************************************/
- bit result_flag,Input_suc_flag;
- bit List1=0;
- /*******************************************************************************/
- void Step_0();
- void Step_1();
- void Step_2();
- void Step_3();
- void Step_4();
- void Step_5();
- void Step5_0();
- void Step5_1();
- void Step5_2();
- void Step5_3();
- void Step5_4();
- void Step5_5();
- void Step_6();
- /*******************************************************************************/
- void CipherComparison();
- void input_password(bit m);
- void Read_Password();
- void init_serialcomm( )
- {
- EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
- ES = 1; //允许UART串口的中断
- TMOD = 0x20; //定时器T/C1工作方式2
- SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
- TH1 = 0xF3; //定时器初值高8位设置 //12MHZ晶振,波特率为4800 0xf3
- TL1 = 0xF3; //定时器初值低8位设置 //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfd
- PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
- TR1 = 1; //定时器启动
- TI = 1;
- }
- void sendc(u8 ch)
- {
- SBUF=ch;
- while(!TI);
- TI=0;
- }
- void main()
- {
- u8 data1,a;
- // ShowString(0x00," Pechin Science ");
- // At24c02Write(0,0); //开机显示密码
- init_serialcomm(); /**************串口初始化*************/
- LcdWriteCom(0x01); //清屏
- for(data1=0;data1<PassWord_Length+2;data1++)
- {
- a=At24c02Read(data1)+0x30;
- LcdWriteData(a);
- delay(1000);
- }
- delay(1000);
- LcdInit();
- delay(1000);
- Step=0;
- Step5=0;