使用52单片机设计电子密码锁,如果没有24c02的话可以实现修改密码的功能吗?
可以实现的,可以将密码存在芯片内部的flash上,具体操作得查看芯片手册!
#include "reg52.h"
#include "iic.h"
unsigned char dat1=0,dat2=0,dat3=0;
unsigned char code smg_data[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90};
void delay(unsigned int t)
{
while(t--);
}
void Init_74HC138(unsigned char n)
{
switch(n)
{
case 4:P2 = (P2 & 0x1f) | 0x80;break;
case 5:P2 = (P2 & 0x1f) | 0xa0;break;
case 6:P2 = (P2 & 0x1f) | 0xc0;break;
case 7:P2 = (P2 & 0x1f) | 0xe0;break;
case 0:P2 = (P2 & 0x1f) | 0x00;break;
}
P2 = (P2 & 0x1f) | 0x00;
}
void SMG_DisplayBit(unsigned char pos,unsigned char dat)
{
P0 = (0x01 << pos);
Init_74HC138(6);
P0 = dat;
Init_74HC138(7);
}
void SMG_Close()
{
P0 = 0xff;
Init_74HC138(6);
P0 = 0xff;
Init_74HC138(7);
}
void Init_System()
{
Init_74HC138(0);
P0 = 0x00;
Init_74HC138(5);
P0 = 0xff;
Init_74HC138(4);
}
void SMG_Display_Data()
{
SMG_DisplayBit(0,smg_data[dat1/10]);
delay(200);
SMG_DisplayBit(1,smg_data[dat1%10]);
delay(200);
SMG_DisplayBit(2,0xbf);
delay(200);
SMG_DisplayBit(3,smg_data[dat2/10]);
delay(200);
SMG_DisplayBit(4,smg_data[dat2%10]);
delay(200);
SMG_DisplayBit(5,0xbf);
delay(200);
SMG_DisplayBit(6,smg_data[dat3/10]);
delay(200);
SMG_DisplayBit(7,smg_data[dat3%10]);
delay(200);
SMG_Close();
delay(200);
}
AT24c02单字节写
void AT24C02_Write(unsigned char addr,unsigned char dat)
{
IIC_Start(); //起始信号
IIC_SendByte(0xa0); //EEPROM的写设备地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(addr); //内存单元地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(dat); //内存写入数据
IIC_WaitAck(); //等待从机应答
IIC_Stop(); //停止信号
}
//AT24C02数据读
unsigned char AT24C02_Read(unsigned char addr)
{
unsigned char tmp = 0;
//首先,进行一个伪写操作
IIC_Start(); //起始信号
IIC_SendByte(0xa0); //EEPROM的写设备地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(addr); //内存单元地址
IIC_WaitAck(); //等待从机应答
//然后,开始字节读操作
IIC_Start(); //起始信号
IIC_SendByte(0xa1); //EEPROM的读设备地址
IIC_WaitAck(); //等待从机应答
tmp = IIC_RecByte(); //读取内存中的数据
IIC_SendAck(1); //产生非应答信号
IIC_Stop(); //停止信号
return tmp;
}
ATC02读取与写入
void Read_Write_Data(void)
{
//先读取数据
dat1 = AT24C02_Read(0x01);
dat2 = AT24C02_Read(0x03);
dat3 = AT24C02_Read(0x05);
dat1 = dat1 +1;
dat2 = dat2 +2;
dat3 = dat3 + 3 ;
if( dat1 > 10)
{
dat1 = 0;
}
if(dat2 > 20)
{
dat2 = 0;
}
if(dat3 > 30)
{
dat3 = 0;
}
AT24C02_Write(0x01,dat1);
delay(1000);
AT24C02_Write(0x03,dat2);
delay(1000);
AT24C02_Write(0x05,dat3);
delay(1000);
}
void main(void)
{
Init_System();
Read_Write_Data();
while(1)
{
SMG_Display_Data();
}
}
在没有24c02的情况下,可以使用52单片机设计一个可修改密码的电子密码锁。以下是一个解决方案:
首先,需要定义一个存储密码的变量,可以使用一个数组来存储密码,例如:
unsigned char password[4] = {0, 0, 0, 0};
然后,需要实现一个函数,用于输入密码。可以使用外部按键或者其他输入设备来输入密码,例如:
void inputPassword() {
for (int i = 0; i < 4; i++) {
// 等待输入密码的操作,例如通过按键输入
password[i] = getInput(); // 假设getInput()函数用于获取输入的数字
}
}
接下来,需要实现一个函数,用于验证密码是否正确。可以通过比较输入的密码和存储的密码来判断是否正确,例如:
bool verifyPassword() {
unsigned char input[4];
for (int i = 0; i < 4; i++) {
// 等待输入密码的操作,例如通过按键输入
input[i] = getInput(); // 假设getInput()函数用于获取输入的数字
}
for (int i = 0; i < 4; i++) {
if (input[i] != password[i]) {
return false;
}
}
return true;
}
最后,可以在主函数中实现一个密码锁的控制逻辑,例如:
void main(void)
{
bool enableModifyPassword = false;
Init_System();
Read_Write_Data();
// 延时一些时间,等待系统稳定
delay(500);
while(1)
{
// 检测是否需要修改密码
if (isEnableModifyPassword()) {
enableModifyPassword = true;
// 输入新密码
inputPassword();
// 修改密码的操作,例如保存新密码
savePassword(password);
// 将enableModifyPassword重置为false
disableModifyPassword();
}
// 验证密码并执行相应的操作
if (verifyPassword()) {
// 密码正确的操作
doAction();
} else {
// 密码错误的操作
invalidPasswordAction();
}
}
}
需要注意的是,以上代码只是一个示例,具体的实现逻辑和操作需要根据需求进行调整。另外,由于没有提供完整的代码和相关函数的实现,所以无法完全保证以上代码的正确性,仅供参考。如果需要更具体的解决方案,请提供更多的信息和相关代码。