单片机课程设计报告-基于AT89C52单片机的电子密码锁设计.doc_第1页
单片机课程设计报告-基于AT89C52单片机的电子密码锁设计.doc_第2页
单片机课程设计报告-基于AT89C52单片机的电子密码锁设计.doc_第3页
单片机课程设计报告-基于AT89C52单片机的电子密码锁设计.doc_第4页
单片机课程设计报告-基于AT89C52单片机的电子密码锁设计.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

沈阳理工大学课程设计专用纸 .18摘 要随着社会的发展进步,密码锁逐渐成为我们生活中很重要的一部分,密码锁是安全的一个很好的保障措施。本论文设计一个基于单片机和存储器的,能够进行开锁,上锁,修改密码的电子密码锁。电子密码锁是现代电子科技与安全结合的产物。它在现代锁业扮演着重要的角色,本文的主要内容是用at89c52单片机为核心控制元件,用存储器24c04进行存储密码锁的密码,当用户输入的密码与存储器储存的密码相同时,即可开锁成功,并也可以修改密码,若不相同,则不能开锁,并提示密码错误。关键词:at89c52单片机 密码锁 lcd 矩阵键盘 目录摘 要1目录21.引 言32. 总体设计42.1基本原理42.2系统总体框图及设计思路43.详细设计53.1 硬件设计53.2软件设计.83.2.1程序设计思路83.2.2 程序流程图83.2.3 程序代码94. 系统调试及分析155.心得体会17参考文献181.引 言单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了i/o设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。 密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的数字密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。其特点是保密性好,随机开锁成功率几乎为零。密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。无活动零件,不会磨损,寿命长。使用灵活性好,不像机械锁必须佩带钥匙才能开锁。数字密码锁操作简单易行,一学就会。2. 总体设计2.1基本原理电子密码锁是才用存储芯片24c04进行存放密码,单片机可以对24c04进行读取密码和写入密码,本密码锁是事先吧初始密码123456写入24c04中,用户输入密码后,通过对用户输入的密码和24c04中的密码进行比较,若比较相同则提示开锁称成功,开锁后,用户可以修改密码,即把用户输入的新密码写入到24c04当中,并清除之前的密码,按下保存键后,继成功修改密码。其中24c04的原理如下:at24c04是美国atmel公司的低功耗cmos型e2prom,内含2568位存储空间,具有工作电压宽(2.55.5 v)、擦写次数多(大于10000次)、写入速度快(小于10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且他是采用了i2c总线式进行数据读写的串行器件,占用很少的资源和io线,并且支持在线编程,进行数据实时的存取十分方便。at24c04中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。i2c总线是一种用于ic器件之间连接的二线制总线。他通过sda(串行数据线)及scl(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。 at24c02正是运用了i2c规程,使用主从机双向通信,主机(通常为单片机)和从机(at24c04)均可工作于接收器和发送器状态。主机产生串行时钟信号(通过scl引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ack。at24c04的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。2.2系统总体框图及设计思路电子密码锁24c04存储密码矩阵键盘进行输入lcd显示提示信息 总体设计思路:本设计利用单片机灵活的编程设计和丰富的io端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加掉电存储。其中,0-9为用户可以输入密码可选择的数字,10号功能为开锁键,11号功能为上锁,12号功能为输入修改后的密码,13号功能为保存密码,14号功能为重新输入。利用lcd来显示提示信息,用led来提示密码锁的状态。3.详细设计3.1 硬件设计1芯片及原理介绍(一) at89c52at89c52与mcs-51单片机产品兼容 、8k字节在系统可编程flash存储器、 1000次擦写周期、 全静态操作:0hz33mhz 、 三级加密程序存储器 、 32个可编程i/o口线 、三个16位定时器/计数器 八个中断源 、全双工uart串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针 、掉电标识符 。 p1口引脚特殊功能p1.0t2(定时器t2外部输入)p3口引脚p3.0rxd(串行输入口)p3.1txd(串行输出口)p3.2(外部中断0)p3.3(外部中断1)p3.4t0(定时器0外部输入)p3.5t1(定时器1外部输入)p3.6wr(外部数据存储器写选通)p3.7rd(外部数据存储器读先通)at89c52的一些特殊功能口,如下表所示:(二) 矩阵键盘使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的i/o线的数目,在按键比较多的时候,通常采用这样方法。其原理如图。本设计中矩阵键盘接在单片机的p1口。每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要n条行线和m条列线,即可组成具有nm个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。(三) lcd1602本系统设计的显示电路是为了给使用者以提示而设置的。本系统的显示采用了lcd1602作为显示模块,其能够同时显示16x02即32个字符。lcd在系统中,其d0-d7引脚分别接单片机的p0口、vss和vdd分别接电源和地线、vee为液晶亮度调节按钮(可接电位器)、rs为数据或命令的选择端接p2.0、rw为读写的选择端接p2.1、e为使能信号接p2.2。如图所示。(四) 24c04本设计中为了在系统掉电时能够保存系统的设置密码,使用了具有i2c总线接口的e2prom的24c04芯片来保存密码锁的密码。scl串行时钟 at24c02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。 sda串行数据/地址 at24c02 双向串行数据/地址管脚用于器件所有数据的发送或接收,sda 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-or)。 a0、a1、a2器件地址输入端 这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用at24c02 时最大可级联8个器件。如果只有一个at24c02被总线寻址,这三个地址输入脚(a0、a1、a2 )可悬空或连接到vss,如果只有一个at24c02被总线寻址这三个地址输入脚(a0、a1、a2 )必须连接到vss。 wp写保护 如果wp管脚连接到vcc,所有的内容都被写保护只能读。当wp管脚连接到vss 或悬空允许器件进行正常的读/写操作2.硬件原理图p1口通过连接1个矩阵键盘,作为密码输入和功能选择按键;p0口接lcd1602的8位数据通信线;p2.0,p2.1,p2.2接lcd控制端;p3.2和p3.3接24c04。 3.2 软件设计. 3.2.1程序设计思路电子密码锁工作的主要过程是lcd提示开始选择操作功能(选择开锁还是更改密码),通过10号键盘开锁,13号14号进行密码的修改与保存。当用户选择开锁时,通过键盘输入开锁密码。如果密码输入正确,则lcd提示密码正确、led灯亮表示开锁。如果密码输入错误则lcd提示密码错误。当用户选择更改密码功能时,要求用户先输入当前密码。当密码正确时lcd提示用户进一步操作。单片机向24c04写入新密码,否则提示错误并返回初状态。3.2.1程序流程图开始功能键盘扫描检测子程序输入开锁还是改密码?提示输入开锁密码lcd用*动态提示已输入数字提示输入旧密码将已输入的数字暂存与单片机ram判断旧密码是否正确?n提示密码错误调用存于24c04的密码与其比较?y清单片机ram密码暂存区提示输入新密码yn判断输入的密码是正确?第一个led亮n提示出错y将新密码写入at24c02 结束提示密码修改成功3.2.3 程序代码1、预定义部分#include#include#include#include #include #include #define uchar unsigned char#define uint unsigned int/上次按键和当前按键序号,该矩阵中序号范围015,16表示无按键uchar pre_keyno=16,keyno=16;uchar code title_text=your password.;/标题字符串uchar dsy_buffer16= ;/显示缓冲uchar userpassword7= ;/用户输入的密码uchar iic_password7;uchar is_valid_user = 0;uchar i = 0;void beep();uchar clear_password();sbit led_open = p20;/开锁灯亮sbit beep = p37;/蜂鸣器2、功能控制void key_main() p1 = 0xf0; if(p1 != 0xf0) keyno = keys_scan(); /扫描键盘获取键序号keyno if(pre_keyno != keyno) if(i=6) switch ( keyno ) case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: if (i = 0) display_string( ,0x40); userpasswordi = keyno + 0; userpasswordi+1 = ;/dsy_bufferi = userpasswordi; dsy_bufferi = *; dsy_bufferi+1 = ; display_string(dsy_buffer,0x40); i+;break; case 10: /按a键开锁 if (strcmp(userpassword,iic_password) = 0) led_open = 0; /点亮led clear_password(); display_string(unlock ok! ,0x40); is_valid_user = 1; else led_open =1; /关闭led clear_password(); display_string(error ! ,0x40); is_valid_user = 0; i = 0; break; case 11: /按b键上锁 led_open =1; clear_password(); display_string(title_text,0x00); display_string( ,0x40); i = 0; is_valid_user = 0; break; case 12: /按c键设置新密码 /如果是合法用户则提示输入新密码 if ( !is_valid_user ) display_string(no rights !,0x40); else i = 0; display_string(new password: ,0x00); display_string( ,0x40); break; case 13: /按d键保存新密码 if ( !is_valid_user ) display_string(no rights !,0x40); else sendstring(0xa0, 0 , userpassword, 6); /重新读入刚写的密码 recstring(0xa0, 0 , iic_password, 6); iic_password6 = ; i = 0; display_string(title_text,0x00); display_string(password saved! ,0x40); break; case 14: /按e键消除所有输入 i = 0; clear_password(); display_string( ,0x40); beep(); pre_keyno = keyno;/delay(100);/ beep(); delay(100); p1= 0xf0; while (p1 != 0xf0); /如果有键未释放则等待 while (p1 = 0xf0); /如果没有再次按下按键则等待 3、24c04读写程序 /-从芯片读取1字节uchar recbyte() uchar i,rd; rd=0x00; sda=1; for(i=0;i8;i+) scl=1;rd=1;rd|=sda;delay4us();scl=0;delay4us(); scl=0; delay4us(); return rd;/-向芯片发送一个字节uchar sendbyte(uchar wd) uchar i; bit ack0; for(i=0;i8;i+) sda=(bit)(wd&0x80); _nop_();_nop_(); scl=1;delay4us(); scl=0; wd=1; delay4us(); sda=1; scl=1; delay4us(); ack0=!sda; scl=0; delay4us(); return ack0;/发送多字节数据函数 uchar sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n)uchar i;start();if(!sendbyte(slave) return 0;if(!sendbyte(subaddr) return 0;for(i=0;in-1;i+)if(!sendbyte(bufferi) return 0; stop(); return 1;/-接收多字节数据函数uchar recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n)uchar i;start();if(!sendbyte(slave) return 0;if(!sendbyte(subaddr) return 0;start();if(!sendbyte(slave+1) return 0;for(i=0;in-1;i+) bufferi=recbyte(); ack(); buffern-1= recbyte(); no_ack(); stop(); return 1;4、lcd1602显示部分/测试lcd忙状态 返回resultbit lcd_bz()bit result;rs = 0;rw = 1;eq = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(p0&0x80);eq = 0;return result; /写指令数据到lcdvoid lcd_wcmd(uchar cmd)rs = 0;rw = 0;eq = 0;p0 = cmd;eq = 1;delay_lcd(1);eq = 0;/写入显示数据到lcdvoid lcd_wdat(uchar dat)while(lcd_bz();rs = 1;rw = 0; p0 = dat;delay_lcd(1);eq = 1;eq = 0;/lcd初始化void lcd_init()lcd_wcmd(0x38);/显示模式设置,5*7点阵,8位数据接口while(lcd_bz();lcd_wcmd(0x0c);/显示开及光标设置不显示lcd_wcmd(0x06);/显示光标移动设置lcd_wcmd(0x01);/显示清屏void display_string(uchar *str,uchar lineno)/在液晶指定行显示字符串uchar i;lcd_wcmd(0x80 + lineno);for(i=0; i4)0x0f;switch(temp)case 1: k+=0;break;case 2: k+=4;break;case 4: k+=8;break;case 8: k+=12;break;default:break ;/keyno=k;return k;6、主函数void main

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论