单片机课程设计多功能密码锁.docx

上传人:b****6 文档编号:4269656 上传时间:2022-11-28 格式:DOCX 页数:38 大小:647.81KB
下载 相关 举报
单片机课程设计多功能密码锁.docx_第1页
第1页 / 共38页
单片机课程设计多功能密码锁.docx_第2页
第2页 / 共38页
单片机课程设计多功能密码锁.docx_第3页
第3页 / 共38页
单片机课程设计多功能密码锁.docx_第4页
第4页 / 共38页
单片机课程设计多功能密码锁.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

单片机课程设计多功能密码锁.docx

《单片机课程设计多功能密码锁.docx》由会员分享,可在线阅读,更多相关《单片机课程设计多功能密码锁.docx(38页珍藏版)》请在冰豆网上搜索。

单片机课程设计多功能密码锁.docx

单片机课程设计多功能密码锁

任务及设计要求

1.设计一多位电子密码锁,输入密码用“F”表示,输入密码正确,绿灯亮(或显示其它标志、蜂鸣器替代),输入密码错误,红灯亮(或显示其它标志、蜂鸣器替代).

2.具有确定键和取消键,在未确定之前可以取消,重新输入.

3.连续输入三次错误密码,红灯闪烁,报警电路动作,键盘锁定.

4.具有密码重置、修改功能.

5.具有密码输入等待操作时间限制功能,超过限定时间报警.

6.显示北京时间,时间可调整.

7.可利用蜂鸣器添加提示音.

系统原理框图

硬件原理图

元件清单

元件

数量

元件

数量

ADUC848芯片

01片

三极管

若干

按键

18个

MAX232

01片

8段数码管

05位

二极管

若干

AT24C08

01片

下载线

01根

蜂鸣器

01个

电源线

01根

电阻

若干

开关

01个

电容

若干

硬件原理图

仿真用原理图

由于元件库缺少ADUC848,故使用了STC89C51代替仿真,因为端口两个芯片的P1口输入输出的设置不同,在仿真中修改了键盘扫描函数,以适用STC89C51的仿真.

电源模块原理图

有如下3种供电方式:

1/5V电源适配器供电(开关往上拨、插针1下面两脚接跳线帽).

2/7~12V电源适配器供电(开关往上拨、插针1上面两脚接跳线帽).

3/USB供电(开关往下拨).

RS232串口连接原理图

该模块中采用maxin公司的max232作电平转换,接上串口转换下载线就可以从计算机上下载程序了.

数码管显示模块原理

本开发板采用共阴极数码管,段码由PNP三极管驱动,位码由NPN型三极管驱动.本设计中使用了低5位的数码管.

蜂鸣器原理图

本设计中采用无源电磁式蜂鸣器,蜂鸣器由PWM1(P2.6)控制.PWM1为片内PWM模块的输出.蜂鸣器的驱动采用普通NPN三极管.

按键输入模块原理图

由于P1口(用于行扫描)内部无上拉电阻,为使无键按下时行信号为高电平,故将行信号接上拉电阻,电阻大小10K即可.

P2.0~P2.3为4X4矩阵式键盘列扫描信号.

程序

主要程序流程图

程序

#include

#include

/***********************************************************************************

类型定义

************************************************************************************/

#defineuintunsignedint

#defineucharunsignedchar

/***********************************************************************************

状态定义

************************************************************************************/

#defineopened0

#definenew115

#definenew216

#definesucced5

#definefanin10

#definenull11

#defineerror12

#definedifferent13

#definetover14

/***********************************************************************************

按键定义

************************************************************************************/

#defineenter10

#defineback11

#definetrevise12

#definerevise13

#definecancel14

#definevain15

#defineoff16

#defineend17

#definefinish18

/***********************************************************************************

函数声明

************************************************************************************/

voidp_base();

voidp_revise();

voidp_new1();

voidp_new2();

voidp_trevise();

voidp_show();

ucharp_scan();

voidp_record();

voidp_delay(uintf_n);

voidp_state(ucharf_s);

ucharp_compare(uchar*f_k1,uchar*f_k2);

voidp_copy(uchar*f_s,uchar*f_k);

voidp_rsave();

voidp_wsave();

voidp_rtime();

voidp_stime();

voidp_start();

voidp_stop();

bitp_rack();

voidp_nack();

ucharrbyte();

voidp_wbyte(ucharf_b);

ucharp_rdata(ucharf_a);

voidp_wdata(ucharf_a,ucharf_d);

/***********************************************************************************

I/O口定义

************************************************************************************/

sbitp00=P0^0;

sbitp10=P1^0;sbitp11=P1^1;sbitp12=P1^2;sbitp13=P1^3;sbitp14=P1^4;sbitp15=P1^5;sbitp16=P1^6;sbitp17=P1^7;

sbitp20=P2^0;sbitp21=P2^1;sbitp22=P2^2;sbitp23=P2^3;sbitp24=P2^4;sbitp25=P2^5;sbitp26=P2^6;sbitp27=P2^7;

sbitp30=P3^0;sbitp31=P3^1;sbitp32=P3^2;sbitp33=P3^3;sbitp34=P3^4;sbitp35=P3^5;sbitp36=P3^6;sbitp37=P3^7;

/***********************************************************************************

全局变量定义

************************************************************************************/

uchar

bot,key1[9],key2[9],save[9],stime[4],s,min,h,mino,mint,ho,ht,n1=1,n2=1,lock,minu,sign,tov,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;

/***********************************************************************************

主函数

************************************************************************************/

voidmain()

{

EA=1;

ET0=1;

TMOD=0x11;

TH0=0xf9;

TL0=0xdb;

TR0=1;

I2CCON=0xe8;

sound=0;

tov=1;

P1=0x00;

p_rsave();

sign=p_rdata(40);

if(sign!

=1)

p_new1();

p_base();

}

/***********************************************************************************

基础解锁函数

************************************************************************************/

voidp_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)

{

casevain:

break;

caseenter:

key1[n]=end;

if(p_compare(key1,save))

{

p_state(succed);

lock=0;

point=1;

state=opened;

opened

while

(1)

{bot=p_scan();

switch(bot)

{

caseoff:

main();

break;

caseback:

while

(1)

{

bot=p_scan();

switch(bot)

{

caseoff:

main();

break;

caseenter:

p_wdata(40,0);

main();

break;

}

}

}

}

}

else

{

p_state(error);p_record();

main();

}

break;

casecancel:

main();

break;

caseback:

if(n!

=0)

key1[n--]=end;

break;

caserevise:

p_revise();

break;

casetrevise:

p_trevise();

break;

default:

if(n+1==9)

{

p_state(error);

main();

}

key1[n++]=bot;

}

}

}

/***********************************************************************************

密码修改函数

************************************************************************************/

voidp_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)

{

casevain:

break;

caseenter:

key1[n]=end;

if(p_compare(key1,save))

{

lock=0;

point=1;

p_state(succed);

p_new1();

}

else

{

p_state(error);;

p_record();

main();

}

break;

casecancel:

main();

break;

caseback:

if(n!

=0)

key1[n--]=end;

break;

caserevise:

p_revise();

caseoff:

break;

casetrevise:

p_trevise();

break;

default:

if(n+1==9)

{

p_state(error);

main();

}

key1[n++]=bot;

}

}

}

/***********************************************************************************

新密码输入函数

************************************************************************************/

voidp_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)

{

casevain:

break;

caseenter:

key1[n]=end;

p_new2();

break;

casecancel:

main();

break;

caseback:

if(n!

=0)

key1[n--]=end;

break;

caserevise:

if(sign==1)

p_revise();

break;

casetrevise:

p_trevise();

break;

default:

if(n+1==9)

{

p_state(error);

main();

}

key1[n++]=bot;

}

}

}

voidp_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();

}

switch(bot)

{

casevain:

break;

caseenter:

key2[n]=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;

casecancel:

main();

break;

caseback:

if(n!

=0)

key2[n--]=end;

break;

caserevise:

if(sign==1)

p_revise();

break;

caseoff:

break;

casetrevise:

p_trevise();

break;

default:

if(n+1==9)

{

p_state(error);

main();

}

key2[n++]=bot;

}

}

}

/***********************************************************************************

键盘扫描函数

************************************************************************************/

ucharp_scan()

{

ucharf_s=vain;

P2=P2&0xf0;

if(P1!

=0xff)

{

p_delay(10);

if(P1!

=0xff)

{

tov=1;

P2=P2&0xf0;

P2=P2|0x07;

switch(P1)

{

case0xfe:

f_s=1;break;

case0xfd:

f_s=4;break;

case0xfb:

f_s=7;break;

case0xf7:

f_s=back;break;

}

while(P1!

=0xff)

{

sound=1;

}

sound=0;

P2=P2&0xf0;

P2=P2|0x0b;

switch(P1)

{

case0xfe:

f_s=2;break;

case0xfd:

f_s=5;break;

case0xfb:

f_s=8;break;

case0xf7:

f_s=0;break;

}

while(P1!

=0xff)

{

sound=1;

}

sound=0;

P2=P2&0xf0;

P2=P2|0x0d;

switch(P1)

{

case0xfe:

f_s=3;break;

case0xfd:

f_s=6;break;

case0xfb:

f_s=9;break;

case0xf7:

f_s=enter;break;

}

while(P1!

=0xff)

{

sound=1;

}

sound=0;

P2=P2&0xf0;

P2=P2|0x0e;

switch(P1)

{

case0xfe:

f_s=cancel;break;

case0xfd:

f_s=off;break;

case0xfb:

f_s=revise;break;

case0xf7:

f_s=trevise;break;

}

while(P1!

=0xff)

{

sound=1;

}

sound=0;

p_delay(10);

}

}

returnf_s;

}

/***********************************************************************************

1毫秒中断函数.数码管显示函数

************************************************************************************/

voidtime()interrupt1

{

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