微型计算机大作业设计
课题名称 电子钟表和显示星期的设计 学院(部) 电子与控制工程学院
专 业 建筑设施智能技术
班 级
学生姓名
学 号
月 日至 月 日共 周
指导教师(签字)
11 年 01 月 09 日
目录
前言…………………………………………………………………. 1
一、 设计题目与要求………………………………………...2
1、 设计题目………………………………………………2
2、设计目的………………………………………………2
3、设计任务……………………………………………….2
4、 设计要求………………………………………………2
5、实验设备………………………………………………2
二、设计思路………………………………………. 3
1、 系统框图……………………………………………3
2、 工作原理……………………………………………3
三、系统框图………………………………………. 4
1、 中断处理程序流程框图…………………………..4
2、 主程序流程框图………………………………….6
3、键扫子程序流程框图……………………………..7
四、调试结果………………………………………. 7
五、总结与体会…………………………………….. 8 参考文献……………………………………………. 8 附录1 电路图……………………………………. 9 附录2 程序…………………………………….. 12
课程设计是培养和锻炼学生在学习完本门课后综合运用所学理论知识解决实际工程设计和应用问题的能力的重要教学环节。
《微机与借口技术》应用性、综合性、实践性较强的课程,没有实际的有针对性的设计环节,学生就不能很好的理解和掌握所学的技术知识,更缺乏解决实际问题的能力。所以通 前言
过有针对性的课程设计,使学生系统的综合应用所学的理论知识,提高学生在微机应用方面的开发与设计本领,系统的掌握微机硬软件设计方法。
在日常生活中时钟随处可见,它是一种对时间进行累计的工具,即计时。计时的本质就是计数。使用计数器对时钟脉冲进行计数是时钟实现的基本原理。再用LED 数码管显示出来,并设计出几个按键对时钟进行调整,这样,一个完整的时钟就设计完成。
一、 设计题目与要求
1、 设计题目
电子钟表和显示星期的设计
2、设计目的
(1)、培养学生综合运用所学知识的能力,提高学生解决实际问题的能力
(2)、培养学生查阅资料,使用工程设计标准、手册及编写设计技术的能力
(3)、培养学生初步掌握设计开发产品的能力,了解微机控制系统的一般设计方法。
(4)、提高学生的计算机绘图能力。
3、设计任务:
(1)时间显示:时、分、秒
(2)钟表时分秒参数的手动调整设置
(3)选择传感器,并设计相应的信号处理电路;
(4)实现星期显示功能;
(5)时分秒、星期交替显示(2秒交替一次)。
4、设计要求
(1)、选择合适的设计方案,并进行理论阐述。
(2)、编制相应的控制程序,要求有程序流程图,程序加注释。
(3)、绘制实现电路原理图,所有图纸均用计算机绘制。
5、实验设备
8253定时器:用于产生秒脉冲,其输出信号可作为中断请示信号送IRQ0。
8259中断控制器:用于产生中断。
8255并口:用做接口芯片,和按键和LED 相连。
LED :六个LED 用于显示时:分:秒值和星期。
按键:用于控制设置。
二、 设计思路
1、 系统框图
图1 系统框图
2、 工作原理
系统分五大模块,为主控模块(8086),显示模块(LED ),按键模块,中断模块(8259)和定时模块(8253)分别实现不同的功能。
主控模块(8086)是系统的核心模块,主要由软件实现。它的主要功能是调用其它模块对系统工作进行协调。
当按下A 键时,将只显示时数,按C 键可调时数。再按B 键将显示分数, 按C 键可调时数。再按B 键将显示秒数, 按C 键可调时数。调数结束后再按A 键可回到正常计时显示。 按键模块是产生按键信息并送入主控模块的子功能模块。由软件和硬件实现,硬件上由按键和8255互连,将按键信息由8255送入主控模块。软件上使用行扫描法获得按键信息并送回主控模块。
显示模块是将显示缓冲区的数值送到LED 显示的功能模块,显示缓冲区是由六个字节
构成,分别保存小时的高位和低位,分钟的高位和低位,秒钟的高位和低位。硬件上由六个LED 构成,软件上由扫描显示的方法实现。
定时模块为8259提供中断请求信号,由一片8253实现,选用定时器0,工作在方式3,使8253的OUT0端输出周期性的负脉冲信号,此信号接8259的IR6端,后CPU 就会处理,使液晶显示器的时间发生变化。
中断模块实现动态显示的,硬件为一片8259,由于中断请求信号为每秒一次,中断程序该为时间按秒增加,并显示,只要开中断,便可实现每秒显示时间增加一秒,从而达到动态显示的效果。
三、系统框图
1、中断处理程序流程框图
Y
图2 中断处理程序流程框图
2、 主程序流程框图
图3 主程序流程框图
3、键扫子程序流程框图
图4 键扫子程序流程框图
四、调试结果
五、总结与体会
《微机与借口技术》应用性、综合性、实践性较强的课程,通过本次课程设计过程,我基本熟悉和掌握了微机系统的软件、硬件的设计方法、设计步骤,是一次微机开发应用方面的初步训练,通过本次课程设计我较好掌握了微机系统与接口扩展电路的设计方法,学习了用8086汇编语言编写程序。
通过这次课程设计,我对所学的理论知识有了更加深刻的了解和掌握,懂得了理论联系实践的重要性,增进了信息收集能力。让我懂得了要更加注重知识了理解与应用,这样才能不断的提高自己。
最后感谢胡欣老师的指导与帮助!
参考文献
1、 冯博琴, 吴宁主编. 微型计算机原理与借口技术(第二版) .清华大学出版社
2、 孙德文. 微型计算机技术. 高等教育出版社
3、 侯伯亨, 李博成. 微机原理与借口技术. 西安电子科技大学出版社
附录1 电路图
附录2 程序
========================数据段========================= DATA SEGMENT
TIME_STO DB 00H,01H,02H,03H,04H,05H,06H ;时分秒及星期显示缓冲区 LED_NUM DB 3FH,06H,5BH,4FH,66H,6DH DB 7DH,07H,7FH,6FH
PCL_IN DB 11H ;存放8255 PC口读入值 FLAG DB 00H ;2秒计时标志 TEMP0 DB 00H ;启动/暂停标志
TEMP1 DB 00H ;用来标志正在修改的是哪一位
DATA ENDS
========================堆栈段========================= STACK SEGMENT
DW 72 DUP(?) STACK ENDS
========================代码段========================= CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;初始化逻辑段 MOV DS,AX MOV AX,STACK MOV SS,AX
PUSH DS ; 当前用户DS 段入栈保存 MOV AX,0000H
MOV DS,AX ; 修改DS=0000H,指向中断矢量表所在段
MOV AX,OFFSET IRQ6 ;取出中断处理子程序的入口偏移地址(以0为基准)
MOV SI,0038H ;IR6中断矢量号为0EH, 处于矢量表的38H~3BH
MOV [SI],AX ; 将偏移地址装入矢量表 MOV AX,0000H MOV SI,003AH
MOV [SI],AX ; 将段地址(0000H)装入矢量表 POP DS ; 恢复用户数据段DS =========================初始化8253===================
MOV AL,34H ;计数器0,先写低8位,方式二,二进制计数
MOV DX,43H
MOV AX,59499 ;计数初值59499,输出20HZ ,定时0.05秒
MOV DX,40H OUT DX,AL MOV AL,AH OUT DX,AL
MOV AL,01010100B ;计数器0,只读写低8位,方式二,二进制计数
MOV DX,43H OUT DX,AL
MOV AX,19 ;计数初值19,与计数器0级联后定时1秒
MOV DX,41H OUT DX,AL
STI ;开中断
=========================初始化8255===================
MOV AL,10000001B ;A组方式0:A 口输出,C 口高位输出
;B组方式0:B 口输出,C 口低位输入
OUT 36H,AL
STI ;开中断 CALL DISPLAY ;显示初始值
CALL KEY_BUTTON ;调用按键检测程序
CLI ;关中断 PUSH DX MOV DX,IP_BAK MOV AX,CS_BAK MOV DS,AX MOV AX,250EH INT 21H POP DS STI
MOV AX,4C00H ;返回DOS INT 21H
=========================初始化8259=================== MOV AL,00010011B
OUT DX,AL
MOV AL,08H MOV DX,21H OUT DX,AL
MOV AL,00000011B MOV DX,21H OUT DX,AL
MOV AL,0BFH MOV DX,21H
OUT DX,AL
======================显示程序============================ DISPLAY PROC NEAR
DISUP1: MOV AL,0 ;FLAG清零 MOV DX,A_8255 OUT DX,AL MOV AL,[DI]
MOV BX,OFFSET LED XLAT
MOV DX,B_8255 OUT DX,AL MOV AL,CL MOV DX,A_8255 OUT DX,AL MOV BX,35H
MAIN_DIST:MOV BL,11011111B LEA SI,TIME_STO
MOV CX,06H ;六位数码管循环显示 DELAY1: DEC BX JNZ DELAY1 CMP CL,20H JZ DISUP2 INC DI SHL CL,1 JMP DISUP1
KEY_PED: MOV DX,C_8255 ;检测是否有按键按下 IN AX,DX AND AX,000FH CMP AL,01H JZ KEY_BUTTON DISUP2: JMP DISUP RET
NEXT_WEEK:MOV AL,FLAG ;判断2S 计时是否到 CMP AL,02H
JZ TIME_DIS ;2s到则跳转到显示时间值 JMP MAIN_DISW ;否则循环输出星期值 DISPLAY ENDP
======================中断服务程序===================
INT_PROC PROC FAR PUSH DS
MOV AX,DATA
MOV BX,OFFSET TIME_STO ; CMP BYTE PTR [BX+5],09H ; JNZ ADD
INC BYTE PTR [BX+4] ; MOV BYTE PTR [BX+5],0 ; CMP BYTE PTR [BX+4],06H ; JNZ ADD1
INC BYTE PTR [BX+3] ; MOV BYTE PTR [BX+4],0 ; CMP BYTE PTR [BX+3],0AH ; JNZ ADD1
INC BYTE PTR [BX+2] ; MOV BYTE PTR [BX+3],0 ; CMP BYTE PTR [BX+2],06H ; JNZ ADD1
INC BYTE PTR [BX+1] ; MOV BYTE PTR [BX+2],0 ; CMP BYTE PTR [BX],02H ; JNZ ADD2
CMP BYTE PTR [BX+1],04H ; JNZ ADD1
MOV BYTE PTR [BX+1],0 ; MOV BYTE PTR [BX],0 ; INC BYTE PTR [BX+6] ; CMP BYTE PTR [BX+6],08H JNZ ADD1
MOV BYTE PTR [BX+6],01H ; JMP ADD1
ADD2: CMP BYTE PTR [BX+1],0AH ; JNZ ADD1
INC BYTE PTR [BX] ; MOV BYTE PTR [BX+1],0 ; JMP ADD1
ADD: ADD BYTE PTR [BX+5],1 ;将显示缓冲区首地址读入BX 判断秒低位是不是9 向秒高位进位 秒个位清零
判断秒高位是不是6 向分低位进位 秒高位清零
判断分低位是不是10 向分高位进位 分低位清零
判断分高位是不是6 向时低位进位 分高位清零
判断时高位是不是2 判断时低位是不是4 分低位清零 分高低清零 星期位加一 星期位置一 判断时低位是不是10 向时高位进位 时低位清零 秒低位加一
ADD1: CALL DISPLAY ;显示跳变后的数
POP DS IRET INT_PROC ENDP
======================按键检测设置程序========================= KEY_SET PROC NEAR
CLI ;关中断
CALL DELAY_10MS ;延时按键消抖 MOV DX,PC_8255 ; IN AL,DX
AND AL,000FH ; MOV PCL_IN,AL
CMP PCL_IN,00001110B ; JZ P/S_UP0 ; JMP EXIT_KEYS
P/S_UP0: MOV DX,PC_8255 ; IN AL,DX MOV PCL_IN,AL AND PCL_IN,0FH
CMP PCL_IN,00001111B
JNZ P/S_UP0 ; CALL DELAY_10MS ; MOV DX,PC_8255 ; IN AL,DX MOV PCL_IN,AL AND PCL_IN,0FH
CMP PCL_IN,00001111B
JZ KEY_DIS JMP P/S_UP0
KEY_DIS: PUSH CX PUSH BX PUSH SI
MOV BL,01111111B
CMP TEMP1,6 ; JNZ NEXT DEC TEMP1
NEXT: MOV CL,TEMP1 ROR BL,CL
MOV AL,BL ;再次读入按键位置 取低四位 判断按下的是不是暂停/启动键不是则跳转 否则等待按键松开 没有按键松开则等待重新检测 延时去抖动
再次读入PC 口数据 使弟五个数码管显示星期值 数码管位选通
MOV DX,PA_8255 OUT DX,AL
LEA SI,TIME_STO ;数据查表转换输出到段选PB 口显示
XOR CH,CH ADD SI,CX
MOV BX,OFFSET LED_NUM MOV AL,[SI] XLAT
MOV DX,PB_8255 OUT DX,AL
CALL DELAY_10MS
P/S: CMP PCL_IN,00001110B ; JZ P/S_MODE ; CMP PCL_IN,00001101B ; JZ CHOS_MODE ; CMP PCL_IN,00001011B ;吗
JZ ADD_MODE ;
P/S_MODE: CMP TEMP0,00H ;TEMP0 JZ TEMP0_0
MOV AL,0 ; MOV TEMP0,AL JMP EXIT_KEYS
TEMP0_0: MOV AL,1 ; MOV TEMP0,AL JMP EXIT_KEYS
CHOS_MODE: CMP TEMP0,00H ; JNZ GOON0 ; JMP EXIT_KEYS ;
GOON0: INC TEMP1 CMP TEMP1,7 JNZ EXIT_CH MOV AL,0
MOV TEMP1,AL
EXIT_CH: JMP KEY_DIS ;
ADD_MODE: CMP TEMP0,00H ; JNZ GOON1 ; JMP EXIT_KEYS
按下的是暂停/启动键吗 是则跳转
否则继续判断按下的是选择键吗 是则跳转
否则继续判断按下的是计数加1键是则跳转 为0则跳转 不为0,即为一则置零 为0则置1 检测是否处于设置状态 是则继续 否则跳转 转到显示 检测是否处于设置状态 是则继续
GOON1: MOV BX,OFFSET TIME_STO
NEXT0: CMP TEMP1,0 ;修改的是时高位不 JNZ NEXT1
INC BYTE PTR [BX+TEMP1] CMP BYTE PTR [BX+TEMP1],3 JNZ EXIT_ADD
MOV BYTE PTR [BX+TEMP1],0
NEXT1: CMP TEMP1,1 ; JNZ NEXT2
INC BYTE PTR [BX+TEMP1] CMP BYTE PTR [BX+TEMP1],10 JNZ EXIT_ADD
MOV BYTE PTR [BX+TEMP1],0
NEXT2: CMP TEMP1,2 ; JNZ NEXT3
INC BYTE PTR [BX+TEMP1] CMP BYTE PTR [BX+TEMP1],6 JNZ EXIT_ADD
MOV BYTE PTR [BX+TEMP1],0
NEXT3: CMP TEMP1,3 JNZ NEXT4
INC BYTE PTR [BX+TEMP1] CMP BYTE PTR [BX+TEMP1],10 JNZ EXIT_ADD
MOV BYTE PTR [BX+TEMP1],0
NEXT4: CMP TEMP1,4 ; JNZ NEXT5
INC BYTE PTR [BX+TEMP1] CMP BYTE PTR [BX+TEMP1],6 JNZ EXIT_ADD
MOV BYTE PTR [BX+TEMP1],0
NEXT5: CMP TEMP1,5 JNZ NEXT6
INC BYTE PTR [BX+TEMP1] CMP BYTE PTR [BX+TEMP1],3 JNZ EXIT_ADD
MOV BYTE PTR [BX+TEMP1],0
修改的是时低位不 修改的是分高位不 修改的是秒高位不
NEXT6: CMP TEMP1,6 ;修改的是时高位不 JNZ EXIT_ADD
INC BYTE PTR [BX+TEMP1] CMP BYTE PTR [BX+TEMP1],8 JNZ EXIT_ADD
MOV BYTE PTR [BX+TEMP1],1
EXTA_MODE: JMP EXIT_ADD
EXIT_ADD: JMP KEY_DIS ;转到显示
EXIT_KEYS: POP SI POP BX POP CX STI RET
KEY_SET ENDP
======================延时10MS 程序======================== DELAY10MS PROC NEAR
PUSH CX WAIT: LOOP WAIT POP CX RET DELAY10MS ENDP CODE ENDS
END START