资源描述
西安科技大学
微机原理与接口技术
课程设计
题 目: 闹钟设计
学 院: 计算机科学与技术学院
专业班级: 计科1004班
组 员: 郭雅心1008030421
韦清松1008030422
2013年 7月 8日
目 录
1 闹钟设计要求与设计方案 1
1.1. 设计目的 1
1.2. 设计要求 1
1.3. 设计思路 1
2 闹钟设计的硬件设计 2
2.1 硬连线图: 2
2.2 四大模块: 2
2.2.1 8253定时、计数器模块 2
2.2.2 8255并行接口模块 3
2.2.3 8259中断控制模块 3
2.2.4 显示模块 3
3 闹钟设计的软件设计 4
3.1. 主程序设计 4
3.2. 按键处理程序设计 5
3.3. IRQ7中断设计 6
3.4. 七段数码管显示设计 7
4 闹钟设计的运行与调试 8
5 设计体会与小结 8
6 程序清单 9
7 参考文献 17
1 闹钟设计要求与设计方案
1.1. 设计目的
学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
1.2. 设计要求
² 设计一个钟表。在数码管上显示时间。
² 定时时间到,屏幕显示“get up!”字符串。
² 显示同时,流水灯闪烁,蜂鸣器响1秒钟。
1.3. 设计思路
本设计以唐都仪实验箱为载体,结合中断控制器8259A、并行接口8255、中断定时器8253、七段数码显示管LED及八个发光二极管的功能,用汇编语言编程实现了闹钟设计的实验。
闹钟的总体设计原理是:首先利用定时芯片8253的定时作用定时计数,每10ms开一次中断即8253计数18432次调用时间显示程序,数码管加1,毫秒部分加到99后清0向前进1 秒部分到显示59S过后变为0,执行此程序后8255就会工作,把时间在四个数码管上显示时间。当数码管显示时间与拨动KK1开关设置的定时时间相同时。在程序里面设置了一个蜂鸣器标志变量和流水灯标志变量,当变量为0的时候,表明蜂鸣器没有响,当变量为1的时候,表明蜂鸣器正在发声。每次秒钟加一之前,检测蜂鸣器标志变量,当蜂鸣器变量为1时,就关闭蜂鸣器,并置蜂鸣器标志变量为0。当秒钟加一之后,若当前设定时间与实时时间相同,就开启蜂鸣器,并置蜂鸣器标志变量为1。流水灯相似,只是多了几个判断,分别显示四个流水灯亮。在第一个流水灯亮时,屏幕显示“get up!”,流水灯闪烁,蜂鸣器响。
闹钟具体做法:时间显示程序要配合延时程序进行,为了得到良好的显示效果,延时程序要尽量接近1秒,精确的时间延迟程序,第一二块数码管显示分位,第三四块显示秒位。数码管显示一段时间60s后再跳回到初始位置00s,再显示,由此循环下去。设置一个闹钟开关标志变量,用来调节闹钟有效性,当开关为1时,定时设置有效,为0则无效,定时时间为有效时的时间设置。
2 闹钟设计的硬件设计
2.1 硬连线图:
GATE2
8253 CLK2
OUT2
IRQ7
8259
PB0~PB7
8255
PA0
PA1
PA2
PA3
PA4~PA7
PC4
PC0~PC1
PC2
○ +5V
X4
X1
X2
X3
●●●●○○○○
3个LED灯D0~D2
系统总线
1.8432MHZ
嗡鸣器SPK
2*4键盘
KK2
图2-1硬线连接图
2.2 四大模块:
2.2.1 8253定时、计数器模块
8253A芯片在本实验中用了计数器2,工作在方式0下,8253计数次数为 10ms*1.1.8432MHz,中断每10ms有一次,这样就可以通过控制发中断的次数来得到想要的时间。8253的CLK0接系统时钟1.8432MHZ,门控信号GATE2接+5V。采用内部7号中断。
2.2.2 8255并行接口模块
8255的PA0~PA3负责4位7段数码管的位选,以及2x4键盘扫描的列信号。PA4~PA7负责4位流水灯的闪烁。PB0~PB7负责4位7段数码管的段选。PC0~PC1负责2x4键盘扫描的行信号。PC2负责接收开关信号。PC4负责蜂鸣器的发声。
2.2.3 8259中断控制模块
本次设计使用了8259中断控制器的IRQ7,通过IRQ7中断服务子程序设置DI来计数。每加到100即达到1秒,令秒加1,计数器清0以便重新计数。秒加到60,进位让分加1.选中数码管最右管让其显示分的个位,然后进位判断,数码管选择依次左移,显示整个时间时和分。
定时模块
该模块实现的功能是通过键盘设定一个定时时间,并将当前定时时间显示在计算机终端上。当实时时钟每走一分的时候,就与设定的定时时间比较,当定时时间与实时时间相同时,则触发相应的闹钟程序:显示“Get Up!”字符串,流水灯闪烁,蜂鸣器响一分钟。因为,键盘既可以修改实时时间,也可以修改定时时间,所以,为了区分,我们使用了一个开关KK2,通过与C口一个引脚相连来选择修改模式。当开关断开的时候,键盘修改的是定时时间,当开关闭合的时候,键盘修改的是实时时间。
2.2.4 显示模块
该显示模块包括三个部分:实时时间显示、定时时间显示以及流水灯闪烁。实时时间是在主程序里面,通过数码管显示的。而定时时间是在每次修改的时候,显示在计算机终端上。流水灯是通过定时模块触发显示的,当定时时间与实时时间相同时,置流水灯标志变量为1。在主程序里面循环检测标志变量,当变量为0的时候,流水灯不闪烁,当变量为1时,流水灯闪烁,闪烁完毕之后,置标志变量为0。
3 闹钟设计的软件设计
3.1. 主程序设计
图3-1主程序流程图
3.2. 按键处理程序设计
图3-2按键处理程序流程图
3.3. IRQ7中断设计
图3-3 IRQ7中断流程图
3.4. 七段数码管显示设计
图3-3七段数码管显示
4 闹钟设计的运行与调试
本电子时钟可以24小时循环计时,数码管显示时和分,能够校时,可以设定闹钟。操作方法如下:开机运行后,装入程序并运行,数码管显示00:00并开始走时。按动2*4小键盘可以设定闹钟时间,设定好的闹钟时间显示在电脑终端。按下开关KK2并同时按动小键盘则是对时钟进行调时,8个小键盘分别对应时、分的十位以及个位的加和减。内存会将设定的时间存储并与时钟时间比较,当相等时,嗡鸣器响,流水灯亮、显示GET UP字符串。
5 设计体会与小结
为期两周的微机原理课设结束了,在这两周中,我通过查阅大量资料,亲自动手实验,对微机原理理论课有了实践的经验,巩固了微机原理的课程知识。并且锻炼了自己的动手能力。
在这两周的课程设计时间里,课程设计的基本目的达到了。我们的课程设计题目是电子闹钟,用IRQ7子程序中给出计数次数100D。每达到100就实现秒的加1,秒加到60则让分加1,依次进位并判断自加范围并且选中数码管显示。8255B负责将内存里的时位和分位值输出到数码管显示。KK2与8255C口PC2引脚相接,通过对定时标志位的置0置1来控制是修改实时时间还是设定闹钟时间。小键盘负责对时间加1和减1的操作。通过设定标志位变量来设定闹钟的响铃、流水灯的亮否。
通过这次的课设,让我学会了很多。一次次的调试,一次次的修改让我变得更加坚强的同时,也使得我对微机接口以及汇编的很多知识得到了很好的掌握,同时软硬件的结合使用动手能力也有很大的提高。期间遇到很多问题,如数码管显示乱码,时钟只是显示却不走时,流水灯不亮等问题。经过老师的指导和同学的帮助让我客服了一个又一个问题。通过交流,我的思维得到了很大的发散。很多问题是在交流后突然思考出来的。两周的实习虽然很累,但是收获也是非常明显。总之,这次课设让我受益匪浅。
6 程序清单
STACK SEGMENT STACK
DW 64 DUP(?)
STACK ENDS
DATA SEGMENT
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管可显示0到9
CLCTIME DB 4 DUP(?)
ALARMTIME DB 4 DUP(?)
MODE DB 00H
MIAO DB 00H
SPEAKER DB 01H
MESSAGE DB 'Get Up!',0AH,0DH,00H;定义MESSAGE变量
LEDFLAG DB 00H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV ES, AX
;IRQ7
PUSH DS
MOV AX,0000H
MOV DS,AX
LEA AX, IRQ7;取偏移地址
ADD AX,2000H
MOV SI,003CH
MOV [SI],AX;偏移量放入中断向量表低位
MOV AX,0000H;段地址
MOV SI,003EH
MOV [SI],AX;段地址写入中断向量表高位
IN AL,21H;读中断屏蔽寄存器
AND AL,7FH;开7号中断
OUT 21H,AL;写OCW1
POP DS
STI;开中断
MOV AL,0B0H ;计数器2,方式0,二进制
OUT 43H,AL;8253控制字送寄存器
MOV AX,18432D;设置初始值
OUT 42H,AL;低位写入2号计数器
MOV AL,AH
OUT 42H,AL;高位写入
MOV DI,00H
LEA SI,CLCTIME;取CLCTIME变量的偏移地址
MOV AX,00H
MOV [SI],AX
MOV [SI+1],AX
MOV [SI+2],AX
MOV [SI+3],AX
LEA SI,ALARMTIME;取ALARMTIME变量的偏移地址
MOV [SI], AX
MOV [SI+1],AX
MOV [SI+2], AX
MOV [SI+3], AX
MOV AL, 81H ;A O M0,B O M0,C0-C3 I
OUT 63H, AL;8255控制字
MOV AL,00H
OUT 61H,AL;B口对应数码管全灭
OUT 62H,AL;C口输出0
MOV AL,0F0H
OUT 60H,AL;A口对应流水灯状态全灭
MAIN: STI;开中断
TEST LEDFLAG,01H;判断流水灯标志位状态
JZ PRO0;LEDFLAG为0跳到PRO0
MOV AH,0EFH;不为0时AH置11101111B
SELECT0:IN AL,60H;A口地址给AL
OR AL,0F0H;AL高4位置1
AND AL,AH
OUT 60H,AL;选中PA4对应的流水灯
MOV CX,00A0H
SELECT1: CALL DISPLAY;调用显示
CALL CLEAR;调用清屏
LOOP SELECT1
ROL AH,1;AH循环左移选中下一个流水灯
TEST AH,01H;判断流水灯是否循环一遍
JNZ SELECT0;未循环完跳到SELECT0
MOV AL,0FFH;循环完则将AL置1
OUT 60H,AL
MOV LEDFLAG,00H;流水灯标志变量置0
PRO0: CALL DISPLAY;调用显示程序
CALL CLEAR;调用清屏
CALL SZC
JNZ PRO1;AL第1、2位都不为0
JMP MAIN
PRO1: CALL DISPLAY ;调用显示程序
CALL DALLY;调用延时
CALL CLEAR;清屏
CALL SZC
JNZ PRO2
JMP MAIN
PRO2: MOV CH,0FEH
MOV CL,00H
JUDGE0: MOV AL,CH;AL置0FEH
OUT 60H,AL;A口输出选中PA0端口对应的1号按钮
IN AL,62H;C口地址给AL
TEST AL,01H;判断C口地址PC0是否为0
JNZ JUDGE1;不为0转至JUDGE1
MOV AL,00H
JMP KPRO
JUDGE1: TEST AL,02H;判断C口地址PC1是否为0
JNZ NEXT
MOV AL,04H
KPRO: ADD AL,CL
CALL PUTBTN;调用键盘处理程序
PUSH AX
KDS:CALL DISPLAY;调用显示
CALL CLEAR
CALL SZC
JNZ KDS
POP AX
NEXT: INC CL
MOV AL,CH;AL置0FEH
TEST AL,08H
JZ MAIN
ROL AL,1
MOV CH,AL
JMP JUDGE0
;键值处理程序
PUTBTN:PUSH AX
PUSH BX
PUSH CX
PUSH AX
IN AL,62H;C口地址给AL
TEST AL,04H ;判断是修改定时时间还是实时时间,PC2
JNZ REBAC;PC2不为0
MOV MODE,01H ;置修改模式标志变量为1
LEA BX, ALARMTIME;为0则修改定时时间
JMP BTN
REBAC:
MOV MODE,00H
LEA BX, CLCTIME
BTN:
POP AX
TEST AL,04H ;判断键值是加一还是减一,0-3为加1,4-7为减1
JNZ SUB0;PC2不为0转至减
MOV AH,00H
MOV SI,AX
MOV CL,[BX+SI]
TEST AL,01H;PA0
JNZ EDGE0;PA0不为0转至EDGE0
CMP CL,2 ;判断是否到最大值
JZ GOBACK
INC CL
MOV [BX+SI],CL;分的十位加1
CALL DISSETTIME ;调用显示设定时间程序
JMP GOBACK
EDGE0:CMP CL,09H ;判断是否到最大值
JZ GOBACK
INC CL
MOV [BX+SI],CL;分个位加1
CALL DISSETTIME
JMP GOBACK
SUB0:SUB AL,04H
MOV AH,00H
MOV SI,AX
MOV CL,[BX+SI]
CMP CL,00H ;判断是否为0
JZ GOBACK
DEC CL
MOV [BX+SI],CL;减1
CALL DISSETTIME
GOBACK: POP CX;返回
POP BX
POP AX
RET
DISSETTIME: ;;定时时间显示在电脑上
PUSH AX
MOV AL,MODE;判断修改模式
CMP AL,01H
JNZ DISBACK
MOV AH,01H
LEA SI, ALARMTIME;取定时时间变量偏移地址
MOV AL,[SI]
ADD AL,30H
INT 10H;显示在终端
MOV AL,[SI+1]
ADD AL,30H
INT 10H
MOV AL,':'
INT 10H
MOV AL,[SI+2]
ADD AL,30H
INT 10H
MOV AL,[SI+3]
ADD AL,30H
INT 10H
MOV AL,0AH
INT 10H
MOV AL,0DH
INT 10H
DISBACK:
POP AX
RET
SZC:MOV AL,0F0H;AL高位置1
OUT 60H,AL
IN AL,62H
NOT AL;AL按位取反
AND AL,03H;C口第1、2位对应调时
RET
CLEAR: MOV AL,00H
OUT 61H,AL
RET
;实时时钟
IRQ7:PUSH AX
PUSH BX
PUSH CX
INC DI
CMP DI,6000 ;判断是否产生6000次中断
JNZ RETURN
MOV DI,00H ;计数器清零
CMP SPEAKER,01H ;判断蜂鸣器是否正在发声
JNZ INTR0
MOV AL,08H ;若正在发声,则关闭蜂鸣器
OUT 63H,AL
;INC MIAO;CMP MIAO,60;JNZ RETURN;MOV MIAO,0H
INTR0: LEA BX,CLCTIME ;取时钟变量偏移地址
MOV SI,0003H ;分钟的个位为数组最后一位,十位为倒数第二位
INTR1: MOV AL,[BX+SI]
INC AL ;AL加一
TEST SI,0001H ;判断是否应该进位
JNZ INTR2
CMP AL,02H;时最高位不超过2
JNZ INTR3
MOV AL,00H
MOV [BX+SI],AL
DEC SI
CMP SI,0FFFFH
JNZ INTR1
JMP INTR4
INTR2: CMP AL,0AH
JNZ INTR3
MOV AL,00H
MOV [BX+SI],AL
DEC SI
CMP SI,0FFFFH
JNZ INTR1
JMP INTR4
INTR3: MOV [BX+SI],AL
INTR4: LEA BX, CLCTIME ;比较实时时间与设定时间
LEA BP, ALARMTIME
MOV SI,0000H
INTR5: MOV AL,[SI+BX]
MOV CL,DS:[SI+BP]
CMP AL,CL
JNZ RETURN
INC SI
CMP SI,0004H
JNZ INTR5
MOV AL,09H ;若相同,则开启蜂鸣器
OUT 63H,AL
MOV SPEAKER,01H
MOV LEDFLAG,01H ;置流水灯标志变量为1
MOV BX,OFFSET MESSAGE ;输出get up字符串
MOV AH,06H
INT 10H
RETURN:MOV AX,18432D ;定时器重新计数
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
MOV AL,20H ;中断复位
OUT 20H,AL
POP CX
POP BX
POP AX
IRET
DISPLAY: PUSH AX;数码管显示时间
PUSH DX
PUSH BX
LEA SI,CLCTIME;取时钟实时时间偏移地址
MOV DL,0FEH ;11111110,选中数码管
MOV AL,DL
DISAGAIN:
IN AL,60H
OR AL,0FH;AL低4位置1
AND AL,DL;选中PA0
OUT 60H,AL ;BIT SELECT
MOV AL,[SI] ;DISPLAY [SI]
LEA BX,TABLE
AND AX,00FFH;AH高位清0
ADD BX,AX
MOV AL,[BX];查表转换
OUT 61H,AL ;B口输出秒显示
CALL DALLY
INC SI
MOV AL,DL
TEST AL,08H ;判断AL第3位是否是0
JZ OUT1;为0转到OUT1,说明数码管最后一个已亮
ROL AL,1;否则左移1位
MOV DL,AL
JMP DISAGAIN
OUT1: POP BX
POP DX
POP AX
RET
DALLY: ;;延时程序
PUSH CX
PUSH AX
MOV CX,0010H
T1: MOV AX,0010H
T2: DEC AX
JNZ T2
LOOP T1
POP AX
POP CX
RET
CODE ENDS
END START
7 参考文献
² 龚尚福、朱宇. 《微机原理与接口技术》.西安电子科技大学出版社.2008
² 龚尚福、朱宇. 《微机原理与接口技术实验指导书》.西安电子科技大学出版社.2008
17
展开阅读全文