overdoes_218 2024-03-10 22:30 采纳率: 0%
浏览 4
已结题

关于#51单片机#的问题,请各位专家解答!(语言-c语言)

c51单片机想要做一个重置密码键k13,用到AT24C02来存储密码 应该怎么写这个代码呢?求解

#include<reg51.h>
#include<string.h>
sbit lcd_RS=P2^0;
sbit lcd_RW=P2^1;
sbit lcd_E=P2^2;
sbit jidianqi=P2^7;
sbit buzzer = P3^0;
char key[]={0,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30};  //键值
char key2[]="Correct";
char key3[]="Error";
char table[]="password";
char table1[]="input:";
char passwordInput[5]; 

delay(unsigned int x)          
{       
    unsigned int i;
    for(x=0;x<100;x++)
        for(i=0;i<x;i++);
}
wuyuan()
{ int k;
  
  for(k=0;k<20;k++)
  {      buzzer=1;
     delay(39999);
     buzzer=0;
     delay(39999);
   }
}

write_com(unsigned char com )     
{
    while(lcd_busy());
    lcd_RS=0;
    lcd_RW=0;
    delay(200);
    P0=com;
    delay(200);
    lcd_E=1;
    delay(200);
    lcd_E=0;
}
write_dat(unsigned char dat ) 
{
    while(lcd_busy());
    lcd_RS=1;
    lcd_RW=0;
    P0=dat;
    delay(200); 
    lcd_E=1;
    delay(200);
    lcd_E=0;
}
void write_password_char()
{write_dat(42);
}
lcd_busy()
{ 
    unsigned char temp;
    lcd_RS=0;
    lcd_RW=1;
    delay(20);
    P0=0xff;
    delay(20);
    lcd_E=1;
    delay(20);
    temp=P0;
    delay(20);
    lcd_E=0;
    return(temp&0x80);
}
init()                       
{ 
    write_com(0x01);
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
} 
juxingjianpan()                      
{ 
    unsigned char KeyNumber,x,y;
    P1=0x0f;              
    x=P1;
    P1=0xf0;
    y=P1;
    switch(x+y)
    { 
        case 0xee:      KeyNumber=1;break;
        case 0xde:      KeyNumber=2;break;
        case 0xbe:      KeyNumber=3;break;
        case 0x7e:      KeyNumber=4;break;
        case 0xed:      KeyNumber=5;break;
        case 0xdd:      KeyNumber=6;break;
        case 0xbd:      KeyNumber=7;break;
        case 0x7d:      KeyNumber=8;break;
        case 0xeb:      KeyNumber=9;break;         
        case 0xdb:      KeyNumber=10;break;
        case 0xbb:        KeyNumber=11;break;
        case 0x7b:        KeyNumber=12;break;
        case 0xe7:        KeyNumber=12;break;
    }
    return KeyNumber;
}                    
void main() {static unsigned char position = 0,x = 0,y; 
unsigned int i, KeyNum, passwordLen = 0;
init();
write_com(0x80);
for(i = 0; i < 8; i++) {
write_dat(table[i]);
}
write_com(0xc0);
for(i = 0; i < 6; i++) {
write_dat(table1[i]);
}
 // 将静态变量定义移到while循环外部
while(1) {

write_com(0xc6 + position);
KeyNum = juxingjianpan();
if(KeyNum) {
if(KeyNum <= 10) {
if(x <= 3) {
write_password_char();
delay(5);
passwordInput[passwordLen++] = key[KeyNum];
position++;
}
x++;
}  if(KeyNum == 11) { // 确认键
if (strcmp(passwordInput, "1234") == 0) {
write_com(0x01);
delay(20);
write_com(0x86);
jidianqi=0;
for(y = 0; y < 7; y++) {
write_dat(key2[y]);
delay(5);
}
} else {
write_com(0x01);
delay(20);
write_com(0x86);
wuyuan();
for(y = 0; y < 5; y++) {
write_dat(key3[y]);
delay(5);
}
}
memset(passwordInput, 0, sizeof(passwordInput));
passwordLen = 0;
x = 0;
position = 0;
} else if (KeyNum == 12) {
memset(passwordInput, 0, sizeof(passwordInput));
passwordLen = 0;
x = 0;
position = 0;
buzzer=1;
delay(20);
buzzer=0;
delay(20);
jidianqi=1;
write_com(0x01);
write_com(0x80);
for(i = 0; i < 8; i++) {
write_dat(table[i]);
}
write_com(0xc0);
for(i = 0; i < 6; i++) {
write_dat(table1[i]);
}
}
}
}
}

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-10 22:33
    关注

    引自免费微信小程序:皆我百晓生

    为了实现基于51单片机的重置密码功能,您需要结合现有的代码和AT24C02 EEPROM芯片进行扩展。在您的程序中,首先需要初始化I2C通信以与AT24C02通信,并添加读取、写入和擦除AT24C02存储单元的函数。

    以下是一个简化的示例,展示了如何将密码存入AT24C02以及如何从EEPROM读取密码进行验证:

    #include<reg51.h>
    #include<string.h>
    #include "i2c.h" // 假设你有一个包含I2C驱动的头文件
    
    // I2C初始化函数(请根据实际硬件配置实现)
    void init_I2C() {
        // 初始化I2C接口,例如SCL和SDA引脚方向和工作模式
    }
    
    // 向AT24C02写入一个字节数据到指定地址
    void write_to_AT24C02(unsigned int addr, unsigned char data) {
        start_I2C(); // 发送I2C起始信号
        write_I2C(AT24C02_ADDR); // 写入设备地址
        write_I2C(addr); // 写入EEPROM内部地址
        write_I2C(data); // 写入数据
        stop_I2C(); // 发送停止信号
    }
    
    // 从AT24C02读取一个字节数据
    unsigned char read_from_AT24C02(unsigned int addr) {
        unsigned char data;
        start_I2C();
        write_I2C(AT24C02_ADDR | 0x01); // 读取设备地址
        write_I2C(addr); // 写入EEPROM内部地址
        restart_I2C(); // 发送重启信号
        write_I2C(AT24C02_ADDR | 0x01); // 再次发送读取设备地址
        data = read_I2C(); // 读取数据
        stop_I2C();
        return data;
    }
    
    // 存储密码到AT24C02
    void store_password(char* password, unsigned int addr) {
        for (int i = 0; i < PASSWORD_LENGTH && password[i]; ++i) {
            write_to_AT24C02(addr + i, password[i]);
        }
    }
    
    // 从AT24C02读取密码并验证
    int verify_password(char* input, unsigned int addr) {
        char stored_password[PASSWORD_LENGTH + 1];
        memset(stored_password, 0, sizeof(stored_password));
        
        for (int i = 0; i < PASSWORD_LENGTH; ++i) {
            stored_password[i] = read_from_AT24C02(addr + i);
        }
    
        if (strcmp(input, stored_password) == 0) {
            return 1; // 验证成功
        } else {
            return 0; // 验证失败
        }
    }
    
    // ... (保留原有的按键扫描和LCD显示相关代码)
    
    // 在main函数或其他适当位置调用存储和验证密码函数
    int main(void) {
        // 初始化部分...
        
        // 假设已获取输入的密码
        char input_password[6];
        // ...(获取密码的代码)
    
        // 存储密码到AT24C02
        store_password("1234", PASSWORD_START_ADDR);
    
        // 验证密码
        if (verify_password(input_password, PASSWORD_START_ADDR)) {
            // 密码正确操作
        } else {
            // 密码错误操作
        }
    
        // ...(剩余的主循环和其他处理)
    }
    

    请根据你的实际硬件连接和I2C驱动库替换上述init_I2C()start_I2C()stop_I2C()restart_I2C()write_I2C()read_I2C() 函数内容。同时,请确保PASSWORD_LENGTHPASSWORD_START_ADDR分别设置为你的密码长度和EEPROM中存储密码的起始地址。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月17日
  • 创建了问题 3月10日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆