基于ADuc848的数字密码锁课程设计报告.docx
《基于ADuc848的数字密码锁课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于ADuc848的数字密码锁课程设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
![基于ADuc848的数字密码锁课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-12/7/023dfb81-e104-43ee-9728-2ba261510c90/023dfb81-e104-43ee-9728-2ba261510c901.gif)
基于ADuc848的数字密码锁课程设计报告
湖南大学电气与信息工程学院
本科生课程设计
题 目:
数字密码锁
课 程:
单片机课程设计
专 业:
电气工程及其自动化
班 级:
电自班
学 号:
姓 名:
指导 老师:
设计 时间:
目录
一、任务及设计要求-3-
二、系统原理框图-3-
三、硬件原理图-4-
(一)ADuC848的简要介绍(针对本设计所选择的型号)-4-
(二)单片机引脚分布-4-
(三)电源模块-6-
(四)数码管硬件连接-7-
(五)蜂鸣器和红外发送-8-
(六)复位与下载-8-
(七)按键输入-9-
(八)振荡电路-10-
四、程序-11-
(一)主程序-11-
(二)密码修改流程图-12-
(三)计时主程序流程图-13-
(四)计时中断子程序流程图:
-14-
(五)蜂鸣器中断子程序流程图-15-
(六)蜂鸣器控制程序-15-
(七)键盘扫描程序流程图-16-
(八)程序清单-16-
五、使用说明书-26-
(一)键盘按键分布-26-
(二)按键功能说明-26-
六、心得体会-27-
参考文献-29-
一、任务及设计要求
1)设计一多位电子密码锁,输入密码用“F”表示,输入密码正确,绿灯亮(或显示其它标志、蜂鸣器替代),输入密码错误,红灯亮(或显示其它标志、蜂鸣器替代)
2)具有确定键和取消键,在未确定之前可以取消,重新输入
3)连续输入三次错误密码,红灯闪烁,报警电路动作,键盘锁定
4)具有密码重置、修改功能
5)具有密码输入等待操作时间限制功能,超过限定时间报警
6)显示北京时间,时间可调整
7)可利用蜂鸣器添加提示音
二、系统原理框图
三、硬件原理图
(一)ADuC848的简要介绍(针对本设计所选择的型号)
1、详细情况请参考芯片手册。
2、8051-basedcore、5V供电电压;
3、可以通过串口在线下载程序和单步、断点、运行到某一行等方式调试程序;
4、16位8通道Σ-ΔADC,片内有1.25V参考电压、buffer和PGA;
5、12位电压输出DAC、Dual16-BITΣ-ΔDAC;
6、32kbyte程序存储器、4kbyte用户信息Flash存储器、256RAM+2048XRAM(byte);
7、PLL(12.58MHzmax)(片外只需接32.768kHz晶振);
8、3×16位定时/计数器、看门狗定时器;
9、11中断源(2优先级)、11位堆栈指针;
10、24I/O+8模拟或数字输入;
11、UART、SPI和I2C、高速115200波特率发生;
12、Powersupplymonitor、上电复位、Dual200μA激励电流源。
(二)单片机引脚分布
1.Pin1~4:
(P1.0~P1.3)作为矩阵式键盘或独立按键的输入,P1口只能用于输入,默认用于模拟输入,作为数字输入使用时应先往P1口相应引脚写0,这里可以用P0&=0xf0。
若P2、P3、P0口要作为输入,则应往相应引脚写1。
2.Pin5、6:
AVDD、AGND,模拟电源输入。
3.Pin7、8:
外部参考电压接入,Pin7接AGND。
片内DAC有2.5V内部参考,ADC有1.25V内部参考。
4.Pin9、10:
(P1.4、P1.5)两路AD输入,可做差分输入,需要设置ADC的寄存器。
5.Pin11、12:
(P1.6、P1.7)各200uA激励电流源,可配合RTD等做应用。
6.Pin13:
两路AD输入做普通输入时的电压参考端,AD输入电压不能低于此引脚电压。
7.Pin14:
片内DAC输出。
8.Pin15:
复位引脚。
9.Pin16、17:
单片机RS232接口的RXD(P3.0)TXD(P3.1)。
10.Pin18:
(P3.2)外部中断0,用于红外接收和PS/2接口。
11.Pin19:
(P3.3)LCD1602,LCD12864A的EN引脚,控制第一位数码管。
12.Pin20、21:
DVDD、DGND数字电源输入。
13.Pin22:
(P3.4)PS/2接口的data信号。
14.Pin23:
(P3.5)LCD1602和LCD12864A的RW。
15.Pin24:
(P3.6)LCD1602和LCD12864A的RS。
16.Pin25:
LCD12864A的CS1。
17.Pin26:
IIC接口时钟信号。
18.Pin27:
IIC接口data信号。
19.Pin28:
(P2.0)SPI接口时钟信号。
20.Pin29:
(P2.1)SPI接口MOSI信号、控制第6位数码管的位码。
21.Pin30:
(P2.2)SPI接口MISO信号、控制第7位数码管的位码。
22.Pin31:
(P2.3)SPI接口SS信号、控制第8位数码管的位码;P2.0~3也作为4X4矩阵式键盘的扫描输出信号、步进电机的控制信号、数码管第数码管第6、7、8位位码。
但是SPI、4X4矩阵式键盘、步进电机、数码管第6、7、8位功能不能同时实现。
23.Pin32、Pin33:
接外部32.768KHz晶振。
24.Pin34、Pin35:
DVDD、DGND。
25.Pin36:
(P2.4)LCD12864A的CS2。
26.Pin37:
(P2.5)内部PWM模块输出,控制红外LED。
27.Pin38:
(P2.6)内部PWM模块输出,控制蜂鸣器。
28.Pin39:
(P2.7)内部PWM模块的外部时钟输入(也可以用内部时钟)。
29.Pin40:
EA,低电平有效,正常使用时拉低。
30.Pin41:
PSEN,在此引脚电平为低时按复位键进入debug模式,可以下载和调试程序。
31.Pin42:
ALE。
32.Pin47、Pin48:
DGND、DVDD。
33.Pin43、44、45、46、49、50、51、52:
P0口、LCD1602和LCD12864的数据总线,数码管的段码。
(三)电源模块
本学习板共有如下3种供电方式:
1.5V电源适配器供电(开关往上拨、插针1下面两脚接跳线帽)。
将开关sw4第2、3脚接通(开关往上拨),电源网络DVDD连接到插针1第2脚的输出,将插针1的第1、2脚(插针1下面两脚)接跳线帽,DVDD直接连接到电源适配器输入端,即为5V电源适配器供电模式。
2.7~12V电源适配器供电(开关往上拨、插针1上面两脚接跳线帽)
将开关sw4第2、3脚接通(开关往上拨),电源网络DVDD连接到插针1第2脚的输出,将插针1的第2、3脚(插针1上面两脚)接跳线帽,DVDD连接到稳压芯片7805的输出,而7805的输入端连接到电源适配器输入端,即为7~12V的电源适配器经7805给学习板供电的模式。
3.USB供电(开关往下拨)。
将开关sw4第1、2脚接通(开关往下拨),电源网络DVDD连接到USB电源输入端。
对DVDD网络和AVDD网络设了测试点,方便调试。
(四)数码管硬件连接
关键网络名解释:
1.DS0~7:
数码管段码。
2.BIT0~7:
数码管位码。
3.MOTORA~D:
步进电机驱动信号。
4.DISCTRL0~4:
显示控制信号,控制数码管低5位。
5.D0~8:
单片机P0口。
本设计采用共阴极数码管,段码由PNP三极管驱动,位码由NPN型三极管驱动。
引脚复用:
数码管低5位(板上为右边5位)的位码由DISCTRL0~4控制,可单独使用,高3位的位码控制信号与SPI信号,电机驱动信号,4X4矩阵式键盘复用,使用数码管高3位时参与复用的其他功能则不能使用。
插针配置:
若要使用数码管第4~0位(板上为右边5位),可以接通插针8,为减少功耗,不用请断开。
若要使用数码管第7~5位(板上为左边3位),可以分别接通插针5~7和9,为减少功耗,不用请断开。
(五)蜂鸣器和红外发送
本设计中采用无源电磁式蜂鸣器,蜂鸣器由PWM1(P2.6)控制,红外二极管由PWM0(P2.5)控制。
PWM1和PWM0均为片内PWM模块的输出。
蜂鸣器和红外LED的驱动均采用普通NPN三极管。
为方便调试,对该模块中的信号设了测试点,具体位置参见附图1。
插针配置:
若要使用蜂鸣器,可以接通插针3,为减少功耗,不用请断开。
若要使用红外二极管,可以接通插针4,为减少功耗,不用请断开。
(六)复位与下载
进入下载或调试模式的步骤为:
1.按住BTN1(downordebug按键)不要放开;
2.按下BTN2(reset按键),然后放开BTN2(reset按键);
3.放开BTN1(downordebug按键)。
这样单片机就进入了调试模式,可以下载或调试程序。
(七)按键输入
由于P1口(用于行扫描)内部无上拉电阻,为使无键按下时行信号为高电平,故将行信号接上拉电阻,电阻大小10K即可。
引脚复用:
P2.0~P2.3为4X4矩阵式键盘列扫描信号,又复用作步进电机控制信号,SPI信号、P2.1~P2.3还复用为数码管第5、6、7位位码控制信号。
参与复用的一项功能使用时,其他参与复用的功能则不能使用。
插针配置:
插针10上面两脚接跳线帽,4X4矩阵式键盘输入,行扫描信号为P1.0~P1.3,列扫描信号为P2.0~2.3。
插针10下面两脚接跳线帽,独立按键输入,该模式有4个独立按键可用,按键扫描所用端口为P1.0~P1.3。
这4个按键为4X4矩阵键盘的左边4个按键。
(八)振荡电路
AduC848片内有I2C模块,并有独立的引脚SCLOCK和SDATA。
板上的RTC时钟芯片DS1307和EEPROM芯片AT24C08均使用了I2C总线。
板上设置了I2C接口,方便MCU与板外的I2C设备进行通信。
对SCLOCK和SDATA设置了测试点。
四、程序
(一)主程序
(二)密码修改流程图
(三)计时主程序流程图
(四)计时中断子程序流程图:
(五)蜂鸣器中断子程序流程图
(六)蜂鸣器控制程序
(七)键盘扫描程序流程图
(八)程序清单
BUFEQU75H
BUF1EQU73H
SBFEQU72H;存放秒
MBFEQU71H;存放分
HBFEQU70H;存放时
ORG0000H
LJMPSTART
ORG0BH;定时器0中断入口
LJMPCLOCK
ORG1BH;定时器1中断入口
LJMPINT_0
ORG200H
START:
MOVR5,#00H
MOVA,#00H
MOV60H,A;清楚计时模式所有显示单元
MOV61H,A
MOV62H,A
MOV63H,A
MOV64H,A
MOV65H,A
MOV66H,A
MOV67H,A
MOV68H,A
MOV69H,A
ANLTMOD,#0F0H;设置TMOD
ORLTMOD,#01H
MOVTL0,#00H;TI装初值
MOVTH0,#40H
MOVBUF1,#00H;清零
MOVSBF,#00H
MOVMBF,#00H
MOVHBF,#00H
MOV58H,#01H;置闹钟小时初值
MOV59H,#00H;置闹钟分初值
SETBET0;开定时器0
SETBEA;开总中断
SETBTR0;启动T0
MOV74H,#00H;判断模式
MOV39H,#00H;密码输入是否正确
MOV38H,#00H;是否按下reset键
MOV29H,#00H;是否显示闹钟时间
START1:
MOVA,#06H;初始化密码
MOV35H,A
MOVA,#05H
MOV34H,A
MOVA,#04H
MOV33H,A
MOVA,#03H
MOV32H,A
MOVA,#02H
MOV31H,A
MOVA,#01H
MOV30H,A
MAIN:
MOVBUF,#10H;密码输入缓存
MOV76H,#00H;音乐播放次数
MOV37H,#00H;记录输入数字的个数
MOV36H,#06H
MOVR0,#40H;清输入密码存储单元
CLEAR:
MOV@R0,#00H
INCR0
DJNZ36H,CLEAR
LCALLDS1;调用显示子程序
MAIN1:
LCALLKEY;调用键盘扫描程序
JMPMAIN1
KEY:
MOVP2,#0E0H;全扫描,各列线都送低电平
MOVP1,#00H
MOVA,P1;读回各行线电平值
ORLA,#0F0H;只读低四位
CPLA;所读值置反
JNZIN;不是全0说明有键按下
RET;无键按下返回
IN:
ACALLDELAY1;调延时,等待按合抖动过去
MOVR2,#04H;R2做计数器,存待扫描行数
MOVR4,#7FH;R4做指针,指示待扫描行数
MOVR7,#00H;R7用于决定键号,初值置以0
SCAN:
MOVA,R4
RLA
MOVR4,A;以上三条调整待扫描行
MOVP2,A;逐行扫描,被扫描行送低电平
MOVP1,#00H
MOVA,P1;读回各列线电平值
MOVR3,#04H;R3做记数器,存被扫描行的待查列数
NEXT:
RRCA;调整待查列
JNCFIND;被查列为低电平,被按键找到,转FIND
INCR7;未找到,键号加一
DJNZR3,NEXT;被扫描行的待查列数不为0,转回NEXT
DJNZR2,SCAN;未找到所按键,返回
RET
FIND:
MOVBUF,R7
MOVP2,#0E0H
LOOSEN:
MOVA,P1
ORLA,#0F0H
CPLA
JNZLOOSEN;以上几条重复全扫描,等待所按键松按
MOVA,R7;松按后才考虑键处理,保证每按键一次,只处理一次,本条为取所按键号
ADDA,#0F6H
JCORDER
NUM:
MOVA,#01H;键号小于等于9,是数字键,转NUM,执行数字键处理程序
XRLA,74H;判断模式
JZX0;计时模式则不处理数字按键
CLRC
INC37H
MOVA,#0F9H
ADDA,37H
JCMAIN1;输入够6个数字则等待命令键
LCALLDS1;调用显示子程序
MOVA,R7
XCHA,45H;存输入的密码
XCHA,44H
XCHA,43H
XCHA,42H
XCHA,41H
XCHA,40H
RET
ORDER:
MOVA,#01H;键号大于9,是命令键,转ORDER,执行命令键处理程序
XRLA,74H
JZORDER1;判断模式
MOVA,R7
XRLA,#0AH
JZX15;重置
MOVA,R7
XRLA,#0BH
JZX16;重置确认
MOVA,R7
XRLA,#0CH
JZX9;输入密码确认,判断正误
MOVA,R7
XRLA,#0DH
JZX2;清零
MOVA,R7
XRLA,#0EH
JZX1;初始化密码
MOVA,R7
XRLA,#0FH
JZX5;显示时间
X1:
LJMPSTART1
X2:
LJMPMAIN
X3:
LJMPMAIN2
X5:
MOV74H,#01H;进入计时模式
MOV29H,#00H
LJMPMAIN3
X9:
LJMPCOMP
X15:
LJMPRESET
X16:
LJMPSET0
X0:
LJMPKEY
ORDER1:
MOVA,R7
XRLA,#0AH
JZX6;分钟加一
MOVA,R7
XRLA,#0BH
JZX7;小时加一
MOVA,R7
XRLA,#0CH
JZX11;闹钟分加一
MOVA,R7
XRLA,#0DH
JZX12;闹钟小时加一
MOVA,R7
XRLA,#0EH
JZX13;显示闹钟时间
MOVA,R7
XRLA,#0FH
JZX8;回到等待密码输入
JMPX0
X6:
MOVA,MBF
ADDA,#01H
DAA
MOVMBF,A
CJNEA,#60H,X10
MOVMBF,#00H
MOVA,HBF
ADDA,#01H
DAA
MOVHBF,A
CJNEA,#24H,X10
MOVHBF,#00H
RET
X7:
MOVA,HBF
ADDA,#01H
DAA
MOVHBF,A
CJNEA,#24H,X10
MOVHBF,#00H
RET
X11:
MOVA,59H
ADDA,#01H
DAA
MOV59H,A
RET
X12:
MOVA,58H
ADDA,#01H
DAA
MOV58H,A
RET
X13:
MOV29H,#01H
LJMPMAIN3
X8:
MOV74H,#00H;进入输密码模式
MOV29H,#00H
LJMPMAIN
X10:
RET
X4:
LJMPMAIN
RESET:
MOV37H,#00H
MOVA,39H
CLRC
RRCA
JNCX4
MOV38H,#01H;按下重置键置一
JMPX4
SET0:
MOV37H,#00H;设置密码
MOVA,38H;是否按下RESET
CLRC
RRCA
JNCX4
MOVR2,#06H
MOVR0,#40H
MOVR1,#30H
E1:
MOVA,@R0;把40H-45H的内容给30H-35H
XCHA,@R1
INCR0
INCR1
DJNZR2,E1
CALLDELAY
E2:
JMPX4
COMP:
MOV37H,#00H
MOVR1,#45H;判断密码正误
MOVR0,#35H
MOVR2,#06H
C1:
MOVA,@R1
XRLA,@R0
JNZC2
DECR1
DECR0
DJNZR2,C1
MOVR5,#00H
MOV39H,#01H;正确置一
LCALLDS2
JMPC3
C2:
MOV39H,#00H;错误清零
LCALLDS3
INCR5
MOVA,R5
MOVR5,A
CJNER5,#03H,C3
LCALLDS4
JMPX3;报警
C3:
JMPX4
DS1:
;显示程序
MOVP3,#80H
MOVA,37H
LCALLTABLE
MOVP0,A
LCALLDELAY;延时
RET
DS2:
MOVP3,#08H;正确显示
JMPDS5
DS3:
MOVP3,#20H;错误显示
JMPDS5
DS4:
MOVP3,#40H;报警显示
DS5:
MOVA,#03H
MOVP0,A
LCALLDELAY;延时
RET
TABLE:
INCA
MOVCA,@A+PC
RET
DB03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,19H,11H,0C1H,63H,85H,61H,71H,0FFH
DELAY:
MOVR6,#00H;延时程序
DEL11:
DJNZR6,DEL11
RET
MAIN3:
DS9:
MOVA,29H
JZBEIJ
NAOZ:
MOVR0,#69H;显示闹钟时间
JMPWEI
BEIJ:
MOVR0,#63H;显示北京时间
WEI:
MOVR2,#08H
DS8:
MOVP3,R2
MOVA,@R0
LCALLTABLE;BCD码转换成段码
MOVP0,A
LCALLDELAY1;延时
DECR0
CLRC
MOVA,R2
RLCA
MOVR2,A
CJNER2,#10H,LL
RLCA
MOVR2,A
LL:
CJNER2,#00H,DS8;四位显示完了吗?
没完则继续扫描显示
MOVA,29H
JZSHIJ
MOVR0,#69H
MOVA,59H
LCALLGET
MOVR0,#67H
MOVA,58H
LCALLGET
JMPBIJIAO
SHIJ:
MOVR0,#65H
MOVA,SBF;存入秒
LCALLGET
MOVA,MBF;存入分
LCALLGET
MOVA,HBF;存入时
LCALLGET
BIJIAO:
LCALLKEY;调用键盘扫描程序
MOVA,58H;比较闹钟时间和实际时间
MOVR6,HBF
XRLA,R6
JNZDS9
MOVA,59H
MOVR6,MBF
XRLA,R6
JNZDS9
LJMPMAIN2
SJMPDS9
GET:
MOV53H,A;压缩型BCD码转换成非压缩型BCD码
ANLA,#0FH;取低4位
MOV@R0,A
DECR0
MOVA,53H
SWAPA;取高4位
ANLA,#0FH
MOV@R0,A
DECR0
RET
CLOCK:
MOVTL0,#00H;定时器0中断子程序
MOVTH0,#40H
PUSHPSW;保护现场
PUSHACC
INCBUF1
MOVA,BUF1
CJNEA,#20H,QUIT;20次为一秒
MOVBUF1,#00H
MOVA,SBF
ADDA,#01H
DAA
MOVSBF,A
CJNEA,#60H,QUIT;60秒为1分
MOVSBF,#00H
MOVA,MBF
ADDA,#01H
DAA
MOVMBF,A
CJNEA,#60H,QUIT;60分为1小时
MOVMBF,#00H
MOVA,HBF
ADDA,#01H
DAA
M