1、单片机课程设计多功能密码锁任务及设计要求1.设计一多位电子密码锁,输入密码用“F”表示,输入密码正确,绿灯亮(或显示其它标志、蜂鸣器替代),输入密码错误,红灯亮(或显示其它标志、蜂鸣器替代).2.具有确定键和取消键,在未确定之前可以取消,重新输入.3.连续输入三次错误密码,红灯闪烁,报警电路动作,键盘锁定.4.具有密码重置、修改功能.5.具有密码输入等待操作时间限制功能,超过限定时间报警.6.显示北京时间,时间可调整.7.可利用蜂鸣器添加提示音.系统原理框图硬件原理图元件清单元件数量元件数量ADUC848芯片01片三极管若干按键18个MAX23201片8段数码管05位二极管若干AT24C080
2、1片下载线01根蜂鸣器01个电源线01根电阻若干开关01个电容若干硬件原理图仿真用原理图由于元件库缺少ADUC848,故使用了STC89C51代替仿真,因为端口两个芯片的P1口输入输出的设置不同,在仿真中修改了键盘扫描函数,以适用STC89C51的仿真.电源模块原理图有如下3种供电方式: 1/5V电源适配器供电(开关往上拨、插针1下面两脚接跳线帽).2/712V电源适配器供电(开关往上拨、插针1上面两脚接跳线帽).3/USB供电(开关往下拨).RS232串口连接原理图该模块中采用maxin公司的max232作电平转换,接上串口转换下载线就可以从计算机上下载程序了.数码管显示模块原理 本开发板采
3、用共阴极数码管,段码由PNP三极管驱动,位码由NPN型三极管驱动.本设计中使用了低5位的数码管.蜂鸣器原理图本设计中采用无源电磁式蜂鸣器,蜂鸣器由PWM1(P2.6)控制.PWM1为片内PWM模块的输出.蜂鸣器的驱动采用普通NPN三极管.按键输入模块原理图由于P1口(用于行扫描)内部无上拉电阻,为使无键按下时行信号为高电平,故将行信号接上拉电阻,电阻大小10K即可.P2.0P2.3为4X4矩阵式键盘列扫描信号.程序主要程序流程图程序#include #include/*类型定义*/#define uint unsigned int#define uchar unsigned char /*状态
4、定义*/#define opened 0#define new1 15#define new2 16#define succed 5#define fanin 10#define null 11#define error 12#define different 13#define tover 14/*按键定义*/#define enter 10#define back 11#define trevise 12#define revise 13#define cancel 14#define vain 15#define off 16#define end 17#define finish 18
5、/*函数声明*/void p_base();void p_revise();void p_new1();void p_new2();void p_trevise(); void p_show(); uchar p_scan();void p_record();void p_delay(uint f_n);void p_state(uchar f_s);uchar p_compare(uchar *f_k1,uchar *f_k2);void p_copy(uchar *f_s,uchar *f_k);void p_rsave();void p_wsave();void p_rtime();vo
6、id p_stime();void p_start(); void p_stop(); bit p_rack();void p_nack(); uchar rbyte(); void p_wbyte(uchar f_b);uchar p_rdata(uchar f_a);void p_wdata(uchar f_a,uchar f_d);/*I/O口定义*/sbit p00=P00;sbit p10=P10;sbit p11=P11;sbit p12=P12;sbit p13=P13;sbit p14=P14;sbit p15=P15;sbit p16=P16;sbit p17=P17;sbi
7、t p20=P20;sbit p21=P21;sbit p22=P22;sbit p23=P23;sbit p24=P24;sbit p25=P25;sbit p26=P26;sbit p27=P27;sbit p30=P30;sbit p31=P31;sbit p32=P32;sbit p33=P33;sbit p34=P34;sbit p35=P35;sbit p36=P36;sbit p37=P37;/*全局变量定义*/uchar bot,key19,key29,save9,stime4,s,min,h,mino,mint,ho,ht,n1=1,n2=1,lock,minu,sign,t
8、ov,state,n,sound,point=1,ts, flash=7,bright33=1,bright35=1,bright36=1,bright37=1; showlist=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x71,0xff,0x21,0x85,0xe1,0x7f,0x7d;uint ms;/*主函数*/void main() EA=1; ET0=1; TMOD=0x11; TH0=0xf9; TL0=0xdb; TR0=1; I2CCON=0xe8; sound=0; tov=1; P1=0x00; p_rsave(
9、); sign=p_rdata(40); if(sign!=1) p_new1(); p_base(); /*基础解锁函数*/void p_base() n=0; state=fanin; while(1) if(n=0) state=fanin; else state=n; bot=p_scan(); if(n!=0&tov=0) p_state(tover); main(); switch(bot) case vain: break; case enter: key1n=end; if(p_compare(key1,save) p_state(succed); lock=0; point=
10、1; state=opened; opened while(1) bot=p_scan(); switch(bot) case off: main(); break; case back: while(1) bot=p_scan(); switch(bot) case off: main(); break; case enter: p_wdata(40,0); main(); break; else p_state(error); p_record(); main(); break; case cancel: main(); break; case back: if(n!=0) key1n-=
11、end; break; case revise: p_revise(); break; case trevise: p_trevise(); break; default: if(n+1=9) p_state(error); main(); key1n+=bot; /*密码修改函数*/void p_revise() n=0; p_state(fanin); state=fanin; while(1) if(n=0) state=fanin; else state=n; bot=p_scan(); if(tov=0) p_state(tover); main(); switch(bot) cas
12、e vain: break; case enter: key1n=end; if(p_compare(key1,save) lock=0; point=1; p_state(succed); p_new1(); else p_state(error); p_record(); main(); break; case cancel: main(); break; case back: if(n!=0) key1n-=end; break; case revise: p_revise(); case off: break; case trevise: p_trevise(); break; def
13、ault: if(n+1=9) p_state(error); main(); key1n+=bot; /*新密码输入函数*/void p_new1() n=0; state=new1; while(1) if(n=0) state=new1; else state=n; if(tov=0&sign=1)|(n!=0&tov=0) p_state(tover); main(); bot=p_scan(); switch(bot) case vain: break; case enter: key1n=end; p_new2(); break; case cancel: main(); brea
14、k; case back: if(n!=0) key1n-=end; break; case revise: if(sign=1) p_revise(); break; case trevise: p_trevise(); break; default: if(n+1=9) p_state(error); main(); key1n+=bot; void p_new2() n=0; state=new2; while(1) if(n=0) state=new2; else state=n; bot=p_scan(); if(tov=0) p_state(tover); main(); swit
15、ch(bot) case vain: break; case enter: key2n=end; if(p_compare(key1,key2) sign=1; p_copy(save,key2); lock=0; p_state(succed); p_wsave(); p_wdata(40,1); main(); else p_state(different); main(); break; case cancel: main(); break; case back: if(n!=0) key2n-=end; break; case revise: if(sign=1) p_revise()
16、; break; case off: break; case trevise: p_trevise(); break; default: if(n+1=9) p_state(error); main(); key2n+=bot; /*键盘扫描函数*/ uchar p_scan() uchar f_s=vain; P2=P2&0xf0; if(P1!=0xff) p_delay(10); if(P1!=0xff) tov=1; P2=P2&0xf0; P2=P2|0x07; switch(P1) case 0xfe:f_s=1;break; case 0xfd:f_s=4;break; case
17、 0xfb:f_s=7;break; case 0xf7:f_s=back;break; while(P1!=0xff) sound=1; sound=0; P2=P2&0xf0; P2=P2|0x0b; switch(P1) case 0xfe:f_s=2;break; case 0xfd:f_s=5;break; case 0xfb:f_s=8;break; case 0xf7:f_s=0;break; while(P1!=0xff) sound=1; sound=0; P2=P2&0xf0; P2=P2|0x0d; switch(P1) case 0xfe:f_s=3;break; ca
18、se 0xfd:f_s=6;break; case 0xfb:f_s=9;break; case 0xf7:f_s=enter;break; while(P1!=0xff) sound=1; sound=0; P2=P2&0xf0; P2=P2|0x0e; switch(P1) case 0xfe:f_s=cancel;break; case 0xfd:f_s=off;break; case 0xfb:f_s=revise;break; case 0xf7:f_s=trevise;break; while(P1!=0xff) sound=1; sound=0; p_delay(10); return f_s; /*1毫秒中断函数.数码管显示函数*/void time() interrupt 1 TH0=0xf9; TL0=0xdb; TR0=1; ms+; ms=ms%1000; p_show(); if(sound) p26=!p26; if(ms=0) ts=!ts; tov+; tov=tov%11; s+; s=s%60; if(s=0) minu
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1