利用c51单片机代码完成密码锁设计。 结台AT24C16BBPROM芯片,实现简易密码锁,能够实现密码的设置与解 锁: 显示单元可选择数码管、LCD、点阵;· 备小组可在此基础上增加一些特色功能。
时间: 2024-02-26 12:58:17 浏览: 70
好的,我可以为您提供一个基于C51单片机的密码锁设计代码,供您参考。以下是代码:
```c
#include <reg51.h>
#include <intrins.h>
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0;
sbit KEY = P3^2;
sbit BEEP = P1^5;
uchar Password[4] = {0}; // 存储密码
uchar EnterPassword[4] = {0}; // 存储用户输入的密码
uchar i = 0; // 计数器
uchar j = 0; // 计数器
uchar flag = 0; // 标志位,用于判断是否输入完整密码
uchar error = 0; // 标志位,用于记录错误次数
void delay(uint t) // 延时函数
{
uint i, j;
for (i = t; i > 0; i--)
{
for (j = 114; j > 0; j--);
}
}
void Init_AT24C16BBPROM() // 初始化AT24C16BBPROM
{
uchar ACK;
I2C_Start();
ACK = I2C_SendByte(0xA0);
if (!ACK)
{
BEEP = 1;
delay(500);
BEEP = 0;
while (1);
}
I2C_SendByte(0x00);
I2C_SendByte(0x00);
I2C_Stop();
}
void Write_AT24C16BBPROM(uchar *p, uchar n) // 向AT24C16BBPROM写入数据
{
uchar i;
for (i = 0; i < n; i++)
{
I2C_Start();
I2C_SendByte(0xA0);
I2C_SendByte(i);
I2C_SendByte(p[i]);
I2C_Stop();
delay(5);
}
}
void Read_AT24C16BBPROM(uchar *p, uchar n) // 从AT24C16BBPROM读取数据
{
uchar i;
for (i = 0; i < n; i++)
{
I2C_Start();
I2C_SendByte(0xA0);
I2C_SendByte(i);
I2C_Start();
I2C_SendByte(0xA1);
p[i] = I2C_RecvByte();
I2C_Stop();
delay(5);
}
}
void InputPassword() // 输入密码
{
uchar key;
key = KEY;
if (key == 0) // 按键按下
{
delay(10);
key = KEY;
if (key == 0) // 按键仍然按下
{
while (!key) // 等待按键松开
{
LED = ~LED;
delay(10);
key = KEY;
}
delay(10);
EnterPassword[i] = j;
i++;
j = 0;
flag = 0;
}
}
else // 按键未按下
{
delay(10);
key = KEY;
if (key) // 按键未按下
{
j++;
if (j == 10) // 密码只能是0-9的数字
{
j = 0;
}
flag = 1;
}
}
}
void ShowPassword() // 显示密码
{
uchar k;
for (k = 0; k < i; k++)
{
LcdWriteData(EnterPassword[k] + 0x30);
}
}
void CheckPassword() // 校验密码
{
uchar k;
for (k = 0; k < 4; k++)
{
if (EnterPassword[k] != Password[k]) // 密码错误
{
error++;
BEEP = 1;
delay(500);
BEEP = 0;
LcdClear();
LcdWriteString("Error!");
delay(1000);
LcdClear();
break;
}
}
if (k == 4) // 密码正确
{
error = 0;
BEEP = 1;
delay(500);
BEEP = 0;
LcdClear();
LcdWriteString("Welcome!");
delay(1000);
LcdClear();
}
}
void main()
{
Init_AT24C16BBPROM();
Read_AT24C16BBPROM(Password, 4);
LcdInit();
LcdClear();
LcdWriteString("Enter password:");
while (1)
{
InputPassword();
if (i == 4) // 输入完整密码
{
flag = 0;
ShowPassword();
CheckPassword();
i = 0;
j = 0;
}
if (flag) // 输入中
{
LcdSetCursor(0x0F);
LcdWriteData(j + 0x30);
}
if (error == 3) // 输错3次,锁死
{
LcdClear();
LcdWriteString("Locked!");
while (1);
}
}
}
```
以上是一个基于C51单片机的密码锁设计代码,该代码使用了AT24C16BBPROM芯片存储密码信息,并可以通过LCD显示密码输入和校验结果。在输入密码时,用户可以通过按键输入0-9的数字,最多输入4位密码,密码输入完成后会进行校验,如果密码正确,则会提示“Welcome!”,否则会提示“Error!”。在输入错误次数达到3次时,密码锁会被锁死。
阅读全文