单片机原理与应用技术 课程设计报告(论文)
基于单片机控制的电子密码锁
专业班级:应用电子技术教育151班 姓 名: 黄永进 时 间: 2017 指导教师: 孔晓红 邵锋_ 张素君 2017年 11月 24日 基于单片机控制的电子密码锁课程设计任务书 1. 设计目的与要求 设计出一个基于单片机控制的电子密码锁。准确地理解有关要求,完成系统设计,要求所设计的电路具有以下功能: (一) 基本功能 (1)状态显示功能:
锁定状态时系统用3位数码管显示OFF,用3位数码管显示成功开锁次数;成功开锁时用3位数码管显示888,用3位数码管显示成功开锁次数。 (2)密码设定功能:
通过一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),同时系统掉电后能自动记忆和存储密码在系统中。 (3)报警和加锁功能:
密码的输入时间超过12秒或者连续3次输入失败,声音报警同时锁定系统,不让再次输入密码。此时只有使用管理员密码方能对系统解锁。(二)扩展功能 实现电机的正反转状态指示及速度快慢指示。 (二) 扩展功能 可增加遥控控制功能 2.设计内容 (1)画出电路原理图,正确使用逻辑关系; (2)确定元器件及元件参数; (3)进行电路模拟仿真; (4)SCH文件生成与打印输出; (5)硬件及程序综合调试; 3.编写设计报告
写出设计的全过程,附上有关资料和图纸,有心得体会
4.答辩
在规定时间内,完成叙述并回答问题。
目录
1 引言 .................................................................. 2 总体设计方案 .......................................................... 2.1 设计思路 ............................................................ 2.1.1 方案确立 .......................................................... 2.2 设计方框图 .......................................................... 3 设计原理分析 .......................................................... 3.1 单片机最小系统的设计 ................................................ 3.1.1 复位电路 .......................................................... 3.1.2 晶振电路 .......................................................... 3.2 显示电路的设计 ...................................................... 3.3 矩阵按键的设计 ...................................................... 3.3.1矩阵按键电路图 ..................................................... 3.3.2矩阵按键说明 .......................................................
3.3.3矩阵按键原理 ....................................................... 3.4 I2C电路的设计 ....................................................... 4 结束语 ................................................................ 参考文献 ................................................................ 附录1电路原理图 ........................................................ 附录2电路PCB图 ........................................................
附录3程序代码 ..........................................................
基于单片机控制的电子密码锁
应教151班 黄永进
摘要:设计是采用STCC52芯片控制一个三位一体的数码管,通过4x4矩阵按键来控制密码输入以及不同的系统指令来完成密码锁的密码输入和修改等,同时使用AT24C04芯片来实现掉电密码数据存储的功能。系统的核心控制主要是通过编写C语言来控制单片机实现。 关键词:单片机 矩阵 I2C 蜂鸣器 数码管 1 引言 随着科技的进步和社会的发展,安全隐患层出不穷,人们的安全意识逐渐提高,对锁的要求也随之提高。电子密码锁采用键盘输入密码,在具备传统锁的基础作用的同时,有更方便更安全的作用。本文对基于单片机的电子密码锁进行具体的介绍。该电子密码锁包含显示模块、按键举证、采用1到16位数密码,正确输入密码开锁,三次输错密码报警,修改密码这些功能。该设计具有成本低、易操作、功耗低、效率高等优点。 2 总体设计方案 2.1 设计思路 2.1.1 方案确立
(1)方案内容
该设计方案采用STCC52芯片作为核心,配合数码管、矩阵按键、蜂鸣器等外围电路进行组合,组成电子密码锁系统。其中矩阵按键用来设置系统的密码和输入密
码,数码管用于显示开锁状态和成功开锁的次数,最后用C语言程序控制其逻辑功能。 2.2 设计方框图
(1)设计框图如图1.1
显示模块 按键矩阵 STCC52报警模块 存储模块 图1 设计框图 3 设计原理分析 3.1 单片机最小系统的设计 3.1.1 复位电路 单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。在本设计中也不例外,如图1.2中复位电路由电容串联电阻构成,并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。 3.1.2 晶振电路
每个单片机系统里都有晶振(如图1.2中器件Y1),全称是叫晶体震荡器,在单
片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。本设计中晶振取12MHz,因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合,12MHz产生精确的uS级时歇,方便定时操作。
图2 最小系统 3.2 显示电路的设计 本设计中的密码输入显示及系统状态的显示都是采用一个共阳极的三位一体的数码管实现。 图3 数码管 图4 三极管驱动 在电路中将三位一体数码管(如图1.3)的a b c d e f g脚通过分别串接一个电阻之后与单片机P2.0~P2.7连接,另外为了实现位选控制将三位一体数码管的DG1、DG2与DG3引脚通过三极管驱动(如图1.4)与单片机P3.1、P3.2、P3.3连接。 3.3 矩阵按键的设计 图5 矩阵按键电路 表1 按键说明表 按键 键名 功能 0-9 数字键 密码输入 OP 开锁键 开启输入密码请求
DE 退格键 删除已输入的内容 SE 设置键 用户密码修改重置 EN 确定键 输入内容确定 AD 管理键 用于开启管理员权限 当无按键闭合时,P1.0~P1.3与P1.4~P1.7之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。判断有无按键按下的方法是:第一步,置列线P1.4~P1.7为输入状态,从行线P1.0~P1.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P1.4~P1.7读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。 3.4 I2C电路的设计 在本设计中应用I2C总线的EEPROM做存储设备(24C04芯片如图1.6所示)。为了驱动I2C总线,在单片机向总线送数据程序时则可以在SCL还在低电平时,把数据电平送到SDA,然后拉高SCL,这时SDA不应有电平跳变,延时后拉低SCL,再进行下一位的数据传送直到完成。在总线上读数据时也是只有在SCL为高时,SDA为有效数据。
图6 I2C电路图
3.5 报警电路的设计
图7 报警电路
设计中报警电路如图1.7所示,蜂鸣器使用三极管驱动,通过一个限流电阻之后与单片机P3.0连接。因此,我们可以通过程序控制P3.0脚的电平来使蜂鸣器发出声音和关闭,从而实现系统报警。 4 结束语
在这次实习的过程中,从选题到定稿,从理论到实践,可以说得是苦多于甜,但
是可以学到很多的的东西,不仅巩固了以前学过的知识,还学到了很多在书本上没有学到过的知识。通过这次课程设计使我懂得了理论与实践同等重要,只有将理论和实践相结合才能提高自己的实际动手能力和思考的能力。当然这次实习能够那么顺利的完成,除了自己的努力外,离不开院方为我们制定的严格的计划,离不开指导老师的严格的督查和耐心的教导指点,离不开班级同学的帮助与支持。 参考文献 [1] 谭浩强.c语言程序设计.北京:清华大学出本社,2010 [2] 李建忠.单片机原理及应用.西安:西安电子科技新大学出版社,2013 附录1电路原理图 附录2电路PCB图 附录3程序流程图 附录4程序代码#include #define KeyPort P1 uchar DD_F=0,DM_F=0; uchar R[16]; //用户密码 uchar M[16]; //芯片密码 uchar G[6]={6,6,6,6,6,6}; char Time_temp=0; char DIG_C1=0; char DIG_C2=0; char DIG_C3=0; 99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; uchar flag=1,adm=0,flagg=1,adm1=1,flagb=//uchar code 0; DIS_BIT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; sbit fmq=P3^0; sbit wei1=P3^1; sbit wei2=P3^2; sbit wei3=P3^3; sbit scl=P3^4; // 24c08 SCL sbit sda=P3^5; // 24c08 SDA sbit LED=P3^7; char dis[3]={0}; unsigned char num=1,num1=0,num2=0; uint scs=0,ecs=0; char Tim_flog=0; int Tim_temp1=0; char Tim_CNT=0; void delay() //delay 5us { ;; } void Delay10ms(unsigned int c) { unsigned char a, b; for (;c>0;c--) uchar code DIS_SEG7[]={0xc0,0xf9,0xa4,0xb0,0x { for (b=15;b>0;b--) { for (a=130;a>0;a--); } } } void display(uint i,uint j,uint k) { dis[0]=i; dis[1]=j; dis[2]=k; } unsigned char KeyScan(void) { unsigned char cord_h,cord_l; KeyPort=0x0f; cord_h=KeyPort&0x0f; if(cord_h!=0x0f) { Delay10ms(1); if((KeyPort&0x0f)!=0x0f) { cord_h=KeyPort&0x0f; KeyPort=cord_h|0xf0; cord_l=KeyPort&0xf0; while((KeyPort&0xf0)!=0xf0); return(cord_h+cord_l); } }return(0xff); } unsigned char KeyPro(void) { switch(KeyScan()) { case 0x7e:return 0;break;//0 case 0x7d:return 1;break;//1 case 0x7b:return 2;break;//2 case 0x77:return 3;break;//3 case 0xbe:return 4;break;//4 case 0xbd:return 5;break;//5 case 0xbb:return 6;break;//6 case 0xb7:return 7;break;//7 case 0xde:return 8;break;//8 case 0xdd:return 9;break;//9 case 0xdb:return 10;break;//a case 0xd7:return 11;break;//b case 0xee:return 12;break;//c case 0xed:return 13;break;//d case 0xeb:return 14;break;//e case 0xe7:return 15;break;//f default:return 0xff;break; } } void Tim_Iint(void) { TMOD &= 0XF0; TMOD |= 0X01; TL0 = (65535-1000)%256; TH0= (65535-1000)/256; ET0=1; TR0=1; EA=1; } void Close_DIG(char i,char k,char j) { if(i==1) { DIG_C1=1; } if(i==0) { DIG_C1=0; } if(k==1) { DIG_C2=1; } if(k==0) { DIG_C2=0; } if(j==1) { DIG_C3=1; } if(j==0) { DIG_C3=0; } } void Time0(void) interrupt 1 using 1 { char i; TL0 = (65535-1000)%256; TH0= (65535-1000)/256; if(Tim_flog==1) { Tim_temp1++; if(Tim_temp1>1000) { Tim_temp1=0; Tim_CNT++; } } if(Time_temp==0) { if(DIG_C1==1) { P2=DIS_SEG7[dis[0]]; wei1=0; wei3=1; wei2=1; } if(DIG_C1==0) { wei1=1; wei3=1; wei2=1; } Time_temp=1; goto end; } if(Time_temp==1) { if(DIG_C2==1) { P2=DIS_SEG7[dis[1]]; wei1=1; wei2=0; wei3=1; } if(DIG_C2==0) { wei1=1; wei3=1; wei2=1; } Time_temp=2; goto end; } if(Time_temp==2) { if(DIG_C3==1) { P2=DIS_SEG7[dis[2]]; wei1=1; wei2=1; wei3=0; } if(DIG_C3==0) { wei1=1; wei2=1; wei3=1; } Time_temp=0; goto end; } end: i=0; } void start() //开始信号 { sda=1; delay(); scl=1; delay(); sda=0; delay(); } void stop() //停止信号 { sda=0; delay(); scl=1; delay(); sda=1; delay(); } void respons() //应答 { uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } void init_24c08() //初始化24C02 { sda=1; delay(); scl=1; delay(); } void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); // scl=0; // delay(); } scl=0; delay(); sda=1; delay(); } uchar read_byte() { 写入数据 uchar i,k; { scl=0; start(); delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k; } void write_24c08(uchar address,uchar shuju) //给指定地址中 write_byte(0xa0); // 最低位为0写,1读 respons(); respons(); start(); write_byte(address); write_byte(0xa1); respons(); respons(); write_byte(shuju); date=read_byte(); respons(); stop(); stop(); Delay10ms(1); Delay10ms(1); return date; } } uchar read_24c08(uchar address) //void main(void) 从24c08指定地址中读出数据 { { char temp1=0,temp2=0,temp3=0; uchar date; char i=0,j=0,k=0,m=0; start(); char dis_temp=0; write_byte(0xa0); uchar cnt1=0,cnt2=0,cnt3=0; respons(); // char a,b,c; write_byte(address); init_24c08(); Tim_Iint(); Close_DIG(1,1,1); for(m=1;m<=16;m++) { M[m-1]=read_24c08(m); cnt1= read_24c08(20); } while(1) { num=KeyPro(); Close_DIG(1,1,1); display(0,15,15); //判断管理员标志位adm if(adm==0) { if(adm1==0) { if(num==14) { Close_DIG(0,0,0); cnt1=0; while(1) { num=KeyPro(); if(num<10) { Close_DIG(1,1,1); M[cnt1]=num; while(num==KeyPro()); temp1++; cnt1++; if(temp1==4) temp1=1; } if(num==13) { cnt1--; if(cnt1<=0) cnt1=0; temp1--; if(temp1==0) temp1=3; } if(temp1==1) { display(M[cnt1-1],16,16); } if(temp1==2) { display(16,M[cnt1-1],16); } if(temp1==3) { display(16,16,M[cnt1-1]); } if(num==15) { for(k=1;k<=cnt1;k++) { write_24c08(k,M[k-1]); write_24c08(20,cnt1); } } adm1=1; break; } Delay10ms(1); } } } if(num==12) { Close_DIG(0,0,0); cnt2=0; while(1) { Tim_flog=1; num=KeyPro(); if(num<10) { Close_DIG(1,1,1); R[cnt2]=num; while(num==KeyPro()); temp2++; cnt2++; if(temp2==4) temp2=1; } if(num==13) { cnt2--; if(cnt2<=0) cnt2=0; temp2--; if(temp2==0) temp2=3; } if(temp2==1) { display(R[cnt2-1],16,16); } if(temp2==2) { display(16,R[cnt2-1],16); } if(temp2==3) { display(16,16,R[cnt2-1]); } if(num==15) { Tim_CNT=0; Tim_flog=0; if(cnt1==cnt2) { for(j=0;j flag=flag&&(M[j]==R[j]); } if(flag) { scs++; display(8,8,8); Delay10ms(800); cnt2=0; temp2=0; display(0,(scs/10),(scs%10)); Delay10ms(800); break; } else { ecs++; Close_DIG(0,0,0); cnt2=0; temp2=0; flag=1; Tim_flog=0; Tim_CNT=0; } }else { ecs++; Close_DIG(0,0,0); cnt2=0; temp2=0; flag=1; Tim_flog=0; Tim_CNT=0; } } Delay10ms(1); if(Tim_CNT==12) { adm=1; fmq=0; flagb=1; Tim_flog=0; Tim_CNT=0; break; } if(ecs>=3) { adm=1; fmq=0; flagb=1; Tim_flog=0; Tim_CNT=0; break; } } } } if(num==10){ Close_DIG(0,0,0); } if(num==11) { Close_DIG(0,0,0); cnt3=0; while(1) { num=KeyPro(); if(num<10) { Close_DIG(1,1,1); R[cnt3]=num; while(num==KeyPro()); temp3++; cnt3++; if(temp3==4) temp3=1; } if(num==13) { cnt3--; if(cnt3<=0) cnt3=0; temp3--; if(temp3==0) temp3=3; } if(temp3==1) { display(R[cnt3-1],16,16); } if(temp3==2) { display(16,R[cnt3-1],16); } if(temp3==3) { display(16,16,R[cnt3-1]); } if(num==15) { Tim_CNT=0; Tim_flog=0; if(cnt3==6) { for(j=0;j<6;j++) { flagg=flagg&&(G[j]==R[j]); } if(flagg&&flagb==0) { ecs=0; fmq=1; adm=0; adm1=0; Tim_flog=0; Tim_CNT=0; break; } else if(flagg&&flagb==1) { Tim_flog=0; Tim_CNT=0; ecs=0; fmq=1; adm=0; adm1=1; flagb=0; break; } else { Tim_flog=0; Tim_CNT=0; flagg=1; } } } Delay10ms(1); } } Delay10ms(1); }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务