摘要:利用51单片机制作一个掉电可保留数据的密码锁,要求密码器系统由一个超级用户和四个普通用户组成,普通用户可控制锁的开关和修改用户密码,超级用户可以添加和删除普通用户。
一、元件选择
主控芯片选择51系列stc89c51,使用at24c02存储密码锁的数据信息,使用LCD1602液晶屏显示用户界面。输入信号由一个4X4的矩阵键盘发出。
二、电路搭建
以下是用proteus搭建的电路图
三、代码的实现
(一)、LCD1602
1.接口定义
2.读操作时序
3.写操作时序
4.51代码
#include "headfile.h"
sbit rs=P2^0;
sbit rw=P2^1;
sbit ep=P2^2;
//写位置
void writeposition(uchar position)
{
rs = 0;
P0 = position;
ep = 1;
_nop_();
ep = 0;
delay(1);
}
//写数据:RS=1, RW=0;
void writeData(uchar dat)
{
rs = 1;
P0 = dat;
ep = 1;
_nop_();
ep = 0;
delay(1);
}
//清屏初始化
void lcd_init()
{
rw=0;
writeposition(0x38);
writeposition(0x0c);
writeposition(0x06);
writeposition(0x01);
}
//写数组
void print_string(uchar *str,uchar posit)
{
int i;
writeposition(posit);
for(i=0;str[i]!=0;i++)
{
writeData(str[i]);
}
}
(二)AT24C02
AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器,该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
有关AT24C02的具体说明,在此就不多解释了,大家可以自行查看其芯片手册IDCHIP-AT24C02.pdf (semiee.com)https://www.semiee.com/file/Source10/IDCHIP-AT24C02.pdf
部分代码:
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
(三)主体代码
主体思路:
单片机开机时,先完成所有初始化,读取AT24C02的数据,将用户信息读入相应的数组。后进入人机操作的代码循环,扫描按键动作。并在LCD屏上显示,操作者确认后,比较输入的数据和存储用户的数组里的数据做对比,对比通过后,进入下一个人机界面的循环,在后续循环中,如扫描按下返回健,使用break;语句返回上级循环。
部分代码展示:
四、视频演示
基于51单片机的用户密码锁设计