用8051单片机模拟密码锁,设计程序。假设密码为“12AB”,输入 4 位密码后,若输入正确,则 数码管显示“P”;若输入错误,则数码管显示“E”,表示密码错误。在系统不断电情况下, 密码锁在上次开锁或者输入密码错误之后,能继续工作。
时间: 2024-05-09 12:19:27 浏览: 53
以下是8051单片机模拟密码锁的程序设计:
```
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar code password[4] = {'1', '2', 'A', 'B'}; //定义密码为“12AB”
uchar key, pwd[4], i, j, flag;
void delay(uint z) //延时函数
{
uint x, y;
for(x = z; x > 0; x--)
for(y = 114; y > 0; y--);
}
void key_scan() //按键扫描函数
{
key = 0xff;
if(P2 != 0xff)
{
delay(10);
if(P2 != 0xff)
{
key = P2;
while(P2 != 0xff);
}
}
}
void display(uchar n) //数码管显示函数
{
switch(n)
{
case 0: P0 = 0xc0; break;
case 1: P0 = 0xf9; break;
case 2: P0 = 0xa4; break;
case 3: P0 = 0xb0; break;
case 4: P0 = 0x99; break;
case 5: P0 = 0x92; break;
case 6: P0 = 0x82; break;
case 7: P0 = 0xf8; break;
case 8: P0 = 0x80; break;
case 9: P0 = 0x90; break;
case 10: P0 = 0x88; break;
case 11: P0 = 0x83; break;
case 12: P0 = 0xc6; break;
case 13: P0 = 0xa1; break;
case 14: P0 = 0x86; break;
case 15: P0 = 0x8e; break;
case 16: P0 = 0xbf; break;
}
}
void main() //主函数
{
while(1)
{
key_scan(); //按键扫描
if(key != 0xff) //如果有按键按下
{
if(key == '#') //如果按下的是“#”键
{
flag = 1; //标志位置一,表示输入完成
for(i = 0; i < 4; i++)
{
if(pwd[i] != password[i]) //如果输入的密码不正确
{
P0 = 0x86; //数码管显示“E”,表示密码错误
delay(1000); //延时1秒
P0 = 0xff; //清空数码管
break; //跳出循环
}
}
if(i == 4) //如果输入的密码正确
{
P0 = 0xcf; //数码管显示“P”,表示密码正确
delay(1000); //延时1秒
P0 = 0xff; //清空数码管
}
for(i = 0; i < 4; i++) //清空密码数组
pwd[i] = 0;
j = 0; //重置密码数组下标
}
else if(key == '*') //如果按下的是“*”键
{
for(i = 0; i < 4; i++) //清空密码数组
pwd[i] = 0;
j = 0; //重置密码数组下标
}
else if(j < 4) //如果密码数组下标小于4
{
pwd[j++] = key; //将按下的键值存入密码数组中
display(key); //数码管显示按下的键值
}
}
if(flag == 0) //如果输入未完成
display(j); //数码管显示当前输入的密码位数
}
}
```
程序说明:
1. 定义了密码为“12AB”,存储在数组`password`中。
2. 定义了按键扫描函数`key_scan()`,在其中通过延时函数`delay()`进行按键消抖,然后读取P2口的值,判断是否有按键按下,如果有则将按下的键值存入变量`key`中。
3. 定义了数码管显示函数`display()`,根据输入的参数值,在数码管上显示对应的数字或字母。
4. 在主函数`main()`中,不断调用按键扫描函数`key_scan()`,根据读取到的按键值进行相应的处理。如果按下的是数字键,则将该键值存入密码数组`pwd`中,并在数码管上显示对应的数字;如果按下的是“#”键,则表示输入完成,将标志位`flag`置为1,然后将输入的密码与正确密码进行比较,如果输入正确则在数码管上显示“P”,表示密码正确,否则在数码管上显示“E”,表示密码错误;如果按下的是“*”键,则表示需要重新输入密码,清空密码数组`pwd`;如果标志位`flag`为0,则表示输入未完成,数码管显示当前输入的密码位数。
阅读全文