2.1 设计思路
首先使用8255、8254、8259 三个芯片实现电子时钟的功能,让闹钟可以正常走时;其次,在时钟的基础上添加闹铃功能、整点报时功能、设置当前时间功能;完成设计。
2.2 设计方案
1. 电子时钟部分:此次设计是通过对计数器8254设定计数值对脉冲进行计数,在程序里,8254工作于计数器0,方式3。接入的CLK为1MHz,设计数初值为10000,每100次中断计数一次,产生的记数时间正好是时钟每秒走过的时间。通过对中断控制器8259设置初始化命令字初值来控制中断。程序中通过移位指令来实现时、秒、分的个位和十位的独自存储,将分、秒的个位十位分别存入指定的寄存器中。比较转移指令来完成秒和分的累加。七段数码管由8255并行接口的A口进行位的选择,通过B口输出要显示的段码。这样就在6个七段数码管上分别显示时、分和秒。当1S时间到时,修改当前数码管数值,10秒时将秒的低位清零,高位加1,分和时亦是如此;到达60秒时,将秒清零,分加1,到达60分时,将分清零,小时加1,到达24小时则全部清零。
2. 闹钟响铃部分:对于闹钟部分,我们首先要完成数码管显示单元按键的连接和设计,让16个按键分别为0-F;再利用实验平台的单次脉冲输入KK1产生一次中断,这样就可以设置时间了。将设置好的时间储存起来,时刻与当前的时间进行比较,当时间一样时,计数器1工作,蜂鸣器蜂鸣,播放音乐,这就完成了闹钟响铃功能。
3. 整点报时部分:整点报时,就是在整时的时候响一次铃,当时钟整点时,无论是几点,时钟的分和秒部分都为零,所以,只要让时钟的分和秒部分与零进行比较,当他们都相等时,就代表到达整点了,可以响铃了。整点报时就完成了,本闹钟设置的整点报时时长为5秒。
4. 设置当前时间:本部分也用到了数码管显示单元的按键部分,只要利用之前的设计就好了,这次使用单次脉冲输入的KK2产生中断设置时间,再将设置的时间存储在时间变量中,时间就设置好了。
A8254 EQU 06C0H ;宏定义 B8254 EQU 06C2H C8254 EQU 06C4H CON8254 EQU 06C6H MY8255_A EQU 0600H MY8255_B EQU 0602H MY8255_C EQU 0604H MY8255_CON EQU 0606H PUBLIC SEC,MIN,HOUR DATA SEGMENT ;定义数据段 TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;数码表 DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H FREQ_LIST DW 371,495,495,495,624,556,495,556,624 ;频率表 DW 495,495,624,742,833,833,833,742,624 DW 624,495,556,495,556,624,495,416,416,371 DW 495,833,742,624,624,495,556,495,556,833 DW 742,624,624,742,833,990,742,624,624,495 DW 556,495,556,624,495,416,416,371,495,0 TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4 ;时间表 DB 6, 2, 4, 4, 12, 1, 3, 6, 2 DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 6, 2, 4, 4, 12 SEC DB 0 ;初始化 HOUR DB 0 MIN DB 0 N_TIME DB 20 DUP(0) Z_TIME DB 20 DUP(0) N_S DB 30 N_M DB 0 N_H DB 0 TIMER DB 10 DUP(0) DUAN DB 0 BUF DB 3 DUP(0) DATA ENDS SSTACK SEGMENT STACK ;堆栈段 DW 256 DUP(?) SSTACK ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE, SS:SSTACK,DS:DATA START: ;8254初始化 MOV DX, CON8254 ;8254 MOV AL, 36H ;计数器0,方式3 OUT DX, AL ;分频 MOV DX, A8254 MOV AL, 010H OUT DX, AL MOV AL, 27H OUT DX, AL ;8255初始化 MOV AL,81H MOV DX,MY8255_CON OUT DX,AL ;MIR7中断 MOV AX, 0000H MOV DS, AX MOV AX, OFFSET MIR7 ;取中断入口地址 MOV SI, 003CH ;中断矢量地址 MOV [SI], AX ;填IRQ7的偏移矢量 MOV AX, SEG MIR7 ;段地址 MOV SI, 003EH MOV [SI], AX ;填IRQ7的段地址矢量 ;MIR6中断 MOV AX, OFFSET MIR6 ;取中断入口地址 MOV SI, 0038H ;中断矢量地址 MOV [SI], AX ;填IRQ6的偏移矢量 MOV AX, SEG MIR6 ;段地址 MOV SI, 003AH MOV [SI], AX ;填IRQ6的段地址矢量 ;MIR2中断 MOV AX, OFFSET SIR1 ;取中断入口地址 MOV SI, 00C4H ;中断矢量地址 MOV [SI], AX ;填SIR1的偏移矢量 MOV AX, SEG SIR1 ;段地址 MOV SI, 00C6H MOV [SI], AX ;填SIR1的段地址矢量 ;8259初始化 MOV AL, 11H OUT 20H, AL ;ICW1 MOV AL, 08H OUT 21H, AL MOV AL,04H OUT 21H,AL ;ICW2 MOV AL, 03H OUT 21H, AL ;ICW4 ;初始化从片8259 MOV AL, 11H OUT 0A0H, AL ;ICW1