来源:m.ttfanwen.com时间:2016.9.20
二、简易密码控制装置
1.功能简述
设计并制作一个具有读秒显示功能的密码控制器, 输入正确的密码后开始读秒, 到达规定的秒数后,关闭待控制单元;密码控制器设置有4个按键,按照一定的组合顺序可以打开
待控制单元,默认密码: 122234, 电路示意图如图 1 所示。
图1 电路示意图
2.电路设计要求
① 路板上电复位正常
② 入正确密码后, CD4060 产生 1Hz 方波信号,数码管显示数字“ 0”到 “ 7”;第 8 秒时, 密码输入部分电路、计数部分电路复位,数码管持续显示数字“ 0”,CD4060 停止输出脉冲信号,直到下一次输入正确密码;
③ 输入正确密码后,继电器吸合,8 秒后,自动断开;
④ 输入正确密码后, NE555 输出 2HZ 方波信号驱动发光二极管闪烁, 8 秒后发光二极管熄灭。
3.各芯片工作原理
① CD4017:芯片引脚图如图2。十进制计数/分频器CD4017,其内部由计数器
及译码器两部分组成,由译码输出实现对脉冲信号的分配,整个输出时序就是3、2、4、7、10、1、5、6、9、11脚依次出现与时钟同步的高电平,宽度等于时钟周期。CD4017有10个输出端和1个进位输出端。每输入10个计数脉冲,12脚就可得到1个进位正脉冲,该进位输出信号可作为下一级的时钟信号。15脚MR为高电平清零端,当在MR端上加高电平或正脉冲时其输出端3脚为高电平,其余输出端均为低电平。14脚为时钟输入端,13脚为低电平使能端,当13脚低电平,14脚输入连续脉冲信号时,其对应的输出端依次变为高电平状态,故可直接用作顺序脉冲发生器。
② CD4060:芯片引脚图如图3。CD4060由一振荡器和14
级二进制串行计数器位
1
组成,振荡器的结构可以是RC或晶振电路,12脚为高电平时,计数器清零且振荡器使用无效。所有的计数器位均为主从触发器。在CP1(和CP0)的下降沿计数器以二进制进行计数。在时钟脉冲线上使用斯密特触发器对时钟上升和下降时间无限制。
图2 CD4017引脚图图3 CD4060引脚图
③ 74LS192:芯片引脚图如图4,真值表如图6。74LS192是同步十进制可逆计
数器,它具有双时钟输入,并具有清除和置数等功能。为置数端,5脚CPU为加计数端,4脚CPD为减计数端,12脚TCU为非同步进位输出端,13脚TCD为非同步借位输出端,P0、P1、P2、P3为计数器输入端,14脚为高电平清除端,Q0、Q1、Q2、Q3为数据输出端。
④ CD4511:芯片引脚图如图5,真值表如图7。CD4511是一个用于驱动共阴极 LED
(数码管)显示器的 BCD 码—七段码译码器,特点如下:具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。可直接驱动LED显示器。各引脚的名称:其中输入端7、1、2、6脚分别表
(测试输入端)、???? (消隐输入控制示A、B、C、D;3、4、5脚分别表示????
(锁定控制端)端)、 ????;输出端13、12、11、10、9、15、14脚分别表示a、
b、c、d、e、f、g。
图4 74LS192引脚图 图5 CD4511引脚图
2
图6 74LS192真值表
图7 CD4511真值表
4.电路原理图仿真设计
(1)密码按键及数码管显示
密码按键及数码管显示电路图,如图8所示。
3
图8密码按键及数码管显示电路图
电路上电,CD4017的3脚与14脚为高电平。当按键S1下时,三极管T1基级因高电平而饱和导通,进而14脚变成低电平;按键松开,14脚恢复高电平。这相当于给14脚一个脉冲,使输出端的高电平跳到2脚。以此类推,按照122234密码输入后,输出端5脚为高电平。
此时5脚高电平,三极管T2饱和导通,使CD4060的12脚为低电平,振荡器开始起振,调整滑动变阻器RP1,使其频率为1Hz的时间脉冲输出。
74LS192预置数为0,当接收到1Hz的时间脉冲时,开始从0计数,随即将计到的数传给CD4511,最终驱动共阴七段数码管显示相应数字。
复位:当计到第8秒时,74LS192的7脚为高电平给74LS192的14脚和CD4017的15脚,使74LS192与CD4017复位。
(2)发光二极管闪烁
8秒后,发光二极管闪烁电路图,如图9所示。
4
图9发光二极管闪烁电路图
当密码输入结束后,CD4017的5脚为高电平,三极管T3饱和导通,电磁继电器线圈供电,其弹片打到常开端,NE555振荡电路得电起振,输出2Hz的方波信号,驱动发光二极管闪烁。
NE555振荡电路的振荡周期T=T1+T2。T1为电容充电时间,T2为电容放电时间。
充电时间: T1=(RP2+RP3)C·ln2≈0.67(RP2+RP3)C
发电时间:T2=RP3·C·ln2≈0.67RP3·C
矩形波的振荡周期: T=T1+T2=ln2(RP2+2RP3)C≈0.67(RP2+2RP3)C
因此改变RP2、RP3和电容C4的值,便可改变矩形波的周期和频率。
对于矩形波,除了用幅度,周期来衡量外,还有一个参数:占空比q,q=(脉宽tw)/(周期T)
tw指输出一个周期内高电平所占的时间。图11所示电路输出矩形波的占空比q=??=??1+??2=????2+2????3 ??1??1????2+????3
5.实物制作
(1)波形图
输入正确密码后,CD4060产生1Hz方波信号(如图10),NE555输出2Hz方波信号(如图11)。
5
图10 CD4060产生1Hz方波信号 图11NE555产生2Hz方波信号
6
(2)实物作品
图12 数码管显示4
图13 数码管显示
7
7
图14 数码管上电显示0
8
********************************
“状态转移法”设计键控程序实验
(1)实验内容:
熟练KeiluVision2软件的操作编程方法,在此基础上熟练掌握“状态转
移法”设计程序的步骤与过程,正确理解状态表和状态图在程序设计中的作用,并结合CH451的读键和显示功能程序实现用状态转移法编写一个三键三态的实验程序,调试运行体会各程序的功能。
(2)实验使用的硬件设备及软件调试工具:
1该实验的硬件设备主要是由单片机接口电路和CH451芯片,8位数码○
管显示电路以及4X4键盘上的0,1,2三个按键组成;
2软件调试工具主要是用KeiluVision2编程调试软件在CH451芯片的○
基础上实现“状态转移法”的三键三态功能。
(3)程序流程图及硬件原理电路图:
1状态转移法的程序流程图如下所示: ○
1
2CH451的键盘显示接线图:
○
2
本电路图中CH451 的键盘扫描是采取4x4矩阵的16键键盘中的前三个键。在该方法中,当按一个键或接到一个命令后,程序将从一个“状态”迁移到另一“状态”,可以是原状态,整个键控程序就是在各状态之间跳动迁移。在某一状态下,每一个键有一个含义,按一个键,键控程序均执行一个功能子程序完成相应的任务,同时在数码管上显示当时的状态标志,并转移到下一个状态。其硬件原理与上图一样,实现功能主要是软件编程。
(4)状态表设计
由上可知表中有3个状态,3个按键和7个子程序;
(5)状态表所对应的数据表
ST: ; ST,PR ST,PR ST,PR 状态
DB 0, 1, 1, 2, 0, 1 ; 0 显示100/P_ _
DB 1, 0, 2, 3, 1, 0 ; 1 显示AAA
DB 2, 4, 0, 6, 2, 5 ; 2 显示变量增减
(6)调试操作步骤:
1首先从桌面上直接双击KeiluVision2的图标以启动该软件。 UVison○
3
启动后,程序窗口的左边有一个工程管理窗口,该窗口有3个标签,分别是Files、Regs、和Books,这三个标签页分别显示当前项目的文件结构、CPU的寄存器及部份特殊功能寄存器的值(调试时才出现)和所选CPU的附加说明文件,如果是第一次启动Keil,那么这三个标签页全是空的。
2使用菜单“File->New”或者点击工具栏的新建文件按钮,即可在项○
目窗口的右侧打开一个新的文本编缉窗口,在该窗口中输入源程序后,保存该文件,保存为HCK.C文件,如果是汇编程序文件后缀名应为.ASM。
3点击“Project->New Project?”菜单,出现一个对话框,要求给将○
要建立的工程起一个名字,你可以在编缉框中输入一个名字,不需要扩展名。点击“保存”按钮,出现第二个对话框,如下图所示。这个对话框要求选择目标CPU选择一个SST中的MCUSST89E/V564RD做目标器件。
4再点击“确定”按钮后,在工程窗口的文件页中出现了“Target 1”,○
前面有“+”号,点击“+”号展开,再点击下一层的“Source Group1”使其反白显示,然后点击鼠标右键,出现一个下拉菜单。选中其中的“Add file to Group”Source Group1”,出现一个对话框,要求寻找HCK.C源文件,双击将该文件添加到项目,注意,在文件加入项目后,该对话框并不消失,等待继续加入其它文件,这里只加这一个文件,点击“Close”即可返回主界面。返回后,点击“Source Group 1”前的加号,会发现HCK.C文件已在其中。双击文件名,即打开该源程序。
5工程设置,首先点击左边Project窗口的Target 1,然后选择菜单○
“Project->Option for target ‘target1’”,再在“Option for ‘Targe1t’”窗口中点击Debug页面,选择“Use Keil Monitor-51 Driver”,和“使用”。 4
最后再编译,连接,再调试运行。
(7)程序源代码:
LED_0 DATA 30H ;显示缓冲区高位
LED_1 DATA 31H ;显示缓冲区高位
LED_2 DATA 32H ;显示缓冲区高位
LED_3 DATA 33H
LED_4 DATA 34H
LED_5 DATA 35H
LED_6 DATA 36H
LED_7 DATA 37H ; 显示缓冲区高位
YY DATA 40H ; 工作变量
XX DATA 41H ; 工作变量
LED_BUF DATA 43H ; 要显示的变量
STATE DATA 44H ; 状态
KEY DATA 45H ; 键值
KEY_F BIT 20H.0 ; 有键标志
MS50_F BIT 20H.1 ; 50毫秒标记
;--------------------
LOAD BIT P1.2 ;串行命令加载,上升沿激活
DIN BIT P1.0 ;串行数据输出,接CH451的数据输入
DCLK BIT P1.1 ;串行数据时钟,上升沿激活
DOUT BIT P3.3 ;INT0,键盘中断和键值数据输入,接CH451的数据输出
;------------------------------------
ORG 000H
LJMP START
ORG 00BH
LJMP T0_INT ; 定时器0中断
ORG 013H
LJMP KEY_INT ; 外中断1向量
5
;---------------------------
ORG 30H
START:
CLR EA ;禁止中断
MOV SP,#60H ; 设堆栈
;-
MOV P1,#60h ;
CLR DIN ;
SETB DCLK ;
SETB DIN ;
SETB LOAD ;
SETB DOUT ;
NOP
;-
MOV B,#04H ;
MOV A,#03H ;
nop
LCALL WRITE
NOP
SETB EX1 ;
SETB ET0 ;
CLR IT1 ;
CLR IE1 ;
SETB PX1
;-
MOV A,#01H ;
MOV TMOD,A ;
MOV TH0,#9EH ; 65536-25000=9E58H,2 MOV TL0,#58H ;
SETB TR0
禁止其它芯片 输出下跳脉冲,先低 (等待1拍) 后高,选CH451为4线串行接口 置为输入 , 设置CH451 关看门狗开显示键盘 允许外部中断1(键盘中断) 允许定时器T0中断 置外部信号为低电平触发 清外中断0标志 定时器T0工作在16位计数方式 微妙计数1次定时器初始值,50毫秒 6
;-
MOV STATE,#0 ; 设初始状态
MOV YY,#0 ; 工作变量初始值为0 CLR KEY_F ; 清除有键标记
;--
ACALL CLRBUF ; 清除显示缓冲区
ACALL DISPLAY ; 显示缓冲区内容P_______ SETB EA ; 允许总中断
;---------------------------------
LOOP: NOP
JNB MS50_F,LOOP
CLR MS50_F ; 定时50毫秒
NOP ; ACALL TASK
;------------------------
JNB KEY_F,LOOP ; 无键,转走
CLR KEY_F ; 有键处理
MOV A,STATE
MOV B,#6 ; 状态乘以6
MUL AB
ADD A,KEY ; 键值乘2
ADD A,KEY
MOV R0,A ; 保存偏移量
MOV DPTR,#ST ; 取状态表首地址
MOVC A,@A+DPTR
MOV STATE,A ; 得到新状态号
MOV A,R0 ; 恢复偏移量
INC A ; 指向任务号地址
MOVC A,@A+DPTR ; 得到任务号
;--
MOV B,#3 ; 乘3,每个LJMP为3字节 MUL AB
7
MOV DPTR,#TASK ; 散转,去执行对应任务 JMP @A+DPTR
TASK: LJMP P_0 ; 空操作
LJMP P_1 ; 显示 100 /P_ _ _
LJMP P_2 ; 显示 AAAA
LJMP P_3 ; XX=YY 并且显示 XX
LJMP P_4 ; XX-1 并且显示 XX
LJMP P_5 ; XX+1 并且显示 XX
LJMP P_6 ; YY=XX,并且显示P_ _ _ _ _
LOOP_END: LJMP LOOP
;-------------------------------------
P_0: NOP ; 空操作
LJMP LOOP_END
;-------------------------------------
P_1: MOV LED_BUF,#100 ; 显示 100
ACALL DIS_BUF ;
LJMP LOOP_END
;-------------------------------------
P_2: MOV LED_0,#0AH ; 显示 AAAA
MOV LED_1,#0AH
MOV LED_2,#0AH
ACALL DISPLAY ; 显示P_ _ _ _ _
LJMP LOOP_END
;----------------------------------
P_3: MOV A,YY ; XX=YY 并且显示 XX MOV XX,A
MOV LED_BUF,A
ACALL DIS_BUF
LJMP LOOP_END
;-------------------------------
8
P_4: DEC XX ; XX=XX-1 并且显示 XX MOV A,XX
MOV LED_BUF,A
ACALL DIS_BUF
LJMP LOOP_END
;------------------------------
P_5: INC XX ; XX=XX+1 并且显示 XX MOV A,XX
MOV LED_BUF,A
ACALL DIS_BUF
LJMP LOOP_END
;----------------------------------
P_6: MOV A,XX ; YY=XX
MOV YY,A ; 保存XX到YY
ACALL CLRBUF
ACALL DISPLAY ; 显示P_ _ _ _ _
LJMP LOOP_END
;------------------------------------------------------ ST: ; ST,PR ST,PR ST,PR 状态
DB 0, 1, 1, 2, 0, 1 ; 0 显示100/P_ _ DB 1, 0, 2, 3, 1, 0 ; 1 显示AAA
DB 2, 4, 0, 6, 2, 5 ; 2 显示变量增减
;------------------------------------------
CLRBUF: MOV LED_0,#10H ;清空显示 P_ _ _ _ _ MOV LED_1,#10H
MOV LED_2,#10H
MOV LED_3,#10H
MOV LED_4,#10H ;BLACK
MOV LED_5,#11H ; P
MOV LED_6,#10H ; 0
MOV LED_7,#10H ; 0
9
RET
;-------------------------------------
DIS_BUF:MOV A,LED_BUF ; 要显示的变量单元
MOV B,#100 ; 除100
DIV AB
MOV LED_2,A ; 百位放LED_2
MOV A,B
MOV B,#10 ; 除10
DIV AB
MOV LED_1,A ; 十位放LED_2
MOV LED_0,B ; 个位放LED_2
MOV LED_3,#10H
MOV LED_4,#10H ; 清高位显示
MOV LED_5,#10H
MOV LED_6,#0H ; 0
MOV LED_7,#0H ; 0
ACALL DISPLAY ; 调显示子程序
RET
;==========================================
DISPLAY:
MOV R0,#30H ; 输入缓冲区首地址 MOV R6,#8 ; 8位LED
DIS_L2: MOV B,#03H ; 字数据左移命令
MOV A,#00H ; LCALL WRITE ; 左移1次
MOV DPTR,#SEG
MOV A,@R0 ; 取要显示的数据
MOVC A,@A+DPTR ; 将A中数的对应段码取出 MOV B, #08H ; 送显示命令8××H LCALL WRITE ; 送1位显示显示
INC R0 ; 指针加1
10
DJNZ R6,DIS_L2 ; 直到写完8个数 RET
;----------------------------------- 段码表
SEG: DB 3FH, 06H, 5BH, 4FH, 66H ; 0,1,2,3,4
DB 6DH, 7DH, 07H, 7FH, 6FH ; 5,6,7,8,9
DB 77H, 7CH, 39H, 5EH, 79H ; A,B,C,D,E,
DB 71H, 00H, 73H ; F _ P
;---------------------------------------
KEY_INT: PUSH DPL
PUSH DPH ; 保护主程序现场
PUSH ACC
PUSH PSW
;---------
LCALL READ ; 读键码
MOV R3, A ; 将健码放到R3中
K0: CJNE R3,#40H,K1 ; 以下比较健码得出键值,放到A中
MOV A,#0H SJMP KEY_L1 ; 转换成键号
K1: CJNE R3,#41H,K2
MOV A,#1H SJMP KEY_L1
K2: CJNE R3,#42H,KEY_OUT
MOV A,#2H
KEY_L1: MOV KEY,A ; 保存键值
SETB KEY_F ; 置有键标记
;-------
KEY_OUT: POP PSW
POP ACC ; 恢复主程序现场
POP DPH
POP DPL
RETI
11
;==============================================定时器T0中断 T0_INT: PUSH PSW ; 10000H=65536
MOV TH0,#9EH ; 65536-25000=9E58H
MOV TL0,#58H ; 定时器初始值 50毫秒
SETB MS50_F
POP PSW
RETI
;============================================================= ;输出命令子程序
;入口: B-ACC中待写的12位数据,低8位在ACC中,高4位在B的低4位中 ;使用: ACC, B, R7
WRITE: PUSH ACC
CLR EX1 ;禁止键盘中断
CLR LOAD ;命令开始
MOV R7,#08H ;将ACC中的8位送出
WRITE_8: RRC A ;低位在前,高位在后
CLR DCLK ;
MOV DIN,C ;送出一位数据
SETB DCLK ;产生上升沿通知CH451输入位数据
DJNZ R7,WRITE_8 ; 位数据未完继续
MOV A,B
MOV R7,#04H ; 将B中的4位数据送出
WRITE_4: RRC A ; 低位在前,高位在后
CLR DCLK
MOV DIN,C ; 送出一位数据
SETB DCLK ; 产生上升沿通知CH451输入位数据
DJNZ R7,WRITE_4 ; 位数据未完继续
SETB LOAD ;产生加载上升沿通知CH451处理命令数据 SETB EX1 ;准许键盘中断
POP ACC
RET
12
;=================================================================== ;读取键值子程序
;出口: ACC键值数据
;使用: ACC, R7
READ: CLR EX1 ;禁止键盘中断
CLR LOAD ;命令开始
MOV A, #07H ;读取键值命令的高4位0111B
MOV R7, #04H ;忽略12位命令的低8位
READ_4: RRC A ;低位在前,高位在后
CLR DCLK ;
MOV DIN,C ;送出一位数据
SETB DCLK ;产生上升沿通知CH451输入位数据
DJNZ R7, READ_4 ;位数据未完继续
SETB LOAD ;产生加载上升沿通知CH451处理命令数据 CLR A ; 先清键值单元以便移位
MOV R7,#07H ;读入7位键值
READ_7: MOV C, DOUT ;读入一位数据
CLR DCLK ;产生时钟下降沿通知CH451输出下一位数据 RLC A ;数据移入ACC,高位在前,低位在后
SETB DCLK ;
DJNZ R7,READ_7 ;数据未完继续
MOV KEY,A
CLR IE1 ;清中断标志,读操作过程中有低电平脉冲 SETB EX1 ;准许键盘中断
RET
;=====================================================================
END
(8)“状态转移法”的程序过程分析:
例如在状态0下当按下按键0时则执行任务1,数码管显示100,此时状 13
态转移到状态0其本身,如果我们按下2键还是执行任务1,状态还是转移到本身状态,只有按下1键,则执行任务2数码管显示AAA,同时状态转移到状态1,如果按下0键或2键则都执行任务0,即执行空操作,并状态都转移到本身状态,若按下1键则执行任务3,显示XX值,并转移到次态2,在状态2下如果按0键或2键则分别执行任务4或任务5,使数码管XX的值减1或加1,同时都转移到状态2本身,如果按1键则执行任务6,数码管显示P,且同时状态转移到下一状态0,即回到状态0了;整个实验的键控过程就如此重复下去。
(9)程序运行结果:
当程序正确运行后,在当前状态下如果一个按键被按下时,则执行程序设计中该按键所执行的任务(可以是空操作),并在数码管上显示其任务状态标志,并转移到下一状态(可以转移到状态本身),依此反复下去。
14
+ 更多类似范文