单片机课程综合实训报告 项目名称: 多功能密码锁 系别: 信息系 班级: 电子3111 组别: 28号 组员: 朱煜荣 指导教师: 林志谋 报告日期: 2013 年 5 月23 日 一. 内容要求:1. 预期功能 (1)在没输入密码时显示万年历,并可调.(2)、通过按键来确定输入密码,实现密码锁功能,正确输入密码后有开锁提示;2. 设计方案(1)采用1602液晶 LM016L, AT98C51,行列式键盘2)采用1602液晶 LM016L3)选用单片机作为系统的核心部件,实现控制与处理的功能单片机具有资源丰富、速度快、编程容易等优点利用单片机内部的随机存储器(RAM)和只读存储器(ROM)及其引脚资源,外接液晶显示(LCD),键盘输入等实现数据的处理传输和显示功能,基本上能实现设计指标1,3. 硬件部分: 3.1 电路图:主要由单片机、矩阵键盘、独立按键、液晶显示器等部分组成。
其中矩阵键盘用于输入数字密码,独立按键用于实现可调万年历由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警各模块功能如下: (1)键盘输入模块:分为密码输入按键与几个功能按键,用于完成密码锁输入功能 (2)显示模块:用于完成对系统状态显示及操作提示功能3) 复位电路:完成系统的复位4) 独立键盘:用于完成可调万年历功能.(5)开锁电路:应用继电器及发光二极管模拟开锁,完成开锁及开锁提示键盘电路:用P1口组成4*4的矩阵键盘,各键的定义一次为:0、1、2、3、4、5、6、7、8、9、*、#、enetr、del(当密码按错时可以按下该键删除)、unclock(解锁键即三次密码都错了只能按下它进行解锁)调整时间的电路:Tiao是位功能选择,通过选择位来决定万年历的调整,+1、-1是调节功能键3.2 电路原理说明:开始仿真时,一开始现实年月份时间本设计主要由单片机、矩阵键盘、独立按键、液晶显示器等部分组成开锁电路控制着继电器发光二级管的开锁程序中设计只有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 int#define no_key 20 //无按键时的返回值sbit rs=P3^0;sbit rw=P3^1;//lcd数据命令选择端sbit e=P3^2;//lcd使能信号端sbit key1=P3^3; sbit key2=P3^4; sbit key3=P3^5; sbit A=P3^6; sbit key=P3^7;//开锁信号控制端sbit enter=P1^3;//该键按下后才能进行输入密码等操作uchar conflag,keyflag=3;uchar jz=20;//键值变量uchar temp1;//用此变量来存储键盘扫描的返回值,以便判断是否有键按下uchar code table0[6]={3,0,3,0,3,0};//初始密码uchar code table9[6]={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't open!";unsigned char m;uchar num,t0,keynum,hour,min,sec,year,month,day,week; uchar table5[6];//定义输入密码值存储数组/****************************************函数名称:delay**函数功能:软件延时,时间为z毫秒**入口参数:z延时控制值,值越大,延时越长**出口参数:无***************************************/void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}/****************************************函数名称:write_com**函数功能:1602写命令函数,可以用此函数写不同的指令**入口参数:com**出口参数:无***************************************/void write_com(uchar 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(0x80+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(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);//当读或写一个字符后地址指针加1,且光标加1 write_com(0x01);//显示清屏:数据指针、所有显示清0 write_com(0x80);//设置数据地址指针 for(num=0;num<15;num++) { write_date(table1[num]);//LCD显示"初始设置时间"; delay(5); } write_com(0x80+0x40); for(num=0;num<14;num++) { write_date(table2[num]);//LCD显示"初始设置时间"; delay(5); } /*定时器初始化*/ TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; 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按下第二次 。