noob的第一步——基于51单片机的指纹密码锁

本文介绍如何使用51单片机进行指纹密码锁的开发,主要聚焦在主程序的设计与实现,适合初学者入门。
摘要由CSDN通过智能技术生成

基于51单片机的指纹密码锁

主程序部分

/*头文件*/ 
#include <reg52.h>
#include <intrins.h>
#include "LCD12864.h"
#include "at24c02.h"


/*定义特殊端口,和特殊寄存器*/
#define buffer1ID 0x01
#define buffer2ID 0x02
#define confirm 0x88
#define quit 0x84
#define backspace 0x82

/*定义用户*/ 
#define user 1
void begin();

sbit B0=B^0;
sbit B7=B^7;
sbit k2=P3^7;
sbit jidianqi=P3^6;
sbit feng=P2^0;

/*定义全局变量*/
extern unsigned char times[];
unsigned char member=1,sec;
unsigned char errorcount;
unsigned char code buffer[user][6]=
{
   
	{
   "000000"}
} ;
unsigned char dz[4];
unsigned char time[4];
unsigned char password[6];
unsigned char passwordid[6]={
   1,2,3,4,5,6};

unsigned char address1=20,tempx=20;
unsigned char address2=20;

unsigned char data K;         /*K代表按下后产生的数字*/ 
unsigned char data key;       /*key代表按键电位情况*/ 

unsigned int pageid;
unsigned char data confirmcode=11;
unsigned char sum[2];
int summaf,summas;

unsigned char xdata userpassword[7]={
   0};//用来储存正确的密码
unsigned char xdata fingerprint_holder[16]={
   0};//用来储存正确的指纹

/*定义延时函数*/
void delayms(unsigned int t)
{
   
	unsigned int i,j;
	for(i=t;i>0;i--);
	for(j=110;j>0;j--);
} 
/*定义指纹脉冲相关函数*/ 
void redray_init(void);
#include "zhiwen.h"
unsigned char redray_change(unsigned char rednum);
/*第一部分-硬件功能定义*/ 
/*第一部分-第一模块
串行通信模块,对单片机串口进行初始化。*/ 
//设置串口
void UsartConfiguration()
{
   
	SCON=0x50;      //设置为工作方式1 //REN=1 允许接收 
	TMOD=0x21;      //设置计数器工作方式2 
	PCON=0x00;      //SMOD=1 波特率加倍 
	TH1=0xFD;       //计数器初始值设置,波特率9600 
	TL1=0xFD;        
	TR1=1;           //打开总中断 
	EA=1;           //打开计数器 
}

/*第一部分-第二模块
矩阵键盘模块,这里采取整体扫描。*/ 
//整体扫描
void keyboard(unsigned char key)
{
   
	if(key!=0)//倘若按下了,也就是说有m输入,m不为零 
	{
   
		switch(key)
		{
   
			case(0x11):K=1;break;
			case(0x21):K=2;break;
			case(0x41):K=3;break;
			case(0x81):K='A';break;
			case(0x12):K=4;break;
			case(0x22):K=5;break;
			case(0x42):K=6;break;
			case(0x82):K=34;break;		
			case(0x14):K=7;break;
			case(0x24):K=8;break;
			case(0x44):K=9;break;
			case(0x84):K='C';break;
			case(0x18):K='*';break;
			case(0x28):K=0;break;
			case(0x48):K=11;break;
			case(0x88):K='D';break;
			default:break;						
		}
	} 
}

unsigned char keyscan(void)
{
   
	unsigned char rowcode,colcode;
	P1=0xf0;
	if((P1&0xf0)!=0xf0)//有键按下 
	{
   
		delayms(1);//延时去按键抖动
		if((P1&0xf0)!=0xf0)//再次检测
		{
   
			rowcode=0xfe;
			while((rowcode&0x10)!=0)//逐行扫描初值 
			{
   
				P1=rowcode;//输出行扫描码
				if((P1&0xf0)!=0xf0)//本行有键按下。 
				{
   
					colcode=(P1&0xf0)|0x0f;
					while((P1&0xf0)!=0xf0)//按键释放
					return ((~rowcode)+(~colcode)); //返回键的编码 
				}
				else
				rowcode=(rowcode<<1)|0x01; //行扫描码左移一位 
			}
		} 
	}
	return 0; 
}
/*这两部分用额外的函数模块写在外部文件里面。*/ 
/*第一部分-第三模块	
LCD12864函数集成模块,采用的是并行写法。
具有显示,清除文字,清除图片等功能。*/

/*第一部分-第四模块
AT24C02芯片部分,是用作存储密码的。*/ 

/*第二部分功能实现
第二部分-第一模块:在部分库中检查密码是否正确,正确返回1,错误返回0*/
unsigned char check(unsigned char user_password)
{
   
	unsigned char flag,i,temp[6],address;
	address=user_password*10;
	for(i=0;i<6;i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值