1、201X年小学期单片机设计实验报告题目:基于16F877的电子密码锁班 级: 班内序号: 实验组号: 学生姓名: 指导教师: 期中检查教师评语指导教师签字: 年 月 日基于16F877的电子密码锁 实验摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加
2、其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作、记住密码即可开锁等优点。目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。本系统由16F877单片机系统(主要是16F877单片机最小系统)、44矩阵键盘、LCD1602显示和报警系统等组成,具有设置、修改四位用户密码、输入提示音、密码错误报警等功能(本设计由单片机控制LCD显示,密码正确显示password ok! 密码错误显示wrong,please reset!用户reset后进行重新输入。由单片机控制矩阵键盘含有0-9数字键和A-F功能键。按F键,则进行
3、密码重置功能)。本系统成本低廉,功能实用。 (宋体 五号)AbstractIn daily life and work, the department of housing and security, unit documents, financial statements and some personal information to save more in order to lock the ways to solve. If use the traditional mechanical key to open the lock, people often need to carry
4、multiple keys, use very convenient, and the key missing after security is compromised. With anti-theft alarm function such as electronic combination lock instead of password quantity is little, security, poor mechanical combination lock is inevitable trend. With the continuous development of science
5、 and technology, people in daily life the demand is higher and higher safety insurance device. To meet the requirements of people on the use of the lock, increase its safety, use the password instead of the key combination lock arises at the historic moment. Combination lock with high safety, low co
6、st, low power consumption, easy operation, remember password lock, etc.Currently use electronic combination lock is mostly based on single chip microcomputer technology, single chip microcomputer as the main device, the encoder and decoder for software. This system consists of 16 f877 microcontrolle
7、r system (mainly minimum 16 f877 microcontroller system), 4 * 4 matrix keyboard, LCD1602 display and alarm system, etc, and has set up four, modify user password, password, input prompt error alarm functions (this design by the single chip microcomputer control LCD display, the password correctly di
8、splay the password ok! Wrong password shows wrong, both please reset! The user to enter again after reset. By single-chip microcomputer control matrix keyboard contains 0-9 number keys and A - F function keys. Press the F key, then carries on the password reset function). This system is low cost, fu
9、nction and practical.WM function to control its turn. And this is so called navigating aptitudinally .关键字单片机microcontroller 芯片CMOS chip 16F877 一、PIC16F877系列单片机简介PIC16F87X ( 含873P874P876P877) 是美国微芯(Microchip) 公司推出的高性能单片机,除具有单片机的通用资源外,该系列单片机还采用哈佛总线结构、二级指令流水线取指方式、精简指令集(RISC)和内部具有E2 PROM 数据存储器及FLASH 结构的
10、程序存储器、仅35 条单字节单周期指令、在系统串行编程技术和在线调试技术。 因此采用该系列单片机的产品具有低成本、低功耗、高速度、高可靠性、体积小、性价比高等特点。 其芯片引脚图如图1 所示。 另外,它内部的E2 PROM 数据存储器不仅具有掉电保护数据的功能,更重要的是它的读写操作均是由单片机内部时序控制,即外部电路无法对其进行访问, 因而具有极高的数据保密性,这使得PIC16F87X在加密性产品如智能IC 卡、密码锁、电子防盗系统等方面有很广泛的应用。二.实验论证与比较1.总体系统组成键盘电路单片机 16F877电源电路LCD显示电路复位电路开/关锁电路晶振电路显示电路报警电路电路主要分8
11、个模块,即电源电路、复位电路、晶振电路、报警电路、键盘电路、LCD显示电路、开/关锁电路、声音电路。由单片机主要控制、实现密码锁功能。1. 1电源电路模块 从电源插座进来的是9V直流电,经一片三端稳压器,将其转换为5V的稳定电压。电源滤波的重要性,一个电路板的滤波特性如果不好,严重时将会影响整个电路板不能正常工作。所以要注意一个大电容和一个小电容并联滤波,电源线要粗,走线要合理,模拟电路最好大面积接地。其主要作用是为电路提供工作电压,保证电路正常工作。1.2复位电路模块主要用于对电路进行手工复位。Osc1 5vGND 空1.3晶振电路模块 晶振主要就是为单片机工作提供一定的工作频率。1.4报警
12、电路模块 主要是用于密码输入错误时,鸣声提醒用户密码输入错误。1.5键盘电路模块 键盘采用4* 4矩阵键盘 ,行线连接到RD端口,列线连接到RB接口。16 个键分别为09 的数字键及AF 的功能键,F键则表示密码重置。键盘主要用于输入密码或进行功能、状态切换。1.6LCD显示电路模块当通电时LCD显示password,当密码输入正确显示ok,不正确则显示wrong,please reset。1.7开/关锁电路模块 当密码输入正确时,单片机输出高电平,则继电器打开,表示锁开。1.8显示电路模块 1kohm 主要用于密码输入时,显示已输入。当密码输入正确则灯一直亮,输入错误则一直闪烁,提醒用户。
13、三系统总体设计3.1系统框图灯提示灯提示其他Nreset报警Y开始初始化模式选择识别按键密码输入手动清除密码比较开门旧密码输入新密码输入存入缓存区再次输入密码重新输入设置完返开始NFN 0-E00 -Y3.2电路总图四.硬件连接五.调试过程程序开始就进入main,执行初始设置后,进行LCD屏幕初始化。单片机就开始执行键盘扫描是否有输入阶段,根据采集到的键盘信息,做出分析,进行密码重置或者输入密码比较。 调试过程中我遇到了很多问题,也就是在这些问题中,逐渐学会了MPLAB的使用和用汇编语言编程。在此,列举几个调试过程中比较典型的问题。5.1对屏幕初始化不能完成 在小学期的出始阶段,我和搭档秦永宁
14、决定在最开始阶段,我俩都进行程序编程,对汇编语言进行学习。我们分模块编写,我进行屏幕初始化程序编写,搭档秦永宁写键盘扫描程序。在后面阶段,永宁主软件,我主硬件。 刚开始学单片机以及汇编语言的时候,翻看过的内容,也只是记得一点点皮毛,没有真正的理解。特别是看手册时看不懂,学校发的两本书上并没有初始化的程序。所以请教同学,同学告诉我,手册上有初始化的过程,需要认真看看。所以我就认真的看了一个早上,终于把手册上的内容看懂了。所以就开始编程,在编程的过程中调试build all时,有出现了一些error,通过改正,build all 终于成功,初始化程序完成 。(五号 宋体)初始化程序如下:;*初始化
15、程序*CHUSHIHUA MOVLW D16 ; MOVWF COUNT ;初始化count为16DELAY16MS ;延时16ms CALL DELAY1MS ; DECFSZ COUNT,1 ;(1/2)count送count并判断结果是否为0? ;是0,跳出循环,否循环回去 GOTO DELAY16MS ; MOVLW B00111000 ;将38h送到w MOVWF PORTD ;将38h送到portd MOVLW B00000010 ;将02h送到w MOVWF PORTE ;将02h送到porte,写数据 BCF PORTE,1 ;将porte的第一个位置清0 MOVLW D5 ;
16、将5送到w MOVWF COUNT ;将count赋值为5DELAY5MS ;延时1ms CALL DELAY1MS ; DECFSZ COUNT,1 ; GOTO DELAY5MS ; MOVLW B00111000 ;将38h送到w MOVWF PORTD ;将38h送到potd MOVLW B00000010 ;将02h送到w MOVWF PORTE ;将02h送到porte,写数据 BCF PORTE,1 ;将porte的第一个位置清0 MOVLW D3 ; MOVWF COUNT ;DELAY120US ;延时120um CALL DELAY40US ; DECFSZ COUNT,1
17、 ; GOTO DELAY120US ; MOVLW B00111000 ; MOVWF PORTD ; MOVLW B00000010 ; MOVWF PORTE ; BCF PORTE,1 ;* CALL DELAY40US ; MOVLW B00111000 ; MOVWF PORTD ; MOVLW B00000010 ; MOVWF PORTE ; BCF PORTE,1 ; CALL DELAY40US ; MOVLW B00001000 ;将08h送到w,关显示 MOVWF PORTD ;将o8h送到portd MOVLW B00000010 ;将02h送到w MOVWF POR
18、TE ;将02h送到porte BCF PORTE,1 ;将porte的第一个位置清0 CALL DELAY40US ; MOVLW B00000001 ;将01h送到w,清屏 MOVWF PORTD ;将o1h送到portd MOVLW B00000010 ; MOVWF PORTE ;将02h送到porte BCF PORTE,1 ;将porte的第一个位置清0 CALL DELAY1MS ; MOVLW D16 ; MOVWF COUNT ;将count设置为16DELAY640US ;延时640us CALL DELAY40US ; DECFSZ COUNT,1 ; GOTO DELA
19、Y640US ; MOVLW B00000110 ;将06h送到w,设置输入方式 MOVWF PORTD ; MOVLW B00000010 ; MOVWF PORTE ; BCF PORTE,1 ; CALL DELAY40US ; MOVLW B00001101 ;将0DH送到w,* MOVWF PORTD ;将0DH送到portd MOVLW B00000010 ; MOVWF PORTE ;将02h送到porte BCF PORTE,1 ;将porte的第一个位置清05.2用EEPROM编写密码重置时,重置的密码不能写入EEPROM在我们的实验进行到一定阶段,我去搭面包板,搭完后,我们
20、将已经编好的LCD显示程序下载到单片机当中,加上电源,LCD显示正确。所以我就趁着时间看书,当看到 PIC单片机实用教程提高篇第一章时,所以我就想尝试着利用EEPROM编写密码重置问题。在编写的过程中,为了调试方便,我就借用老师的实验箱进行下载调试。而调试了好几天,并没有出现进展。所以就开始画程序流程图,画完后对程序进行修改。当进行单步调试时,发现进行到查表程序时,程序下一步走得并不正确。请教老师后,把查表程序写在了程序最前面,就解决了问题。可是用EEPROM写入密码还是不正确。由于时间问题,我就去焊接电路板了。 到最后验收时,老师让我继续编写用EEPROM编写密码重置功能,当最后我想放弃,老
21、师一直在鼓励我,在不懈努力下以及老师的帮助下终于成功了。这看似是一个小问题,但它却告诉我,在学习单片机的过程中一点点微小的过失可能就会导致自己的程序看不到结果,不能忽略学习过程中的一点一滴疑问。也只有这样才能真正学会、学到和学好知识。*EEPROM烧写程序*WRITE BSF STATUS,RP0 BSF STATUS,RP1 BTFSC EECON1,WR GOTO $-1 BCF STATUS,RP0 MOVF ADDKEY,0 MOVWF EEADR MOVF KEY,0 MOVWF EEDATA BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,WR
22、EN MOVLW 55H MOVWF EECON2 MOVLW 0AAH MOVWF EECON2 BSF EECON1,WR BCF EECON1,WREN INCF ADDKEY,1 RETURN*EEPROM读程序*READ BCF STATUS,RP0 BSF STATUS,RP1 MOVF ADDR,0 MOVWF EEADR BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,RD BCF STATUS,RP0 MOVF EEDATA,0 MOVWF WORD_1 RETURN5.3焊接电路时,电路焊接错误 在最开始时,焊接电路,由于是第一次焊接电
23、路,对电路焊接不太认真以及没有做好准备,所以焊接好的电路并不出现正确的结果。对电路进行检查时,发现电路焊接时电路焊接错误,用焊吸吸掉锡后,对电路进行改正,可是却依然不出现正确结果。所以用万用表对电路进行检查,发现两个结点之间电压不应该相同,而测量结果却一样,改后却依然一样。所以决定重新焊接一块板子,当第二块板子焊接完后,出现了正确结果。 这个小波折告诉我,知识的积累和掌握不能仅仅依靠课本,还要结合实践进一步理解,这样才能加深印象,融会贯通,也只有这样才能真正学以致用。这个小挫折告诉我只有联系实际,在实践中才能真正找出自己的错误,理论联系实际才能真正学到知识。六.实验心得体会 对于整个实验的心得
24、体会,上面已经提到很多了,不过,还是有好深刻的感觉和触动。 其一,在小学期以前我没有对单片机没有任何概念。在刚刚接触到单片机时,我可以说是一窍不通,甚至对于单片机究竟是什么也不能很精确地表达出来。经过网上查询以及了解,定下几个想做的目标,经过一个个筛选,最后确定我们做一个密码锁。说实在话,我当时心里也没有太大的信心和勇气,不过这些都得去学,所以就一头扎进学习的过程。 其二,3星期单片机的学习让我增强了自信心。学习单片机的过程中,我也不是没有怀疑过自己的能力,而是我在学习的过程中,从对单片机的一无所知,对繁琐的汇编语言的畏惧,到一步一步进行单步调试,再到能够发现问题并经过思考来解决问题,我感觉到
25、自己在进步,也感受到只要每天努力一点点,希望就会再接近一点点,离成功的距离也就会再接近一点点,也就是这些一点点的努力和距离告诉我要继续坚持,告诉我要相信自己,因为只有相信自己,不断努力,才能战胜自己的弱势,得到自己想要的结果。 其三,我非常感谢向辅导我的几位老师致谢,您们辛苦了!在学习的过程中,我发现了学习中的乐趣。谢谢您们在我想放弃的时候还一直给我指导,给我鼓励。七.参考文献:PIC单片机实用教程基础篇 (五号 宋体)李学海北京航空航天大学出版社使用说明:的确是一本不可或缺的教材,本书列举了很多实用的具有实战意义的例子,单片机入门就是通过把这本书里的好例子一字一行敲进电脑去来实现的。PIC单
26、片机实用教程提高篇李学海北京航空航天大学出版社使用说明:继承了前面基础篇的风格,例子也具有实战意义,主要讲RA、TMR2的使用和CCP模块的PWM脉宽调制功能。附录: 程序汇编代码: LIST P=16F877,R=DEC ;定义器件,默认为十进制#includeTMR0 EQU 01H ;定义定时器/计数器0寄存地址PCL EQU 02H ;定义程序指针寄存器STATUS EQU 3H ;定义状态寄存器地址OPTION_REG EQU 81H ;定义选项寄存地址INTCON EQU 0BH ;定义中断控制寄存地址PORTB EQU 6H ;定义端口B的数据寄存器地址PORTC EQU 7H
27、;定义端口C的数据寄存器地址PORTD EQU 8H ;定义端口D的数据寄存器地址PORTE EQU 9H ;定义端口E的数据寄存器地址 TRISC EQU 87H ;定义端口C的方向寄存器TRISA EQU 85H ;定义端口A的方向寄存器TRISB EQU 86H ;定义端口B的方向寄存器TRISD EQU 88H ;定义端口D的方向寄存器TRISE EQU 89H ;定义端口E的方向寄存器COUNT EQU 20H ;定义一个计数器变量寄存地址TMR0B EQU D252 ;定义TMR0寄存地址初始值256-4=252)RP0 EQU 5H ;定义状态寄存器中的页选位RP0T0IF EQ
28、U 2 ;定义TMR0溢出标志位的位地址F EQU 1 ;定义目标寄存器指示标号COUNT1 EQU 21H ;定义计数器状态变量COUNT2 EQU 23H ;COUNT3 EQU 24H ;COUNT4 EQU 25H ;COUNT5 EQU 27H ;COUNT6 EQU 28H ;VAL EQU 30H ;定义键盘的状态变量WORD_1 EQU 22H ;初始密码WORD_2 EQU 26HWORD_3 EQU 2AHWORD_4 EQU 2BHKEY_1 EQU 47H ;用户输入密码KEY_2 EQU 48HKEY_3 EQU 49HKEY_4 EQU 4AHN EQU 52H ;
29、定义外循环变量MM EQU 53H ;内循环变量NTEMP EQU 29HW EQU 0 ;定义传送目标寄存器为W的指示位F EQU 1 ;定义传送目标寄存器为RAM的指示位T0IF EQU 2 ;定义TMR0中断标志位的地址位T0IE EQU 5 ;定义TMR0中断矢能位的地址位INTE EQU 4 ;定义外部中断矢能位的地址位INTF EQU 1 ;定义外部中断标志位的地址位RBIF EQU 0 ;定义RB口变化中断标志位的位地址OPTION_REG EQU 81H ;定义选项寄存器地址OPTION_TEMP EQU 0A6H ;在bank1定义选项寄存器的备份寄存器地址SOUNDDELA
30、Y1 EQU 31H ;声音频率变化计数器,从1.83.55KHZFRE_COUNT EQU 32H ;同一频率的重复次数保存地址FRE_REPEAT EQU 33H SOUND_TEMP EQU 34HTEMP1 EQU 35H ;暂存寄存器S_LOOP EQU 37H ;93-47=46S_MAX EQU 73H ;最低频率1.8K 93*3=280US*2S_S_MIN EQU 36H ;最高频率3.55K 47*3=140*2S_S_REPEAT EQU 4H ;同一频率重复次数;*;* ORG 000H ;MAIN NOP BSF STATUS,RP0 ;文件寄存到BANK1 MOV
31、LW 00H ;将端口C的方向控制字先送到W MOVWF TRISC ;然后再转送到端口C的方向寄存器 MOVLW 0FFH ;将端口B的方向控制字先送到W MOVWF TRISB ;然后再转送到端口B的方向寄存器 MOVLW 0FFH ;将端口A的方向控制字先送到W MOVWF TRISA ;然后再转送到端口A的方向寄存器 CLRF TRISD ; CLRF TRISE ; MOVLW 02H ;31H MOVWF OPTION_REG ;设置分频比“1:8” BCF STATUS,RP0 ;恢复到文件寄存器BANK0 CLRF PORTC ;端口寄存器清0 MOVLW 31H ;定义初始密
32、码 MOVWF WORD_1 ;1 MOVLW 32H MOVWF WORD_2 ;2 MOVLW 33H MOVWF WORD_3 ;3 MOVLW 34H MOVWF WORD_4 ;4;*CHUHUA MOVLW D16 ; MOVWF COUNT ;初始化count为16DELAY16MS ;延时16ms CALL DELAY1MS ; DECFSZ COUNT,1 ;(1/2)count送count并判断结果是否为0? ;是0,跳出循环,否循环回去 GOTO DELAY16MS ; MOVLW B00111000 ;将38h送到w MOVWF PORTD ;将38h送到portd M
33、OVLW B00000010 ;将02h送到w MOVWF PORTE ;将02h送到porte,写数据 BCF PORTE,1 ;将porte的第一个位置清0 MOVLW D5 ;将5送到w MOVWF COUNT ;将count赋值为5DELAY5MS ;延时1ms CALL DELAY1MS ; DECFSZ COUNT,1 ; GOTO DELAY5MS ; MOVLW B00111000 ;将38h送到w MOVWF PORTD ;将38h送到potd MOVLW B00000010 ;将02h送到w MOVWF PORTE ;将02h送到porte,写数据 BCF PORTE,1
34、;将porte的第一个位置清0 MOVLW D3 ; MOVWF COUNT ;DELAY120US ;延时120um CALL DELAY40US ; DECFSZ COUNT,1 ; GOTO DELAY120US ; MOVLW B00111000 ; MOVWF PORTD ; MOVLW B00000010 ; MOVWF PORTE ; BCF PORTE,1 ;* CALL DELAY40US ; MOVLW B00111000 ; MOVWF PORTD ; MOVLW B00000010 ; MOVWF PORTE ; BCF PORTE,1 ; CALL DELAY40US ; MOVLW B00001000 ;将08h送到w,关显示 MOVWF PORTD ;将o8h送到portd MOVLW B00000010 ;将02h送到w MOVWF PORTE ;将02h送到porte BCF PORTE,1 ;将porte的第一个位置清0 CALL DELAY40US ; MOVLW B00000001 ;将01h送到w,清屏 MOV