多功能密码锁单片机课程综合实训报告.doc

上传人:本田雅阁 文档编号:2040712 上传时间:2019-02-07 格式:DOC 页数:25 大小:4.64MB
返回 下载 相关 举报
多功能密码锁单片机课程综合实训报告.doc_第1页
第1页 / 共25页
多功能密码锁单片机课程综合实训报告.doc_第2页
第2页 / 共25页
多功能密码锁单片机课程综合实训报告.doc_第3页
第3页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《多功能密码锁单片机课程综合实训报告.doc》由会员分享,可在线阅读,更多相关《多功能密码锁单片机课程综合实训报告.doc(25页珍藏版)》请在三一文库上搜索。

1、单片机课程综合实训报告 项目名称: 多功能密码锁 系别: 信息系 班级: 电子3111 组别: 28号 组员: 朱煜荣 指导教师: 林志谋 报告日期: 2013 年 5 月23 日 一. 内容要求:1. 预期功能 (1)在没输入密码时显示万年历,并可调.(2)、通过按键来确定输入密码,实现密码锁功能,正确输入密码后有开锁提示;2. 设计方案(1)采用1602液晶 LM016L, AT98C51,行列式键盘。(2)采用1602液晶 LM016L。(3)选用单片机作为系统的核心部件,实现控制与处理的功能。单片机具有资源丰富、速度快、编程容易等优点。利用单片机内部的随机存储器(RAM)和只读存储器(

2、ROM)及其引脚资源,外接液晶显示(LCD),键盘输入等实现数据的处理传输和显示功能,基本上能实现设计指标1,3. 硬件部分: 3.1 电路图:主要由单片机、矩阵键盘、独立按键、液晶显示器等部分组成。其中矩阵键盘用于输入数字密码,独立按键用于实现可调万年历。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警。各模块功能如下: (1)键盘输入模块:分为密码输入按键与几个功能按键,用于完成密码锁输入功能 (2)显示模块:用于完成对系统状态显示及操作提示功能。(3) 复位电

3、路:完成系统的复位。(4) 独立键盘:用于完成可调万年历功能.(5)开锁电路:应用继电器及发光二极管模拟开锁,完成开锁及开锁提示。键盘电路:用P1口组成4*4的矩阵键盘,各键的定义一次为:0、1、2、3、4、5、6、7、8、9、*、#、enetr、del(当密码按错时可以按下该键删除)、unclock(解锁键即三次密码都错了只能按下它进行解锁)调整时间的电路:Tiao是位功能选择,通过选择位来决定万年历的调整,+1、-1是调节功能键。3.2 电路原理说明:开始仿真时,一开始现实年月份时间。本设计主要由单片机、矩阵键盘、独立按键、液晶显示器等部分组成。开锁电路控制着继电器发光二级管的开锁。程序中

4、设计只有eneter键按下才能进行密码输入等操作。当输出密码正确时,解锁并且红灯亮。当连续按三次错误会被锁定,并且发出警报。此时按下unclock(解锁键,即三次密码都错了只能按下它进行解锁)4.软件部分4.1程序流程图 : 开始初始化Tiao按下否?Enter按下否?NY第几次按下?“+”功能键按下否“-”功能键按下否3秒到否NNYYYNYNY位选择被调数加一被调数减一输入密码密码输入错误?OK!YN显示调后万年历第八次按下结束N 4.2程序设计说明#include#define lcd P2 #define uchar unsigned char #define uint unsigned

5、 int#define no_key 20 /无按键时的返回值sbit rs=P30;sbit rw=P31;/lcd数据命令选择端sbit e=P32;/lcd使能信号端sbit key1=P33; sbit key2=P34; sbit key3=P35; sbit A=P36; sbit key=P37;/开锁信号控制端sbit enter=P13;/该键按下后才能进行输入密码等操作uchar conflag,keyflag=3;uchar jz=20;/键值变量uchar temp1;/用此变量来存储键盘扫描的返回值,以便判断是否有键按下uchar code table06=3,0,3

6、,0,3,0;/初始密码uchar code table96=3,1,3,1,3,1;/初始密码uchar code table1=2013-05-23 w-4;uchar code table2= Time-00:00:00;uchar code table3=Enter please:;uchar code table4=OK!;uchar code table6=ERRO!;uchar code table7=Enter again:;uchar code table8=LOCKED!;uchar code table10=UNLOCKED!;uchar code table11=Can

7、t open!;unsigned char m;uchar num,t0,keynum,hour,min,sec,year,month,day,week; uchar table56;/定义输入密码值存储数组/*函数名称:delay*函数功能:软件延时,时间为z毫秒*入口参数:z延时控制值,值越大,延时越长*出口参数:无*/void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*函数名称:write_com*函数功能:1602写命令函数,可以用此函数写不同的指令*入口参数:com*出口参数:无*/void write_com(uc

8、har com)rs=0;rw=0;e=0;P2=com;delay(5);e=1;delay(5);e=0;/*函数名称:write_date*函数功能:1602写数据函数,可以用此函数写不同的数据,程序对应的硬件1602的数据口为P2口*入口参数:date*出口参数:无*/void write_date(uchar date)rs=1;rw=0;e=0;P2=date;delay(5);e=1;delay(5);e=0; /*显示位*/ void write_week(uchar dte) uchar shi,ge; shi=dte/10; ge=dte%10; write_com(0x8

9、0+13); write_date(0x30+ge);void write_clock(uchar add,uchar dat) uchar first,second; second=dat/10; first=dat%10; write_com(0x80+0x40+add); write_date(0x30+second); write_com(0x80+0x40+add+1); write_date(0x30+first); void write_nyr(uchar add,uchar dte) uchar shi,ge; shi=dte/10; ge=dte%10; write_com(

10、0x80+add); delay(5); write_date(0x30+shi); write_com(0x80+add+1); delay(5); write_date(0x30+ge); /*函数名称:init*函数功能:初始化函数*入口参数:无*出口参数:无*/void init()uchar hour=3,min=3,year=11,month=5,day=7,week=6; uchar num; e=0;write_com(0x38);/设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);/开显示,不显示光标write_com(0x06);/当读或写一个字符后

11、地址指针加1,且光标加1write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80);/设置数据地址指针for(num=0;num15;num+)write_date(table1num);/LCD显示初始设置时间;delay(5);write_com(0x80+0x40);for(num=0;num14;num+)write_date(table2num);/LCD显示初始设置时间;delay(5);/*定时器初始化*/ TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1

12、; TR0=1; while(1) if(key1=0) /时钟设置/key1按下 delay(5); if(key1=0) /key1真的按下了 keynum+; while(!key1) /去键抖 TR0=0; /时钟暂停 if(keynum=1) /key1按下第一次 write_com(0x80+0x40+13); write_com(0x0f); if(keynum=2) /key1按下第二次 write_com(0x80+0x40+10); if(keynum=3) /key1按下第三次 write_com(0x80+0x40+7); if(keynum=4) /key1按下第三次

13、 write_com(0x80+13); if(keynum=5) /key1按下第三次 write_com(0x80+9); if(keynum=6) /key1按下第三次 write_com(0x80+6); if(keynum=7) /key1按下第三次 write_com(0x80+3); if(keynum=8) /key1按下第四次 keynum=0; /按键次数清零 write_com(0x0c); TR0=1; /继续运行时钟 /*按键加*/ if(keynum!=0) if(key2=0) delay(80); if(key2=0) while(!key2); if(keyn

14、um=1) sec+; if(sec=60) sec=0; write_clock(12,sec); write_com(0x80+0x40+13); if(keynum=2) min+; if(min=60) min=0; write_clock(9,min); write_com(0x80+0x40+10); if(keynum=3) hour+; if(hour=24) hour=0; write_clock(6,hour); write_com(0x80+0x40+7); if(keynum=4) week+; if(week=8) week=1; write_week(week);

15、write_com(0x80+13); if(keynum=5) day+; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) if(day=32) day=1; else if(month=2) /注意这里没有考虑闰年 if(day=29) day=1; else if(day=31) day=1; write_nyr(8,day); write_com(0x80+9); if(keynum=6) month+; if(month=13) month=1; write_nyr(5,month); write_com(0

16、x80+6); if(keynum=7) year+; if(year=99) year=0; write_nyr(2,year); write_com(0x80+3); /*按键减*/ if(key3=0) delay(80); if(key3=0) while(!key3); if(keynum=1) sec-; if(sec=-1) sec=59; write_clock(12,sec); write_com(0x80+0x40+13); if(keynum=2) min-; if(min=-1) min=59; write_clock(9,min); write_com(0x80+0x

17、40+10); if(keynum=3) hour-; if(hour=-1) hour=23; write_clock(6,hour); write_com(0x80+0x40+7); if(keynum=4) week-; if(week=0) week=7; write_week(week); write_com(0x80+13); if(keynum=5) day-; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) if(day=0) month=31; else if(month=2) /注意这里没有考虑闰年

18、 if(day=0) day=28; else if(day=0) day=30; write_nyr(8,day); write_com(0x80+9); if(keynum=6) month-; if(month=0) month=12; write_nyr(5,month); write_com(0x80+6); if(keynum=7) year-; if(year=-1) year=99; write_nyr(2,year); write_com(0x80+3); P1=14|10|11|12|13|15|16|07; if(enter=0)break; /*检测Enter(P1.3

19、)键是否按下,只有该键按下才能进行输入密码等操作*/P1=04|10|11|12|13|15|16|17;while(enter);if(enter=0)delay(5);if(enter=0) TR0=0; write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x02);/设置数据地址指针 for(num=0;num13;num+) write_date(table3num);/LCD显示“Enter please:”delay(5); while(!enter);/判断按键是否释放 delay(5); while(!enter); P1=0xf

20、f; /*函数名称:keyscan*函数功能:3*4键盘扫描*入口参数:无*出口参数:jz*/ uchar keyscan() uchar temp;P1=0xfe;/第一行扫描temp=P1;temp=temp&0xf0; while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xee:jz=0;break;case 0xde:jz=1;break;case 0xbe:jz=2;break;case 0x7e:jz=3;break;while(temp!=0xf0)

21、temp=P1;temp=temp&0xf0;P1=0xfd;/第二行扫描temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xed:jz=4;break;case 0xdd:jz=5;break;case 0xbd:jz=6;break;case 0x7d:jz=7;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;P1=0xfb;/第三行扫描temp=P1;temp=tem

22、p&0xf0;while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xeb:jz=8;break;case 0xdb:jz=9;break;case 0xbb:jz=*;break;case 0x7b:jz=#;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;return jz;/*函数名称:codein*函数功能:完成密码输入,并判断密码是否正确*入口参数:无*出口参数:无*/void codein() uchar t=

23、0;write_com(0x80+0x40+0x02);/重新设置LCD数据地址指针for(t=0;t6;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 P1=0xdf;/判断是否要删除输入的密码 if(enter=0) delay(5);if(enter=0) write_com(0x80+0x41+t); /确定删除对象 write_date( ); /显示空格即为删除 t-; while(!enter);/判断按键是否释放 delay(5); while(!enter); / P1=0xff temp1=keyscan();/继续

24、扫描按键直至有键按下 table5t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/LCD显示“*” delay(5);jz=20; t=0; for(t=0;t6;t+) if(table5t!=table0t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=6)/要是条件退出的话说明六个数全对密码 conflag=1; / 进行标志密码正确 /*函数名称:codeout*函数功能:根据密码输入正确与否作出相应的反应*入口参数:无*出口参数:无*/void codeout

25、() uchar t; if(conflag) t=0; write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x07);/设置数据地址指针 for(t=0;t3;t+) write_date(table4t);/LCD显示“OK!”/delay(5); key=0; while(1); if(!conflag) keyflag-; t=0; write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x05);/设置数据地址指针 for(t=0;t5;t+) write_date(table6t);/LCD

26、显示“ERRO!”delay(5); write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x02);/设置数据地址指针 for(t=0;t12;t+) write_date(table7t);/LCD显示“Enter again:” delay(5); /*函数名称:codeen*函数功能:当密码输入错误次数达到3次时,要按下解锁键,输入万能密码,此函数能判断万能密码正确与否并做出相应反应*入口参数:无*出口参数:无*/void codeen() uchar t=0;write_com(0x80+0x40+0x02);/重新设置LCD数据地址指针

27、for(t=0;t6;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 /P1=0xdf;P1=05|10|11|12|13|14|16|17; if(enter=0) delay(5);if(enter=0) write_com(0x80+0x41+t); /确定删除对象 write_date( ); /显示空格即为删除 t-; while(!enter);/判断按键是否释放 delay(5); while(!enter); P1=0xff;temp1=keyscan();/继续扫描按键直至有键按下 table5t=temp1;/实时保

28、存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/LCD显示“*” delay(5);jz=20; t=0; for(t=0;t6;t+) if(table5t!=table9t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=6)/要是条件退出的话说明六个数全对密码 t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x03);/设置数据地址指针for(t=0;t9;t+)write_date(table10t);/LCD显示“UNLOCKE

29、D!”delay(5); while(1) key=0; else t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x03);/设置数据地址指针 for(t=0;t11;t+)write_date(table11t);/LCD显示“Cant open!”delay(5); while(1)key=1; void main() uchar i=0; uchar j=0; init(); while(keyflag) codein();codeout(); write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x04);/设置数据地址指针for(i=0;i7;i+)write_date(table8i);/LCD显示“LOCKED!”A=0;delay(5); whi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1