单片机密码锁程序设计仿真 1、LCD12864液晶显示 2、4*4矩阵键盘输入 3、24C08存储原始密码 4、串口信息输出 本仿真可更换为STM32单片机,MSP430单片机,PIC单片机,AVR单片机等。 资料中含有keil程序、AD原理图,器件手册,使用说明,演示视频等

最近搞了个超有趣的单片机密码锁程序设计仿真项目,跟大家分享分享。这个项目功能丰富,从液晶显示到键盘输入,再到密码存储和串口信息输出,每一步都充满挑战与乐趣。

一、LCD12864液晶显示

LCD12864在这个密码锁里就像一个贴心小秘书,负责给用户提供直观的信息。比如显示输入提示、密码对错状态等。在代码实现上,以51单片机为例,首先要对LCD12864进行初始化设置。

// 定义LCD12864控制引脚
sbit RS = P2^0;  
sbit RW = P2^1;  
sbit E  = P2^2;  

// 向LCD12864写命令
void lcd_command(unsigned char cmd) {  
    P0 = cmd;  
    RS = 0;  
    RW = 0;  
    E  = 1;  
    _nop_();  
    _nop_();  
    E  = 0;  
    delay(5);  
}

// 向LCD12864写数据
void lcd_data(unsigned char dat) {  
    P0 = dat;  
    RS = 1;  
    RW = 0;  
    E  = 1;  
    _nop_();  
    _nop_();  
    E  = 0;  
    delay(5);  
}

// LCD12864初始化函数
void lcd_init() {  
    lcd_command(0x38);  // 8位模式,2行显示,5x7字体
    delay(5);  
    lcd_command(0x0C);  // 显示开,光标关
    delay(5);  
    lcd_command(0x06);  // 光标移动方向
    delay(5);  
    lcd_command(0x01);  // 清屏
    delay(5);  
}

这段代码通过控制引脚RS、RW、E 来向LCD12864发送命令和数据。初始化时,先设置显示模式,再打开显示并设置光标相关属性,最后清屏,为后续显示做好准备。

二、4*4矩阵键盘输入

4*4矩阵键盘是用户与密码锁交互的重要途径,输入密码全靠它。矩阵键盘扫描的代码实现思路是通过行线输出低电平,然后检测列线状态来判断哪个按键被按下。

// 定义矩阵键盘引脚
#define KEY_PORT P3  

unsigned char key_scan() {  
    unsigned char row, col;  
    for(row = 0; row < 4; row++) {  
        KEY_PORT = 0xf0 | ~(1 << row);  
        if((KEY_PORT & 0xf0)!= 0xf0) {  
            delay(20);  // 消抖
            if((KEY_PORT & 0xf0)!= 0xf0) {  
                col = (KEY_PORT & 0xf0) >> 4;  
                switch(row) {  
                    case 0: return col;  
                    case 1: return col + 4;  
                    case 2: return col + 8;  
                    case 3: return col + 12;  
                }  
            }  
        }  
    }  
    return 0xff;  // 无按键按下
}

这段代码先逐行输出低电平,然后检测列线是否有电平变化。如果有,经过消抖处理确认按键按下后,根据行和列的状态计算出按下的按键值。

三、24C08存储原始密码

24C08是一款EEPROM,用来存储原始密码再合适不过,掉电也不会丢失数据。以下是简单的24C08读写代码片段(以I2C协议为例)。

// I2C起始信号
void I2C_Start() {  
    SDA = 1;  
    _nop_();  
    SCL = 1;  
    _nop_();  
    SDA = 0;  
    _nop_();  
    SCL = 0;  
}

// I2C停止信号
void I2C_Stop() {  
    SDA = 0;  
    _nop_();  
    SCL = 1;  
    _nop_();  
    SDA = 1;  
    _nop_();  
}

// 向24C08写一个字节数据
void EEPROM_Write(unsigned char addr, unsigned char dat) {  
    I2C_Start();  
    I2C_SendByte(0xa0);  // 24C08写地址
    I2C_WaitAck();  
    I2C_SendByte(addr);  
    I2C_WaitAck();  
    I2C_SendByte(dat);  
    I2C_WaitAck();  
    I2C_Stop();  
    delay(10);  // 等待写入完成
}

// 从24C08读一个字节数据
unsigned char EEPROM_Read(unsigned char addr) {  
    unsigned char dat;  
    I2C_Start();  
    I2C_SendByte(0xa0);  // 24C08写地址
    I2C_WaitAck();  
    I2C_SendByte(addr);  
    I2C_WaitAck();  
    I2C_Start();  
    I2C_SendByte(0xa1);  // 24C08读地址
    I2C_WaitAck();  
    dat = I2C_ReceiveByte();  
    I2C_NotAck();  
    I2C_Stop();  
    return dat;  
}

这段代码通过I2C协议实现了对24C08的读写操作。起始和停止信号控制数据传输的开始和结束,写操作时发送地址和数据,读操作时先发送地址,再接收数据。

四、串口信息输出

串口信息输出方便调试和监控密码锁状态。以51单片机为例,设置串口通信波特率等参数。

// 串口初始化函数
void uart_init() {  
    TMOD = 0x20;  // 定时器1工作在模式2
    TH1 = 0xfd;  // 波特率9600
    TL1 = 0xfd;  
    TR1 = 1;  
    SM0 = 0;  
    SM1 = 1;  
    REN = 1;  
    ES = 1;  
    EA = 1;  
}

// 串口发送一个字节数据
void uart_send_byte(unsigned char dat) {  
    SBUF = dat;  
    while(TI == 0);  
    TI = 0;  
}

这里设置定时器1为波特率发生器,选择合适的工作模式和初值来确定波特率。发送数据时,将数据放入SBUF寄存器,等待发送完成标志位TI置位后清0。

五、多种单片机的可替换性

这个仿真很有意思的一点是,它并不局限于某一种单片机。可以更换为STM32单片机、MSP430单片机、PIC单片机、AVR单片机等。虽然不同单片机的寄存器、指令集等有差异,但实现这些功能的原理是相似的。比如在STM32上实现LCD12864显示,可能会用到GPIO口复用等功能,代码风格和51单片机就有很大不同,但逻辑上还是控制引脚输出高低电平来实现数据和命令的传输。

单片机密码锁程序设计仿真 1、LCD12864液晶显示 2、4*4矩阵键盘输入 3、24C08存储原始密码 4、串口信息输出 本仿真可更换为STM32单片机,MSP430单片机,PIC单片机,AVR单片机等。 资料中含有keil程序、AD原理图,器件手册,使用说明,演示视频等

最后,资料里还含有keil程序、AD原理图,器件手册,使用说明,演示视频等。无论是新手想学习单片机项目开发,还是老手想快速搭建一个实用的密码锁系统,这些资料都能提供很大帮助。感兴趣的小伙伴不妨深入研究研究,搞不好能做出一个超酷炫实用的密码锁呢!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐