前言: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