- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、实现原理
1、按键消抖
图3-1Βιβλιοθήκη 由图3-l可见,在按键闭合和断开时产生了多个边沿,而在实际中 每按一次键,我们只需要一组稳定的上升或下降边沿,所以对于电路中 的按键信号,如果我们不滤除抖动的话,还是简单的读取信号的边沿, 会引起一次按键被误读多次,这样就会引起电路的误动作。为了保证按 一次键电路只有一次正确的响应,即在键闭合稳定时读取键的状态,就 要求电路中必须采取滤除抖动的措施。 本设计按键较多,故采用软件方法去抖,即检测出键闭合后执行一个 延时程,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态, 如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放 后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程 序。 2、矩阵扫描电路 由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采 用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键
一、实验目的
1. 掌握嵌入式系统开发的基本流程; 2. 熟悉嵌入式系统开发仿真软件使用方法; 3. 基于89C52单片机来设计电子密码锁。
二、实验要求
1、用4*3组成0-9数字键及确认键、删除键; 2、用8位数码管组成显示电路提示信息,当输入密码时,只显 示“—”,当密码位数输入完毕按下“确定”键时,对输入的密码与设定的 密码进行比较,若密码正确,则开锁,此处用LED发光二极管亮1s作为 提示;若密码不正确,禁止按键输入3s,同时发出“嘀、嘀”报警声。
{ case(0xeb):P0=0x40;smg[x++]=num;num=8;k++;delay(200);break; case(0xdb):P0=0x40;smg[x++]=num;num=9;k++;delay(200);break; case(0xbb):P0=0x40; if((Flag==1)&(k==8)) { led=1; //correct(); delay(1000); led=0; k=0; } else { beep(); //error(); k=0; }break; case(0x7b):P0=0x40; k--;delay(200);Flag=1;x--;num=smg[x]; break; } } } }
四、实验步骤
1. 2. 3. 4. 熟悉Proteus软件环境; 熟悉89C52硬件环境; 编写相应处理器程序代码; 基于Proteus环境进行仿真测试。
五、程序代码
#include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar smg[16]; //数码管段显示; uchar code password[]={1,9,8,8,0,8,1,4}; char num,k,x; void display(); void key_scan(); //void correct();//密码正确数码管显示“open” //void error(); //密码错误数码管显示“error” int Flag; //与密码初值比较,正确则置‘1’ sbit fmq=P3^1; //蜂鸣器输入端 sbit led=P3^0;// 密码正确,灯亮
{ P2=0X03; if(password[5]==num) { Flag=1&Flag; } else { Flag=0; } key_scan(); } while(k==7) { P2=0x01; if(password[6]==num) { Flag=1&Flag; } else { Flag=0; } key_scan(); } while(k>=8) { P2=0X00; k=8; if(password[7]==num) { Flag=1&Flag; }
//主函数
void main() { k=0; led=0; fmq=1; x=0; while(1) { key_scan(); display(); } } //延时函数 void delay(uint i) //延时函数 { uint j; while(i--) { for(j=0;j<120;j++); } }
//显示函数
void display() { if(k==1) { P2=0x7f; if(password[0]==num) { Flag=1; } else { Flag=0; } } while(k==2) { P2=0x3f; if(password[1]==num) { Flag=1&Flag; } else { Flag=0; } key_scan(); } while(k==3) { P2=0x1f; if(password[2]==num) {
Flag=1&Flag; } else { Flag=0; } key_scan(); } while(k==4) { P2=0X0f; if(password[3]==num) { Flag=1&Flag; } else { Flag=0; } key_scan(); } while(k==5) { P2=0x07; if(password[4]==num) { Flag=1&Flag; } else { Flag=0; } key_scan(); } while(k==6)
三实现原理1按键消抖按键按下前沿抖动后沿抖动闭合稳定3l可见在按键闭合和断开时产生了多个边沿而在实际中每按一次键我们只需要一组稳定的上升或下降边沿所以对于电路中的按键信号如果我们不滤除抖动的话还是简单的读取信号的边沿会引起一次按键被误读多次这样就会引起电路的误动作
基于Proteus环境的电子密码锁设计
图3-3 复位电路原理图
4、晶振电路 AT89C51引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1按图3.4所示 方式连接。晶振、电容C2/C3及片内与非门(作为反馈、放大元件)构
成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量 有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C2、C3取值 范围在5~30pF之间。根据实际情况,本设计中采用12MHZ做系统的外部 晶振。电容取值为33pF。 图3-4 晶振电路原理图 5、报警电路 报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当 有键按下时,“叮”声,每按一下,发声一次,密码正确时,不发声直 接开锁,当密码输入错误时,单片机的P3.1引脚为低电平,三极管T3导 喇叭发出噪鸣声报警。如图3-5所示: 图3-5 报警电路原理图
位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键 盘相比,要节省很多I/O口。本设计中使用的这个3*4键盘不但能完成密 码的输入还能作特别功能键使用,比如清空显示功能等。键盘的每个按 键功能在程序设计中设置 。其大体功能(看键盘按键上的标记)及与 单片机引脚接法如图3-2所示: 图3-2 3、复位电路 单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初 始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从 第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或 者发生故障后都要复位。在复位期间(即RST为高电平期间),P0口为 高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。 地址锁存信号ALE也为高电平。根据实际情况选择如图3-3所示的复位电 路。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬 间,电容C1上的电压很小,复位下拉电阻上的电压接近电源电压,即 RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电 压小于某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证 RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。增加手动复 位按键是为了避免死机时无法可靠复位。当复位按键按下后电容C1通过 R5放电。当电容C1放电结束后,RST端的电位由R11与R15分压比决定。 由于R11<<R15 因此RST为高电平,CPU处于复位状态,松手后,电容C1 充电,RST端电位下降,CPU脱离复位状态。R11的作用在于限制按键按 下瞬间电容C1的放电电流,避免产生火花,以保护按键触电。
else { Flag=0; } key_scan(); } while(k<=0) { P2=0xff; P0=0x00; k=0; Flag=0; key_scan(); } }
1、
五、仿真测试
设置初始密码为“1,9,8,8,0,8,1,4”。当输入密码时,只显 示“—”,密码位数输入完毕,按下“确定”键,若密码正确, LED发光二 极管亮1s作为提示;若密码不正确,禁止按键输入3s,同时发出“嘀、 嘀”报警声。满足要求。
void beep()//蜂鸣器函数;
{ uint i; for(i=0;i<5;i++)//蜂鸣器响五次 { fmq=0; delay(300); fmq=1; delay(300); P2=0xff; P0=0x00; } fmq=1; }
//扫描函数 void key_scan() { uchar temp; P1=0xf0; temp=P1; if(temp!=0xf0) { delay(25); P1=0xf0; temp=P1; if(temp!=0xf0) { P1=0xfe; temp=P1; switch(temp) { case(0xee):P0=0x40;smg[x++]=num;num=0;k++;delay(200);break; case(0xde):P0=0x40;smg[x++]=num;num=1;k++;delay(200);break; case(0xbe):P0=0x40;smg[x++]=num;num=2;k++;delay(200);break; case(0x7e):P0=0x40;smg[x++]=num;num=3;k++;delay(200);break; } P1=0xfd; temp=P1; switch(temp) { case(0xed):P0=0x40;smg[x++]=num;num=4;k++;delay(200);break; case(0xdd):P0=0x40;smg[x++]=num;num=5;k++;delay(200);break; case(0xbd):P0=0x40;smg[x++]=num;num=6;k++;delay(200);break; case(0x7d):P0=0x40;smg[x++]=num;num=7;k++;delay(200);break; } P1=0xfb; temp=P1; switch(temp)