汇编语言实现电子闹钟

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
        
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值