可修改密码的电子密码锁

使用52单片机设计电子密码锁,如果没有24c02的话可以实现修改密码的功能吗?

可以实现的,可以将密码存在芯片内部的flash上,具体操作得查看芯片手册!

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7612576
  • 这篇博客也不错, 你可以看下蓝桥杯单片机 | 特训案例【进阶04】24C02存储按键触发次数
  • 除此之外, 这篇博客: 备战蓝桥杯单片机倒数第四天 小蜜蜂老师公众号更新内容中的  【进阶03】24C02的基本读写操作 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #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();
    	}
    }
  • 您还可以看一下 朱有鹏老师的巫妖王51单片机开发板配套视频课程课程中的 测试确认开发板硬件完好2小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    在没有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();
            }
        }
    }
    

    需要注意的是,以上代码只是一个示例,具体的实现逻辑和操作需要根据需求进行调整。另外,由于没有提供完整的代码和相关函数的实现,所以无法完全保证以上代码的正确性,仅供参考。如果需要更具体的解决方案,请提供更多的信息和相关代码。