您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机综合实训二-密码锁的设计
1/23密码锁的设计报告一、设计内容:用4*3的键盘组成0~9的数字键及确认键、删除键;用8位数码管组成显示电路提示信息,当输入密码时,只显示“—”,当密码位数输入完毕按下确认键时,对输入的密码和设定的初始密码进行比较,若密码正确,则开锁,此时P3.0口的LED(即黄灯)亮一秒作为提示;若密码不正确,禁止输入3秒种,同时发出报警声。初始密码为8位。增加功能:利用外部中断0和1分别实现复位和密码修改功能,说明见原理图参考器件:89C51,RES,CAP,CAP-ELEC,CRYSTAL,LED-YELLOW,7SEG-MPX8-CC-BLUE,SOUNDER,BUTTON,74LS245二、原理图:2/23三、流程图:KEY_CNT值减1显示数码管个数减1改变KEY_VAL值是是是是是是是否否KEY_CNT值加1显示数码管个数加1显示横杆存储KEY_VALKEY_CNT值加1显示数码管个数加1显示横杆存储KEY_VALCLR?ENTER?KEY_CNT值加1显示数码管个数加1显示横杆存储KEY_VAL密码正确?亮灯延时1S发出警报延时3S是是第2列?第1列?第3列?第4列?否开始设置按键序号初值为0置表首地址送DPTR设置标志位R7初值为0设置初始密码为67890123设置P1高4位为输入是否有低电平是否为有效按键否是第1行?第2行?第3行?是是否否否开外部中断0和总中断说明:外部中断0和1是复位和修改密码,由于篇幅不够,在此没有画出密码修改和复位的流程图3/23四、实物图:五、源程序LINE_NOEQU20H;行号ROW_NOEQU31H;列号LINEinitialKEYVALEQU30H;行初始键值KEY_VALEQU32H是是4/23KEY_CNTEQU33H;数字按键的序号,如按键541,这时KEYORDER=3BIT_SELEQU34HFLAGBIT00H;初始密码存储区LED_BIT1EQU41HLED_BIT2EQU42HLED_BIT3EQU43HLED_BIT4EQU44HLED_BIT5EQU45HLED_BIT6EQU46HLED_BIT7EQU47HLED_BIT8EQU48H;输入密码存储区PASSWD1EQU51HPASSWD2EQU52HPASSWD3EQU53HPASSWD4EQU54HPASSWD5EQU55HPASSWD6EQU56HPASSWD7EQU57HPASSWD8EQU58H5/23ORG0000HLJMPSTARTORG0003HLJMPINTT0;中断处理,实现复位功能,清楚所有的有关操作ORG0013HLJMPINTT1ORG0040HSTART:MOVSP,#70HMOVP0,#0FFHMOVA,#0FFHMOVR0,#00HMOVR7,#0MOVBIT_SEL,#0;显示数码管的位数初始为0MOVKEY_CNT,#0;按键序号初始为0MOVDPTR,#TAB;设置初始密码MOVLED_BIT1,#6MOVLED_BIT2,#7MOVLED_BIT3,#8MOVLED_BIT4,#9MOVLED_BIT5,#06/23MOVLED_BIT6,#1MOVLED_BIT7,#2MOVLED_BIT8,#3MAIN:SETBEX0SETBIT0SETBEA;开中断总允许SETBPX0MOVP1,#0F0H;设置P1高4位(行线)输入状态MOVA,P1CJNEA,#0F0H,M;P1高4位(行线)有低电平,转M进一步判断是按键还是抖动SJMPMAIN;P1高4位(行线)无低电平,转MAIN继续监控M:ACALLDELAY;P1高4位(行线)有低电平,去抖延时MOVP1,#0F0H;设置P1高4位(行线)输入状态,已经延时,准备再读MOVA,P1CJNEA,#0F0H,MM;再读P1高4位(行线),仍有低电平,确认是按键,转MMSJMPMAIN;再读P1高4位(行线),无低电平,表示抖动,非有效按键,;转MAIN继续监控7/23MM:MOVLINE_NO,A;P1高4位(行线)低电平持续时间符合按键要求,有效按键,;保存行号到LINE_NOMOVP1,#0FH;设置P1低4位(列线)输入状态MOVROW_NO,P1;保存列号到ROW_NOMMM:MOVP1,#0F0H;设置P1高4位(行线)输入状态MOVA,P1CJNEA,#0F0H,MMM;读出P1高4位(行线)是否低电平(未松开键)?;未松开转MMM,继续监控松开否。;P1高4位(行线)有低电平,表明按键松开,;完成一次按键动作,执行下面语句JNBLINE_NO.4,E1;LINE_NO.4!=1第1行有按键,转E1,;否则第1行无按键,执行下面语句,判断其他行有按键否JNBLINE_NO.5,E2;LINE_NO.5!=1第2行有按键,转E2,;否则第1、2行无按键,执行下面语句,判断其他行有按键否JNBLINE_NO.6,E3;LINE_NO.6!=1第3行有按键,转E3,8/23LJMPMAIN;否则无按键,转MAIN重新监控E1:MOVLINEinitialKEYVAL,#0;第1行有按键,该行键初值(30H内容)为0LJMPKEYVAL;转KEYVAL,求按键号E2:MOVLINEinitialKEYVAL,#4;第2行有按键,该行键初值(30H内容)为4LJMPKEYVAL;转KEYVAL,求按键号E3:MOVLINEinitialKEYVAL,#8;第3行有按键,该行键初值(30H内容)为8MOVA,ROW_NO;将31H单元内容-列号取出JNBACC.0,D31;第3行第1列按键,转D31,JNBACC.1,D32;第3行第2列按键,转D32JNBACC.2,D33;第3行第3列按键,转D33JNBACC.3,D34;第3行第4列按键,转D34D31:MOVR0,KEY_CNTINCR0MOVKEY_CNT,R0;按键序号KEY_CNT增1MOVA,KEY_CNT;按键序号超过9个不做处理SUBBA,#099/23JZNEXT1INCBIT_SELMOVA,BIT_SELMOVCA,@A+DPTRMOVP2,A;选择要显示的数码管;MOVBIT_SEL,A;数码管位号BIT_SEL左移1位MOVA,#0ADDA,LINEinitialKEYVALMOVKEY_VAL,A;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码MOVA,#0BFHMOVP0,AMOVP1,#0F0HACALLPASSWDLJMPMAIND32:MOVR0,KEY_CNTINCR0MOVKEY_CNT,R0;按键序号KEY_CNT增1MOVA,KEY_CNT;按键序号超过9个不做处理SUBBA,#09JZNEXT110/23INCBIT_SELMOVA,BIT_SELMOVCA,@A+DPTRMOVP2,A;选择要显示的数码管;MOVBIT_SEL,A;数码管位号BIT_SEL左移1位MOVA,#1ADDA,LINEinitialKEYVALMOVKEY_VAL,A;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码MOVA,#0BFHMOVP0,AMOVP1,#0F0HACALLPASSWDLJMPMAIND33:MOVA,KEY_CNTJZD331;无输入数字按键时进行清除的处理MOVA,KEY_VALCLRA;清楚原来输入的按键值MOVKEY_VAL,AACALLPASSWD;调用密码存储子程序对当前操作进行存11/23储DECKEY_CNTDECBIT_SELD331:MOVA,KEY_CNTMOVCA,@A+DPTRMOVP2,A;选择要显示的数码管MOVA,#0BFHMOVP0,AMOVP1,#0F0HLJMPMAINNEXT1:MOVKEY_CNT,#08LJMPPWN_SOUND;超过8个按键时的警告D34:MOVA,R7JNZBIT0MOVA,LED_BIT1;初始密码CJNEA,PASSWD1,PWN_SOUND;初始密码与输入密码进行比较MOVA,LED_BIT2CJNEA,PASSWD2,PWN_SOUNDMOVA,LED_BIT3CJNEA,PASSWD3,PWN_SOUND12/23MOVA,LED_BIT4CJNEA,PASSWD4,PWN_SOUNDMOVA,LED_BIT5CJNEA,PASSWD5,PWN_SOUNDMOVA,LED_BIT6CJNEA,PASSWD6,PWN_SOUNDMOVA,LED_BIT7CJNEA,PASSWD7,PWN_SOUNDMOVA,LED_BIT8CJNEA,PASSWD8,PWN_SOUNDCLRP3.0;密码正确,LED发光二极管亮一秒作为提示ACALLDELAY1SSETBP3.0SETBEX1;开重置密码中断LJMPMAINBIT0:MOVA,KEY_CNTSUBBA,#08JNZPWN_SOUND;密码修改不是8位警报LJMPBIT_closePWN_SOUND:MOVA,R7JZSOUND13/23CLRP3.7;密码修改错误,LED发光二极管亮并报警SOUND:MOVR2,#3START1:JNBFLAG,NEXT3;flag=0报警低音声,flag=1报警高音声MOVR6,#200DV:CPLP3.5;P1.0产生200个500Hz脉冲,报警低音声LCALLDELY500LCALLDELY500DJNZR6,DVCPLFLAG;标志位取反,两种报警声音(500Hz和1KHz)交替鸣响NEXT3:MOVR6,#200DV1:CPLP3.5;P1.0产生200个1KHz脉冲,报警高音声LCALLDELY500DJNZR6,DV1CPLFLAG;标志位取反,两种报警声音(500Hz和1KHz)交替鸣响DJNZR2,NEXT4MOVA,R714/23JZNEXT5SETBP3.7NEXT5:LJMPMAINNEXT4:LJMPSTART1KEYVAL:MOVR0,KEY_CNTINCR0MOVKEY_CNT,R0;按键序号KEY_CNT增1MOVA,KEY_CNT;按键序号超过8个不做处理,为无效按键,序号仍然为8个,并返回主函数SUBBA,#09JZNEXT1INCBIT_SELMOVA,BIT_SELMOVCA,@A+DPTRMOVP2,A;选择要显示的数码管;MOVBIT_SEL,A;数码管位号BIT_SEL左移1位MOVA,ROW_NO;将31H单元内容-列号取出JNBACC.0,D1;第1列按键,转D1JNBACC.1,D2;第2列按键,转D2JNBACC.2,D3;第3列按键,转D3JNBACC.3,D4;第4列按键,转D415/23D1:MOVA,#0ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为0)MOVKEY_VAL,A;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码MOVA,#0BFHMOVP0,AMOVP1,#0F0HACALLPASSWDLJMPMAIND2:MOVA,#1ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为1)MOVKEY_VAL,A;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码MOVA,#0BFHMOVP0,AMOVP1,#0F0HACALLPASSWDLJMPMAIN16/23D3:MOVA,#2ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为2)MOVKEY_VAL,A;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码MOVA,#0BFHMOVP0,AMOVP1,#0F0HACALLPASSWDLJMPMAIND4:MOVA,#3ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为3)MOVKEY_VAL,A;MOVCA,@A+
本文标题:单片机综合实训二-密码锁的设计
链接地址:https://www.777doc.com/doc-1901727 .html