2026/4/6 7:57:18
网站建设
项目流程
大庆市建设局网站上不去,什么是电商?电商怎么做,网页设计如何换行,网站建设商标在哪个类别C51电子密码锁Proteus仿真
以AT89C51为主控芯片#xff0c;LCD1602为显示屏设计密码为全数字的电子号码锁。
功能#xff1a;
(1)硬件部分#xff1a;设计单片机外围电路、LCD显示电路、键盘电路等。
(2)软件部分#xff1a;开锁、上锁、重新输入密码、设置新密码、保存新密…C51电子密码锁Proteus仿真 以AT89C51为主控芯片LCD1602为显示屏设计密码为全数字的电子号码锁。 功能 (1)硬件部分设计单片机外围电路、LCD显示电路、键盘电路等。 (2)软件部分开锁、上锁、重新输入密码、设置新密码、保存新密码功能开锁成功时指示灯点亮按键时发出“滴”声。 (3)附加功能实现IIC总线的AT24C02保存密码实现系统掉电后密码不丢失。 使用软件为Keil V4、Proteus 7硬件设计上AT89C51的P1口接4x4矩阵键盘P0驱动LCD1602。注意P0必须接上拉电阻不然显示会鬼畜。密码存储用的AT24C02挂在P2.0和P2.1这两个脚需要模拟I²C时序。Proteus里的24C02有个隐藏设定——仿真时首次运行必须手动写入初始值否则读出来全是FF这个坑我当年足足卡了两天。键盘扫描的核心代码长这样uchar KeyScan() { uchar key_value 0; P1 0x0f; if((P1 0x0f) ! 0x0f) { DelayMs(10); // 消抖 switch(P1 0x0f) { case 0x0e: key_value 1; break; case 0x0d: key_value 4; break; // ...其他行扫描 } P1 0xf0; switch(P1 0xf0) { case 0xe0: key_value 0; break; case 0xd0: key_value 1; // ...列扫描 } while((P1 0xf0) ! 0xf0); // 等待松手 } return key_value; }这里有个骚操作用行列两次扫描合成键值。注意while松手检测必须加否则快速连按会出灵异事件。密码存储部分最考验耐心。24C02的写周期需要延时约10ms仿真时可以用while检测ACKvoid EEPROM_Write(uchar addr, uchar dat) { I2C_Start(); I2C_SendByte(0xA0); I2C_WaitAck(); I2C_SendByte(addr); I2C_WaitAck(); I2C_SendByte(dat); I2C_WaitAck(); I2C_Stop(); DelayMs(10); // 必须的写入等待 }实测发现Proteus对I²C时序宽容度极低SCL下降沿后数据变化必须严格符合时序图否则直接摆烂不响应。LCD显示最烦人的是初始化顺序。有一次我把延时从40ms改成30ms屏幕直接显示乱码。后来发现1602的初始化必须严格按照void LCD_Init() { DelayMs(40); // 上电等待 Write_Cmd(0x38); // 8位总线双行显示 DelayMs(5); Write_Cmd(0x0C); // 开显示关光标 DelayMs(5); Write_Cmd(0x06); // 输入后光标右移 Write_Cmd(0x01); // 清屏 }这些延时一个都不能少否则仿真时可能正常烧录实物就翻车。当密码输入正确时P3.7口驱动的LED会亮起同时P2.6连接的蜂鸣器发出滴声。这里有个细节蜂鸣器驱动代码要写成阻塞式否则声音还没响完就被后续代码打断了void Beep() { BEEP 0; // 低电平触发 DelayMs(100); // 响100ms BEEP 1; // 停止 }最后说说密码验证逻辑——必须把输入缓存和存储密码逐位比对一旦某位不符立即跳出循环。千万别用字符串比较函数因为实际可能存在\0结尾问题。调通整个系统那晚看着仿真界面的LED如期亮起恍惚间又回到了大学实验室。那些时序调不通的暴躁、第一次成功存储密码的兴奋或许就是嵌入式开发的独特浪漫吧。完整代码已上传Github假装有链接需要自取。下期可能会扒一扒用状态机重构这个项目的黑历史敬请期待才不是挖新坑呢。