题目:采用51单片机设计门禁系统,4X4键盘用户输入密码,错误蜂鸣器叫一声,正确LED闪烁,1602作为用户界面,初始显示“welcome”,按开始键,开始输入密码
#include"reg51.h"
#define key P0
typedef unsigned char u8;
typedef unsigned int u16;
sbit buzzer=P2^1;
sbit lcd_rs=P2^2;
sbit lcd_en=P2^3;
sbit led=P2^0;
sbit key1=P3^2;
u8 keyvalue=0;
u8 table[]={"WELCOME"};
u8 code table1[15]={"input password:"};
u8 num;
u8 sign=0;
u8 code smg[9]={"123456789"};
u8 code password[]={"222222"};
u8 passwordtemp[6];
u8 code correct[]={"correct"};
u8 code mistake[]={"mistake"};
void delay(u16 i)
{
u16 j;
while(i--)
for(j=0;j<115;j++);
}
void int0_init()
{
EA=1;
EX0=1;
IT0=1;
}
void lcd_write_com(u8 com)
{
lcd_rs=0;
P1=com;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void lcd_write_date(u8 date)
{
lcd_rs=1;
P1=date;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void lcd_init()
{
lcd_en=0;
lcd_write_com(0x38);
lcd_write_com(0x01);
lcd_write_com(0x0c);
lcd_write_com(0x06);
for(num=0;num<7;num++)
{
lcd_write_date(table[num]);
delay(5);
}
}
void keyscanf()
{
key=0xf0;
if(key!=0xf0)
{
delay(10);
if(key!=0xf0)
{
switch (key)
{
case 0xe0: keyvalue=1;break;
case 0xd0: keyvalue=2;break;
case 0xb0: keyvalue=3;break;
case 0x70: keyvalue=4;break;
}
key=0x0f;
if(key!=0x0f)
{
delay(10);
if(key!=0x0f)
{
switch (key)
{
case 0x0e: keyvalue=keyvalue;break;
case 0x0d: keyvalue=keyvalue+4;break;
case 0x0b: keyvalue=keyvalue+8;break;
case 0x07: keyvalue=keyvalue+12;break;
}
while(key!=0x0f);
}
}
}
}
}
void main()
{
u16 flag=1;
u16 a=0;
lcd_init();
int0_init();
while(1)
{
if(sign)
{
keyscanf();
if(keyvalue!=0)
{
if(a<6)
{
passwordtemp[a]=smg[keyvalue-1];
lcd_write_date(smg[keyvalue-1]);
a++;
keyvalue=0;
}
}
if(a==6)
{
lcd_write_com(0x80+0x40+0x05);
for(num=0;num<6;num++)
flag=flag&&(password[num]==passwordtemp[num]);
if(flag)
{
for(num=0;num<7;num++)
{
lcd_write_date(correct[num]);
delay(5);
}
led=0;
for(num=0;num<6;num++)
{
led=~led;
delay(400);
}
}
else
{
for(num=0;num<7;num++)
{
lcd_write_date(mistake[num]);
delay(3);
}
buzzer=0;
delay(400);
buzzer=1;
}
sign=0;
}
}
}
}
void int0() interrupt 0
{
if(key1==0)
{
lcd_write_com(0x01);
for(num=0;num<15;num++)
{
lcd_write_date(table1[num]);
delay(5);
}
}
delay(1000);
sign=1;
lcd_write_com(0x01);
}
仿真图
元器件
AT89C51(AT89C52)
LED
BUTTON
BUZZER
PNP
GROUND
POWER
RESPACK(RES)
LOM16L