单片机组合实验四—门禁系统

题目:采用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)               //延时函数(1ms)
{
	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写入指令函数
{
	lcd_rs=0;         //RS=0 为指令模式
	P1=com;           
	delay(5);                  
	lcd_en=1;        //高脉冲
	delay(5);               
	lcd_en=0;
}

void lcd_write_date(u8 date)     //lcd写入数据函数
{
	lcd_rs=1;                    //RS=1 为数据模式
	P1=date;           
	delay(5);                  
	lcd_en=1;        //高脉冲
	delay(5);               
	lcd_en=0;
}

void lcd_init()                  //1602 初始化
{
	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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值