单片机密码锁长一点的代码,密码正确蜂鸣器响,密码错误LED灯亮
时间: 2024-03-11 12:47:37 浏览: 64
好的,这里提供一份稍微长一点的代码,同样采用AT89C51单片机:
```c
#include <reg51.h>
#define PASSWORD "123456" // 设置密码
#define PASSWORD_LENGTH 6 // 密码长度
sbit beep = P1^0; // 蜂鸣器输出引脚
sbit led = P1^1; // LED输出引脚
void delay(unsigned int t) // 延时函数,单位为毫秒
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void init_uart() // 初始化串口
{
SCON = 0x50; // 8位数据,无校验位,1个停止位,允许接收
TMOD = 0x20; // 定时器1工作在模式2,用于波特率发生器
TH1 = 0xfd; // 波特率为9600,晶振12MHz
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
}
unsigned char getchar() // 从串口接收一个字符
{
while (!RI); // 等待接收完成
RI = 0; // 接收标志位清零
return SBUF; // 返回接收到的数据
}
void putchar(unsigned char c) // 发送一个字符到串口
{
SBUF = c; // 将要发送的数据存入SBUF寄存器
while (!TI); // 等待发送完成
TI = 0; // 发送标志位清零
}
void send_string(unsigned char *str) // 发送一个字符串到串口
{
while (*str)
putchar(*str++);
}
void main()
{
unsigned char input[PASSWORD_LENGTH]; // 存储输入的密码
unsigned char i = 0; // 输入密码的计数器
unsigned char c; // 用于存储从串口接收到的字符
init_uart(); // 初始化串口
while (1)
{
c = getchar(); // 从串口接收一个字符
if (c == '\r') // 如果接收到回车符
{
if (i == PASSWORD_LENGTH && !strncmp(input, PASSWORD, PASSWORD_LENGTH)) // 如果输入的密码正确
{
send_string("Password correct!\n\r"); // 发送提示信息
beep = 1; // 蜂鸣器响
delay(100); // 延时100ms
beep = 0; // 蜂鸣器停止响
i = 0; // 计数器清零
}
else // 如果输入的密码错误
{
send_string("Password error!\n\r"); // 发送提示信息
led = 1; // LED灯亮
delay(1000); // 延时1s
led = 0; // LED灯灭
i = 0; // 计数器清零
}
}
else if (c >= '0' && c <= '9' && i < PASSWORD_LENGTH) // 如果接收到数字字符并且密码还没有输入完
{
input[i++] = c; // 存储输入的密码
}
}
}
```
这个代码在基本功能上与前面的代码相同,不同的是增加了串口通信功能,可以通过串口发送提示信息。另外,这个代码使用波特率发生器实现串口通信,波特率为9600。你可以根据需要修改密码、密码长度、输出引脚、波特率等参数。
阅读全文