单片机C语言程序设计课程设计密码锁.docx

上传人:b****6 文档编号:7103454 上传时间:2023-01-17 格式:DOCX 页数:36 大小:242.48KB
下载 相关 举报
单片机C语言程序设计课程设计密码锁.docx_第1页
第1页 / 共36页
单片机C语言程序设计课程设计密码锁.docx_第2页
第2页 / 共36页
单片机C语言程序设计课程设计密码锁.docx_第3页
第3页 / 共36页
单片机C语言程序设计课程设计密码锁.docx_第4页
第4页 / 共36页
单片机C语言程序设计课程设计密码锁.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

单片机C语言程序设计课程设计密码锁.docx

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

单片机C语言程序设计课程设计密码锁.docx

单片机单片机C语言程序设计课程设计密码锁语言程序设计课程设计密码锁单片机C语言程序设计课程设计密码锁课程设计(论文)任务书课程设计(论文)题目:

单片机C语言程序设计课程设计基本内容:

利用实验室提供的实验仪器,自行选题设计一套硬件系统;采用单片机C语言编写程序,使之成为完整的设备。

课程设计(论文)专题部分:

题目:

电子密码锁基本内容:

利用实验板上的LCD显示屏、24C02及8279等资源设计电子密码锁系统,要求实现输入正确开锁,错误警告等相关功能。

学生接受课程设计(论文)题目日期第20周指导教师签字:

2013年7月18日摘要传统密码锁由于外形单一并容易人为损坏,以无法满足人们对安全日益增长的需求。

而电子密码锁因其具有使用方便,可靠性强,成本低廉,正逐步代替传统密码锁,被广泛应用于安全领域。

本文设计了一种智能电子式密码锁,它以单片机为控制核心,配合输入模块,显示模块及报警模块共同完成了密码服务。

控制部分使用AT89C51单片机,其价格低廉,功耗较低,配有足够的内部资源来完成电子密码锁的核心控制。

使用Intel公司的8279芯片,管理4*4键盘,作为密码输入及功能选择的输入模块。

显示模块利用RT12864LCD显示器,以更加友好的界面完成人机交互。

而报警模块利用led等及蜂鸣器提示密码输入情况,并完成危机报警功能。

电子密码锁功能丰富,正确输入密码时,可进入欢迎界面,进行功能选择,如修改密码服务,可对原始通用密码进行修改,修改过程中需二次确认密码,两次输入相同才可修改成功,防止了因用户手误造成无法再次进入系统。

退出功能保证用户在特殊情况下一键加锁,防止信息泄露。

密码锁还配有三次报警功能和超时报警功能,当三次输入错误或第一次输入错误后,5s内无法进入系统,密码锁将进入自锁状态,防止他人暴力破解密码。

关键词:

电子密码锁,单片机,24C02,LCD,RT12864Hz;第1章绪论11.1设计目的11.2设计意义11.3设计要求1第2章总体设计方案22.1设计思路22.2系统设计总框图2第3章硬件电路设计及简要描述43.1硬件设计原理图43.2内部资源的使用43.3单片机外围电路53.3.1复位电路的设计53.3.2时钟发生电路设计63.4密码锁控制电路63.4.1键盘管理芯片827963.4.2LCD显示电路83.4.3密码存储电路93.4.4蜂鸣报警电路93.4元件清单10第4章软件程序设计114.1程序流程图114.2系统初始化124.3按键识别设计124.45s定时设计134.5密码修改设计14参考文献16附录电子密码锁系统程序源代码17设计心得体会32第1章绪论1.1设计目的

(1)软件及硬件上进一步了解单片机的原理;

(2)掌握、运用C51语言编程,提升C51编程能力;(3)熟练掌握RT12864液晶显示模块和8279键盘操作管理芯片;(4)熟悉24C02掉电存储功能。

1.2设计意义

(1)深入了解了单片机C51语言的实际应用;

(2)通过独立思考,独立操作切实提高自己的编程能力;(3)增强团队合作意识;(4)运用所学知识发现问题、分析问题、解决问题;1.3设计要求根据实验室提供的实验箱、计算机等设备由我们自行设计了电子密码锁系统,实现如下要求:

基本要求:

采用24C02或IC卡,设置6位密码,最多比较3次,利用LED灯显示密码输入正确与否。

(1)利用24C02或IC卡,设置6位密码;

(2)当密码输入正确后的密码后开锁,用红灯亮绿灯灭表示关锁,绿灯亮红灯灭表示开锁;(3)密码最多可以试输入三次,如果三次输入错误,红灯闪烁,并发报警警报。

附加要求:

第一次输入密码与开锁的时间超过5s,红灯闪烁,并发报警警报。

第2章总体设计方案2.1设计思路本设计主要由单片机、4*4键盘、LCD液晶显示屏和密码存储等部分组成。

其中键盘用于输入数字密码和进行各种功能的实现。

用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与之前保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者蜂鸣报警电路。

2.2系统设计总框图图2.1系统设计总框图各模块功能如下1、键盘输入控制模块:

采用8279管理键盘输入,有效节省了I/O口的资源。

4*4键盘上的键分别用于密码输入和其他功能调用;2、密码存储模块:

芯片24C02用于完成密码的掉电存储,使密码断电后得以保存;3、LCD液晶显示模块:

采用芯片RT12864Hz实现液晶显示功能,用于实现友好的人机交互界面,提高了可读性,使用户对密码锁的运行情况一目了然;4、蜂鸣报警电路模块:

通过LED灯和压电蜂鸣器,对输错密码和输入超时实行报警;5、复位电路:

完成系统的复位;6、时钟电路:

用于单片机的起振;7、内部定时模块:

利用内部定时器T0完成设计的附加要求。

第3章硬件电路设计及简要描述3.1硬件设计原理图硬件设计原理图如图3.1:

图3.1硬件设计原理图3.2内部资源的使用此设计中我们使用了单片机内部定时计数器T0提供计时功能,判断密码输入是否超时,如果超时,系统将锁死。

8279的IRQ端经反向器与89C51的外部中断INT0相连接,判断是否有按键按下,如果有按键按下,则处理器去执行相应的操作。

P1的P1.2和P1.3用于模拟24C02的双线通讯接口,P1.0和P1.1连接红绿指示灯,通过控制其亮灭及闪烁状态,辅助显示密码输入情况。

P1.4连接蜂鸣器,用于密码锁锁死时的报警功能。

3.3单片机外围电路3.3.1复位电路的设计复位是单片机的初始化操作。

单片机启动运行时,都需要先复位,起作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。

但是单片机本身不能自动进行复位,必须配合外部电路才能实现。

该复位电路采用按键电平复位电路,当单片机在运行中,按下复位键S0后松开,在RST引脚持续出现24个振荡周期的高电平信号使单片机复位,实现上电开关复位的操作。

如图3.2所示图3.2复位电路图3.3.2时钟发生电路设计时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在同一的时序脉冲驱动下进行的,当采用内部时钟时,连接方法如图3.3所示,在晶振引脚XTAL1(19脚)和XTAL2(18脚)之间接一个6MHZ晶振,两个引脚对地分别再接入一个电容即可产生所需的时钟信号,电容我们选取30pF。

图3.3时钟发生电路图3.4密码锁控制电路3.4.1键盘管理芯片8279为了节省I/O口资源,我们没有使用传统的行扫描法管理键盘,而选择了8279控制芯片,由8279读入键盘键值,用键值来控制程序的执行。

8279芯片是一种通用的可编程键盘、显示接口器件,能完成对64位按键和16位LED显示器的管理1,但本次设计中没有使用LED功能。

8279有多种功能和多种工作模式,其功能和模式靠设定命令字来确定。

8279的命令字近10种,在使用8279之前,借鉴了实验的相关程序23,本文设计中的接线是:

IRQ接INT0,采用中断方式,ALE接CLK。

图3.4键盘管理电路图8279各端口地址分配如下:

按键的操作面板如图3.5所示,共计10个数字键和6个功能键。

图3.5密码锁操作面板【0】【9】10个数字键用来输入密码,另外6个功能键分别是:

【A】设置新密码键、【C】清零键、【E】确定键和【F】退出键。

其中清零键的功能是清除当前输入的密码后重新输入。

确认键的功能是确认当前输入的密码。

设置新密码键的功能是当密码输入正确时,可以重新修改密码。

退出键的功能是退出到密码输入界面。

表3.1按键功能表按键键名功能说明09数字键输入密码A设置新密码键选择重置密码C清零键密码清零E确认键确认F退出键退出3.4.2LCD显示电路由RT12864Hz,按键和保护电阻组成的外部扩展电路。

其工作过程是通过单片机P3.6/WR和P3.7/RD接于RT12864,采用并行数据通讯模式。

图3.6液晶显示电路图LCD显示器各端口地址分配如下:

图3.7LCD显示器各端口地址分配3.4.3密码存储电路因为考虑到密码锁的实际应用,要求掉电时密码不会丢失,所以密码不储存在单片机的RAM里,而是储存在外面扩展的EEPROM里,因此本文选用AT24C02芯片单片机通过串口通信。

AT24C02是ATMEL公司生产的I2C串行EEPROM芯片45,存储量为256字节。

AT24C02的操作时序符合标准的I2C规范。

通过SCLK(时钟线)和SDA(数据线)两线分别与89C51的P1.2和P1.3相连,对芯片进行读写操作。

SCLK为时号,SDA传送双向数据信号。

图3.8掉电存储电路图3.4.4蜂鸣报警电路按照题目的要求,当连续三次密码输入错误时,系统蜂鸣报警,我们采用实验板上的压电式蜂鸣器,当P1.4输出低电平时,三极管导通,蜂鸣器发音。

图3.9蜂鸣报警电路图3.5元件清单本次设计所用元件见表3.2表3.2元件清单器件名称数量89C511个82791个6MHz晶振1个RT12864Hz1个74ALS1381个74LS2451个74LS5731个74LS001个74LS081个AT24C021个电阻若干按键18个第4章软件程序设计4.1程序流程图根据设计要求,我们设计了如下的流程图,满足用户在任何时刻按下任何键均有反应。

图4.1主程序流程图说明:

以上流程图仅显示了该密码锁的主要功能,一些具体功能的实现在后文子程序中将做具体讲解。

4.2系统初始化系统的初始化包括如下方面:

1、8279的扫描模式为编码扫描;2、内部定时/计数器T0的设定;3、液晶显示屏模式的设定。

4.3按键识别设计在系统初始化并读取密码完成后,液晶显示界面1“状态:

closed任意键输入密码”,提示用户可以输入密码。

此时程序即不断的扫描按键,检查是否有任意键被按下。

如果有,则开始输入密码,此时液晶屏显示界面2“密码:

”在输入密码的时候,难免有输入错误的时候,我们特此设计了清零键,当输入密码时,检测到清零键的按下,我们将清除所有输入的密码,然后重新进入界面2重新输入密码,在六位密码输入结束后,我们也设计了确定键,当检测到确定键按下时,开始密码比较。

具体的流程图如4.2所示图4.2按键识别流程图图4.3界面1图4.4界面24.45s定时设计根据该设计的附加要求“第一次输入密码与开锁的时间超过5s,红灯闪烁,并发报警警报”。

我组对此的理解是在密码输入错误之后,重新输入密码到开锁的时间不超过5s。

利用89C51内部的定时器T0,用中断方式进行管理,初值在系统初始化时已经设置好,采用定时器方式1,每次定时25ms,设置变量time,每次定时中断,time自加,当第一次密码输入错误后,便打开定时器中断,只有在5s内开锁成功,中断才关闭,否则将红灯闪烁并蜂鸣报警,显示为界面3。

图4.5界面34.5密码修改设计为了丰富电子密码锁的功能,我们在完成设计的基本要求之外,额外增添了密码修改功能。

即当用户密码输入正确后,可以进入界面4功能选择模块,按下A键便可修改密码,此时显示界面5“新密码:

”输入6位密码后按确定键,这时显示界面6“再次输入:

”,需要再次输入密码进行确认,若两次输入密码一致,则显示“Succeeded”新密码便改好了,若前后两次输入不一致,则显示“TypeError”,然后返回到功能选择界面4。

图4.6界面4图4.7界面5图4.8界面6图4.9界面7参考文献1.Intel8279datesheet2.张志,高大志,杨为民等微控制器原理及接口技术实验教程M沈阳:

东北大学出版社,20043.闻绍飞C51单片机实验指导书M沈阳:

东北大学出版社,20004.马忠梅,籍顺心单片机的C语言应用程序设计M北京:

北京航空航天大学出版社,20055.李朝青单片机原理及接口技术M北京:

北京航空航天大学出版社,2008附录电子密码锁系统程序源代码#include#include#include/*Ports*/#definec8279XBYTE0x2021/8279命令端口#defined8279XBYTE0x2020/8279数据端口#definewc_adXBYTE0x2070/lcd写命令端口#definewd_adXBYTE0x2071/lcd写数据端口#definers_adXBYTE0x2072/lcd读状态端口#definerd_adXBYTE0x2073/lcd读数据端口/*VariableStatement*/sbitg_led=P10;/绿灯sbitr_led=P11;/红灯sbitSCL=P12;/24c02时钟线sbitSDA=P13;/24c02数据线sbitalm=P14;/蜂鸣报警unsignedcharbdataflag=0xff;/标志位变量sbitkey_flag=flag7;/按键标志sbitenter_flag=flag6;/enter键标志sbitperr_flag=flag5;/密码错误标志sbitterr_flag=flag2;/输入错误标志sbitclr_flag=flag4;/清除标志sbitre_flag=flag3;/返回退出标志unsignedcharxdatapsave6;/存储的密码数组unsignedcharxdatapinput6;/输入的密码数组unsignedcharerr_num=0;/密码输入错误次数signedcharp_num=0;/密码位数unsignedcharerr;/密码比较差值unsignedcharbdatastatus;/lcd状态sbitbusy=status7;/lcd忙状态bdatacharcom_data;/24c02读写数据sbith_bit=com_data7;/24c02读写数据高位sbitl_bit=com_data0;/24c02读写数据地位unsignedcharcom;/8279读入键值unsignedinttime=0;/定时器中断计数/*FunctionStatement*/voidini_int(void);voidini_8279(void);voidIni_all(void);voiddis_1st(void);voidc_start(void);voidc_stop(void);voidack(void);voids_move(chara);voiddelay(inttime);unsignedcharrd_24c02(chara);voidwr_24c02(chara,charb);voidlcd_busy(void);voidini_lcd(void);voidpos(unsignedcharx,unsignedchary);voiddis(unsignedcharx,unsignedchary,unsignedchar*s);voidclr(void);voidp_err(void);voiddis_enter(void);voidp_rst(void);voidtm_err(void);voidread_key(unsignedchar*sr,unsignedcharx,unsignedchary,unsignedchar*s,unsignedcharpos);voidp_cmpr(unsignedchar*pw1,unsignedchar*pw2,unsignedcharflag);voidint0(void)interrupt0using1c8279=0x50;/读取FIFIRam命令com=d8279&0x0f;/读取键值if(com=0x0e)enter_flag=0;/读入的是enter键if(com=0x0c)clr_flag=0;/读入的是清除键key_flag=0;voidintT0(void)interrupt1using2TH0=(65536-50000)/256;TL0=(65536-50000)/256;/定时初值,100mstime+;/定时中断计数if(time=100)/计数100次,到达10sET0=0;tm_err();/*InterruptEnable*内部资源初始化程序*/voidini_int(void)EA=1;EX0=1;ET0=1;/开中断TMOD=0x01;/定时器模式TH0=(65536-50000)/256;TL0=(65536-50000)/256;/定时器初值PT0=1;/中断优先级,T0最高/*AllInitializing*整体初始化程序*/voidIni_all(void)clr();ini_lcd();/lcd初始化ini_8279();/8279初始化ini_int();/内部资源初始化key_flag=1;/按键标志位初始化/*Menu1Display*显示初始界面*/voiddis_1st(void)dis(0,1,状态:

closed);/调用字符串显示程序dis(0,2,任意键输入密码);/*NameDisplay*显示姓名*/voiddis_name(void)dis(0,1,);/调用字符串显示程序dis(0,2,,);/*8279Initializing*8279初始化*/voidini_8279(void)c8279=0x00;/编码扫描方式/*24C02Start*24C02启动程序*/voidc_start(void)SCL=0;_nop_();SDA=1;_nop_();SCL=1;_nop_();SDA=0;_nop_();SCL=0;_nop_();/两线产生下降沿/*24C02Stop*24c02停止程序*/voidc_stop()SCL=0;_nop_();SDA=0;_nop_();SCL=1;_nop_();SDA=1;/两线产生上升沿_nop_();SCL=0;_nop_();/*RespondFunction*24c02应答等待程序*/voidack()while(SDA);/等待24c02应答SCL=0;_nop_();/*DataShiftFunction*24c02串行输出移位程序*a:

移位写入的字符*/voids_move(chara)dataunsignedchari;com_data=a;for(i=0;i8;i+)/8位逐位写入SCL=0;SDA=h_bit;SCL=1;com_data=com_data*2;/左移一位SCL=0;_nop_();SCL=1;_nop_();/上升沿/*DelayFunction*延迟程序*/voiddelay(unsignedinttime)inti;for(i=0;i=time;i+)i=i;/*ReadDataFrom24C02*从24c02读数据*/unsignedcharrd_24c02(chara)dataunsignedchari,command;c_start();/启动24c02command=0xa0;s_move(command);/送写入指令ack();/等待应答s_move(a);/写入寄存器号ack();c_start();command=0xa1;s_move(command);/送读取指令ack();SDA=1;for(i=0;i8;i+)/逐位读取数据com_data=com_data*2;/左移一位SCL=0;_nop_();SCL=1;_nop_();l_bit=SDA;/最低位写入c_stop();return(com_data);/返回读取的数据/*WriteDatato24C02*送24c02数据*/voidwr_24c02(chara,charb)unsignedchardatacommand;c_start();/启动24c02command=0xa0;s_move(command);/写入指令ack();s_move(a);/写入寄存器号ack();s_move(b);/写入数据ack();c_stop();_nop_();/*LCDbusyfunction*LCD忙状态检测程序*/voidlcd_busy(void)dostatus=rs_ad;/读取LCD状态,最高位判断是否忙while(busy);/*LCDInitializing*LCD初始化*/voidini_lcd(void)lcd_busy();wc_ad=0x30;lcd_busy();wc_ad=0x0C;lcd_busy();wc_ad=0x01;lcd_busy();wc_ad=0x02;lcd_busy();/*LCDDisplayPositionFunction*LCD显示位置指令写入程序*x:

字符串显示位置x坐标;y:

字符串显示位置y坐标*/voidpos(unsignedcharx,unsignedchary)unsignedchartemp;switch(y)/判断显示的行数case1:

temp=0;break;case2:

temp=2;break;case3:

temp=1;break;case4:

temp=3;lcd_busy();wc_ad=0x80+temp*0x08+x;/计算指令代码,写入位置指令/*LCDDisplayFunction*LCD显示程序*x:

字符串显示位置x坐标;y:

字符串显示位置y坐标*s:

显示的字符串*/voiddis(unsignedcharx,unsignedchary,unsignedchar*s)pos(x,y);/显示位置指令写入lcd_busy();while(*s!

=0)/字符串是否结束wd_ad=*s;/写入一个字符s+;/指向下一个字符/*LCDClearFunction*LCD屏幕清除程序*/voidclr(void)wc_ad=0x01;lcd_busy();/写入清除命令,等待写入结束/*PasswordFailured*密码错误服务程序*/voidp_err(void)clr();g_led=1;r_led=0;/密码错误,绿灯灭,红灯亮dis(2,2,failed);/输入错误delay(0x6000);clr();if(err_num!

=2)dis(0,2,PleaseReEnter);/如果没到3次输入,提示重新输入delay(0x6000);clr();/*TimeOut*超时服务程序*超时,系统锁死*/voidtm_err(void)c

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1