电子钟
大作业内容
利用 8253 和 8259 芯片实现实时电子时钟的功能;利用 8255 控制七段数码
管完成定时扫描显示。显示格式为 xx 时 xx 分 xx 秒,每隔 1s,时间值改一次。
开关 1 可选择时、分、秒,开关 2 可对所选的时、分、秒进行加 1,小时加至 23
后清 0,分、秒加至 59 后清 0。
大作业要求
1、查阅资料,掌握共阳极七段数码管的工作原理。
2、分析实验原理,设计实验方案,绘出实验连线图,搭建仿真实验电路。
3、绘制实验程序流程图。
4、编写实验程序,检查无误后,编译、链接并进行仿真实验。
5、运行实验程序,验证程序功能。
扩展要求:
能够使电子钟定时闹钟,例如在 06:30:00 时,点亮 LED 灯进行闹钟报警。
实现代码如下:
TCONTRO EQU 0A006H ;8253控制字寄存器
TCON0 EQU 0A000H ;计数器0
TCON1 EQU 0A002H ;计数器1
TCON2 EQU 0A004H ;计数器2
ICW1 EQU 13H ;8259上升沿触发,单片8259A,要写ICW4
ICW2 EQU 20H ;IR0的中断向量码为20H
ICW4 EQU 03H ;一般嵌套,非缓冲方式,自动EOI
OCW1 EQU 00H ;允许中断
A8259 EQU 0C000H ;8259端口地址
B8259 EQU 0C002H;8259ICW2、ICW3等的地址
ABC8255 EQU 80H;8255工作在方式0,A口和B口输出,C口也输出
A8255 EQU 8000H;8255A口地址
B8255 EQU 8002H;8255B口地址
C8255 EQU 8004H;8255C口地址
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
ORG 800H
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,64H;定义栈顶位置,避免系统找不到栈
MOV DX,TCONTRO ;8253初始化
MOV AL,36H;计数器0工作在方式3
OUT DX,AL
MOV DX,TCON0
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL;给计数器0设初值为1000
MOV DX,TCONTRO
MOV AL,76H ;计数器1工作在方式3
OUT DX,AL
MOV DX,TCON1
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL;给计数器1设初值为1000,OUT1的输出频率为1HZ
MOV DX, A8259;写ICW,8259初始化
MOV AL, ICW1
OUT DX, AL
MOV DX, B8259;写ICW2,ICW4,OCW1
MOV AL, ICW2
OUT DX, AL
MOV AL, ICW4
OUT DX, AL
MOV AL, OCW1
OUT DX, AL
PUSH DS;在写中断前把DS保护起来,避免覆盖中断向量表
MOV AX ,0
MOV DS ,AX
MOV SI , 80H ;建立中断向量表
MOV AX,OFFSET HINT0 ;循环调整标志位COUNT的值为0、1、2之一,0代表调整HOUR,1代表调整MIN,2代表调整SEC
MOV DS:[SI],AX ;存储中断一的IP偏移地址
ADD SI,2
MOV AX,CS
MOV DS:[SI],AX ;存储中断程序地址 ,CS基地址
ADD SI,2
MOV AX, OFFSET HINT1 ;选定相应的时 分 秒 数据段
MOV DS:[SI],AX ;存储中断二的IP偏移地址
ADD SI,2
MOV AX,CS
MOV DS:[SI],AX ;存储中断程序地址 ,CS基地址
ADD SI,2
MOV AX, OFFSET HINT2 ;中断三,接入OUT1,每次来一个高脉冲给秒加1,并且调整整个时分秒显示,使其显示合理
MOV DS:[SI],AX ;存储中断三的IP偏移地址
ADD SI,2
MOV AX,CS
MOV DS:[SI],AX ;存储中断程序地址 ,CS基地址
POP DS
MOV DX,8006H ;8255初始化
MOV AX,80H ;工作方式0
OUT DX,AX
STI;开中断
PRINT: XOR AX,AX
XOR BX,BX;清零,避免可能的影响
MOV CX,8;循环显示8次,对于晶体管的八个位
LEA DI,HOURH;初始时让指针DI指向HOURH
LEA SI,NUM;SI用于判断要显示什么数
PRINT1: MOV DX,A8255
MOV AL,WEI
OUT DX,Al
ROL AL,1;左移,为显示下一个数做准备
MOV WEI,AL
MOV DX,B8255
MOV BL,[DI]
MOV AL,[SI+BX];取相应数字的显示代码
OUT DX,Al;显示选好的数字代码
INC DI;指向下一个要显示的数字所在的存储单元
CALL DELAY
MOV AL,0FFH;清空显示,很重要,没有此操作会发生数字之间的重叠现象
OUT DX,AL
LOOP PRINT1
MOV DX,C8255
MOV AL,0H
OUT DX,AL
MOV AL,SECL;开始判断此时时间是不是06:30:00
CMP AL,0H
JZ JSECH
JMP PRINT
JSECH: MOV AL,SECH
CMP AL,0H
JZ JMINL
JMP PRINT
JMINL: MOV AL,MINL
CMP AL,0H
JZ JMINH
JMP PRINT
JMINH: MOV AL,MINH
CMP AL,03H
JZ JHOURL
JMP PRINT
JHOURL: MOV AL,HOURL
CMP AL,06H
JZ JHOURH
JMP PRINT
JHOURH: MOV AL,HOURH
CMP AL,0H
JZ ALARM
JMP PRINT
ALARM: MOV DX,C8255
MOV AL,01H
OUT DX,AL
CALL DELAY
JMP PRINT
HINT0: ;根据按动开关的次数修正COUNT的值
PUSH AX
PUSH DX
MOV AL,COUNT
INC AL
CMP AL,03H
JZ TCOUNT
MOV COUNT,AL
END0: POP DX
POP AX
IRET ;中断返回指令
TCOUNT: MOV AL,0H;若COUNT加一后是3则给它清零
MOV COUNT,AL
JMP END0
HINT1: ;修改选定的区域,选定时则修改时。。。。。。
PUSH AX
PUSH DX
MOV AL,COUNT
CMP AL,0;如果count是0就调节时
JZ AHOURL
CMP AL,1;如果count是1就调节分
JZ AMINL
CMP AL,2;如果count是2就调节秒
JZ ASECL
END1: POP DX
POP AX
IRET;中断返回指令
AHOURL: MOV AL,HOURL
INC AL
CMP AL,0AH
JZ AHOURH1
CMP AL,04H
JZ AHOURH2
MOV HOURL,AL
JMP END1
AHOURH1: MOV AL,0H
MOV HOURL,AL
MOV AL,HOURH
INC AL
MOV HOURH,AL
JMP END1
AHOURH2: MOV AH,HOURH;判断时是否到了24
CMP AH,02H
JZ AHOURH3;时的双位清零
MOV HOURL,AL
MOV HOURH,AH
JMP END1
AHOURH3: MOV AL,0H;时到达24时,清零
MOV HOURL,AL
MOV HOURH,AL
JMP END1
AMINL: MOV AL,MINL
INC AL
CMP AL,0AH
JZ AMINH1
MOV MINL,AL
JMP END1
AMINH1: MOV AL,0H
MOV AH,MINH
INC AH
CMP AH,06H
JZ AMINH2
MOV MINL,AL
MOV MINH,AH
JMP END1
AMINH2: MOV AH,0H
MOV MINH,AH
MOV MINL,AH
JMP END1
ASECL: MOV AL,SECL
INC AL
CMP AL,0AH
JZ ASECH1
MOV SECL,AL
JMP END1
ASECH1: MOV AL,0H
MOV AH,SECH
INC AH
CMP AH,06H
JZ ASECH2
MOV SECL,AL
MOV SECH,AH
JMP END1
ASECH2: MOV AH,0H
MOV SECH,AH
MOV SECL,AH
JMP END1
HINT2: PUSH AX
PUSH DX
MOV AL,SECL
INC AL
CMP AL,0AH
JZ TSECH;转入秒低位重置函数
MOV SECL,AL
END2: POP DX
POP AX
IRET ;中断返回指令
TSECH: MOV AL,0H;将秒低位重置为0
MOV SECL,AL;将秒低位装入存储器
MOV AL,SECH
INC AL
CMP AL,06H
JZ TMINL;转入分的低位重置函数
MOV SECH,AL;将秒高位存起来
JMP END2
TMINL: MOV AL,0H;将秒高位重置为0
MOV SECH,AL
MOV AL,MINL
INC AL
CMP AL,0AH;
JZ TMINH;转入分的高位重置函数
MOV MINL,AL;
JMP END2
TMINH: MOV AL,0H;将分低位重置为0
MOV MINL,AL
MOV AL,MINH
INC AL
CMP AL,06H
JZ THOURL
MOV MINH,AL
JMP END2
THOURL: MOV AL,HOURL
INC AL
CMP AL,0AH;
JZ THOUR1;转入时的低位重置函数
CMP AL,04H
JZ THOUR2;转入时的高与地位重置函数
MOV HOURL,AL
JMP END2
THOUR1: MOV AL,0H;将时的低位置零
MOV HOURL,AL
MOV AL,HOURH;给时的高位进位
INC AL
MOV HOURH,AL
JMP END2
THOUR2: MOV AH,HOURH;判断时是否到了24
CMP AH,02H
JZ THOUR3;时的双位清零
MOV HOURL,AL
MOV HOURH,AH
JMP END2
THOUR3: MOV AL,0H;时到达24时,清零
MOV HOURL,AL
MOV HOURH,AL
MOV MINH,AL
JMP END2
DELAY:
PUSH CX
MOV CX,5
DELAY1:
NOP
LOOP DELAY1
POP CX
RET
CODE ENDS
DATA SEGMENT
WEI DB 01H;用于选通哪一位数显示,显示一次左移一次
COUNT DB 0H;标志位,用于确定调节的是时、分、秒,按一次SW1加一,到2归零
HOURH DB 0H;存放时的高位
HOURL DB 0H;存放时的低位
DB 0AH;横线位置为num偏移10
MINH DB 0H;存放分的高位
MINL DB 0H;存放分的低位
DB 0AH;横线位置为num偏移10
SECH DB 0H;存放秒的高位
SECL DB 0H;存放秒的低位
NUM DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳极对应的数字显示,0~9
DB 0BFH;横线段码
DATA ENDS
STACK SEGMENT
STA DB 200 DUP(0)
TOP EQU LENGTH STA
STACK ENDS
END START
电路连接为:
鉴于私信和评论中有许多同学需要源码,现将代码文件夹分享于此:
链接:https://pan.baidu.com/s/1fokrFT94BG_pDRj23kObgA?pwd=us35
提取码:us35