指纹密码锁51

前言:MCU通过轮询不停获取矩阵键盘和指纹模块的数据(由于51资源受限,32的可以将键盘做成中断模式),获取数据进行校验控制舵机打角,蜂鸣器报警;

一 硬件

1.MCU STC12C5A60S2单片机,引脚与89c52基本通用

2. 4X4矩阵键盘

3. AS608指纹模块

4. 蜂鸣器

5.sg90 舵机

6.oled显示屏 (用的软件模拟IIC,可以换成SPI)

具体外设如何使用就不具体讲解了,例如矩阵键盘的扫描,舵机打角控制,同学们可以搜索其他文章了解。

二 程序结构

启动 -- 定时器,串口,蜂鸣器等外设初始化 -- 显示屏显示固定汉字 --  读取密码 -- while(1)循环

在循环内切换指纹模式和键盘模式

timer.c

#include "reg52.h"
#include "timer.h"

sfr AUXR  = 0x8e;         
sfr S2CON = 0x9a;        
sfr S2BUF = 0x9b;        
sfr BRT   = 0x9c;           
sfr IE2   = 0xaf; 
sbit SG_PWM=P2^2;



unsigned char count=0;
unsigned char PWM_count;

extern unsigned char PWM;
void Timer_Init()
{
    TMOD=0x21;      
    TH0=0Xfe;
    TL0=0X33;	
    ET0=1;         
    TR0=1; 	
	EA=1;          
}
void Timer() interrupt 1      
{
	PWM_count=PWM;
	TR0=0;
	TH0=0Xfe;
	TL0=0X33;       
	if(count<=PWM_count)
	{
		SG_PWM=1;
	}
		else
		{
			SG_PWM=0;
		}
	count++;
	if(count>=40)
	{
		count=0;
	}
	TR0=1;
}

key.c

#include "reg52.H"
#include "delay.h"
#include "oled.h"
#include "beep.h"
#include "as608.h"
#include "eeprom.h"
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;

unsigned char i=0,j=0,flag=1;
unsigned int passward[4];
unsigned int setward[4];
unsigned int setward[4]={0,1,2,3};
 unsigned char PWM;
 unsigned char keynumber;
unsigned char key_num(void)
{	
	unsigned char number=16;
	P1=0xff;
	P1_0=0;
	while(P1_7==0){delay(20);number=15;}//0
	while(P1_6==0){delay(20);number=14;}//1
	while(P1_5==0){delay(20);number=13;}//2
	while(P1_4==0){delay(20);number=12;}//3
	
	P1=0xff;
	P1_1=0;
	while(P1_7==0){delay(20);number=11;}//4
	while(P1_6==0){delay(20);number=10;}//5
	while(P1_5==0){delay(20);number=9;}//6
	while(P1_4==0){delay(20);number=8;}//7
	
	P1=0xff;
	P1_2=0;
	while(P1_7==0){delay(20);number=7;}//8
	while(P1_6==0){delay(20);number=6;}//9
	while(P1_5==0){delay(20);number=5;}//È·¶¨
	while(P1_4==0){delay(20);number=4;}//È¡Ïû
	
	P1=0xff;
	P1_3=0;
	while(P1_7==0){delay(20);number=3;}//ÉèÖÃ
	while(P1_6==0){delay(20);number=2;}//
	while(P1_5==0){delay(20);number=1;}//
	while(P1_4==0){delay(20);number=0;}//
	
return number;
}

void display(void)
{
	
	keynumber=key_num();
	if(keynumber<=9)//ÊäÈëÊý×Ö0-9²¢ÏÔʾ
	{
		switch(i)
		{
			case 0:passward[0]=keynumber;i++;OLED_ShowNum(90,0,passward[0],1,16);break;
			case 1:passward[1]=keynumber;i++;OLED_ShowNum(100,0,passward[1],1,16);break;
			case 2:passward[2]=keynumber;i++;OLED_ShowNum(110,0,passward[2],1,16);break;
			case 3:passward[3]=keynumber;i=0;OLED_ShowNum(120,0,passward[3],1,16);break;
			default:break;
		}	
	}

	if(keynumber==11)//È¡ÏûÊäÈë
	{
		i=0;
		passward[0]=0;
		passward[1]=0;
		passward[2]=0;
		passward[3]=0;
		OLED_ShowString(80,0,"     ",16);
	}	
	
	if(keynumber==10)//È·ÈÏ
	{					//4λÊý×ÖÕýÈ·
		if(passward[0]==setward[0] && passward[1]==setward[1] && passward[2]==setward[2] && passward[3]==setward[3] )
		{	
			i=0;
			OLED_ShowString(90,0,"     ",16);
			OLED_ShowChinese(0,2,5,16);//»¶
			OLED_ShowChinese(18,2,6,16);//Ó­
			OLED_ShowChinese(36,2,7,16);//ȯ
			OLED_ShowChinese(54,2,8,16);//¼Ò
			OLED_ShowChinese(72,2,13,16);//£¡
			beep_ms(200);
			PWM=3;
			delay(1000);
			PWM=1;
		}
		else///ÏÔʾÃÜÂë´íÎó
		{
			i=0;
			passward[0]=0;
			passward[2]=0;
			passward[3]=0;
			passward[1]=0;
			OLED_ShowString(90,0,"     ",16);
			OLED_ShowChinese(0,2,9,16);//ÃÜ
			OLED_ShowChinese(18,2,10,16);//Âë
			OLED_ShowChinese(36,2,11,16);//´í
			OLED_ShowChinese(54,2,12,16);//Îó
			OLED_ShowChinese(72,2,13,16);//£¡
			PWM=1;			
		}
	}
	if(keynumber==12)//ÉèÖÃÐÞ¸ÄÃÜÂë
	{ 	
		
		//ÃÜÂëÕýÈ·²Å¿ÉÐ޸쬷ñÔòÏÔʾ´ÓÐÂÊäÈë
		if(passward[0]==setward[0] && passward[1]==setward[1] && passward[2]==setward[2] && passward[3]==setward[3] )
		{
		OLED_ShowString(90,0,"     ",16);
		OLED_ShowChinese(0,2,14,16);//ÐÞ
		OLED_ShowChinese(18,2,15,16);//¸Ä
		OLED_ShowChinese(36,2,16,16);//ÃÜ
		OLED_ShowChinese(54,2,17,16);//Âë
		while(flag)//½øÈëÐ޸ģ¬FLAGÖµÒ»Í˳ö
		{
			keynumber=key_num();//¶ÁÈ¡°´¼ü
			if(keynumber<=9)    ///Êý×ÖÊäÈë
			{
				switch(j)
				{
					case 0:passward[0]=keynumber;j++;OLED_ShowNum(90,0,passward[0],1,16);break;
					case 1:passward[1]=keynumber;j++;OLED_ShowNum(100,0,passward[1],1,16);break;
					case 2:passward[2]=keynumber;j++;OLED_ShowNum(110,0,passward[2],1,16);break;
					case 3:passward[3]=keynumber;j=0;OLED_ShowNum(120,0,passward[3],1,16);break;
					default:break;
				}			
			}
			if(keynumber==11)//È¡Ïû£¬³ÌÐòδÍ˳öwhile
			{	
				j=0;
				passward[0]=0;
				passward[2]=0;
				passward[3]=0;
				passward[1]=0;
				OLED_ShowString(90,0,"     ",16);
			}
			if(keynumber==10)//ÐÞ¸ÄÈ·ÈÏ
			{
				setward[0]=passward[0];
				setward[1]=passward[1];
				setward[2]=passward[2];
				setward[3]=passward[3];
				wite_setword(setward[0],setward[1],setward[2],setward[3]);
				OLED_ShowString(90,0,"     ",16);
				OLED_ShowChinese(0,2,14,16);//ÐÞ
				OLED_ShowChinese(18,2,15,16);//¸Ä
				OLED_ShowChinese(36,2,18,16);//³É
				OLED_ShowChinese(54,2,19,16);//¹¤
				OLED_ShowChinese(72,2,13,16);//£¡
				flag=0;		//Í˳öwhile
			}						
		}
			flag=1;//»Ö¸´±ê־λ£¬ÎªÏ´ÎÐÞ¸Ä×ö×¼±¸
	}
		else//δÊäÈëÕýÈ·ÃÜÂ룬ÎÞ·¨½øÈëÃÜÂëÐÞ¸Ä
		{
			j=0;
			passward[0]=0;
			passward[2]=0;
			passward[3]=0;
			passward[1]=0;
			OLED_ShowString(90,0,"     ",16);
			OLED_ShowChinese(0,2,20,16);//ÖØ
			OLED_ShowChinese(18,2,21,16);//ÐÂ
			OLED_ShowChinese(36,2,22,16);//Êä
			OLED_ShowChinese(54,2,23,16);//Èë
			OLED_ShowChinese(72,2,13,16);//£¡		
		}
	}
}

	
	







这个项目是本人课程设计,里面有些并不是很合理的设计,希望大家合理采纳,里面包括实验报告和原理图

链接:https://pan.baidu.com/s/1Uezh9fj9-SZ6wLMaZvndhg 
提取码:1213

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值