资源描述
《微机实验及课程设计》报告
《微机实验及课程设计》
课程设计报告
目 录
一.课程设计目的与要求…………………………………………………………………………3
二.方案论证与原理设计…………………………………………………………………………3
三.详细设计………………………………………………………………………………………4
四.方案实现与测试………………………………………………………………………………6
五.分析与总结……………………………………………………………………………………7
1、基本要求
设计一个用于智力竞赛的抢答计时器,同时能测试人的反应(响应)时间。按启动钮,测试开始,2个八段码倒计时开始(如从10秒或20秒倒计时),一旦看到灯亮,参赛双方(或三方)分别按不同的抢答按钮参与抢答。一旦其中一位按下按钮,相应的显示灯(LED)亮并响“嘟”的一声,此时若其它按钮按下均无效。若一直到计数到零,无一人按下按钮,则抢答结束(以后再按抢答钮无效)。立即按测试钮,8×8点阵显示反应时间xx.xx秒(8×8点阵用红色代表秒,绿色代表0.01秒,交替显示)。要求:
(1)编制1个随机数产生子程序,由随机数决定从按启动钮到对应LED亮的时间(如在3秒~15秒之间内任意变动),使被测试者对LED亮的时间无法预见,以确保测试结果的可信;
(2)必须在见到LED亮后按测试钮才有效,即一直按着按钮或提前按下按钮无效;
(3)反应时间显示xx.xx秒,准确到百分之一秒。
2、设计思路
将系统分成3个大的模块:倒计时模块,计时模块,显示模块。
1)倒计时模块:通过一个子程序段获得随机数,并用这个随机数倒计时;
2)计时模块:倒计时结束时灯亮,开始计数,当有人按下键并正确时,锁存所用时间;
3)显示模块:将锁存的时间用八段码显示出来。
一. 课程设计目的与要求
1、课程设计目的
上学期在学习微机原理的基础上,我们一直在实践微机实验及课程设计教程这门实验课程,从指令与汇编语言基础开始,我们熟悉了调试工具的使用,汇编语言程序设计,I/O与存储器,简单输入输出,中断,计数/定时器,以及模数/数模转换。平时的实验都是对各个单元单一功能的验证,并没有他们之间的联系,最后的综合课程设计将让我们学以致用,把学到的各个章节的知识根据需要联系在一起,并实现一定的功能。同时也培养我们遇到问题,思考问题,解决问题的能力。化零为整,在实践中深化对所学内容的认识。
2、基本要求
设计一个用于智力竞赛的抢答计时器,同时能测试人的反应(响应)时间。按启动钮,测试开始,2个八段码倒计时开始(如从10秒或20秒倒计时),一旦看到灯亮,参赛双方(或三方)分别按不同的抢答按
钮参与抢答。一旦其中一位按下按钮,相应的显示灯(LED)亮并响“嘟”的一声,此时若其它按钮按下
均无效。若一直到计数到零,无一人按下按钮,则抢答结束(以后再按抢答钮无效)。立即按测试钮,8×
8点阵显示反应时间xx.xx秒(8×8点阵用红色代表秒,绿色代表0.01秒,交替显示)。要求:
(1)编制1个随机数产生子程序,由随机数决定从按启动钮到对应LED亮的时间(如在3秒~15秒之间内任意变动),使被测试者对LED亮的时间无法预见,以确保测试结果的可信;
(2)必须在见到LED亮后按测试钮才有效,即一直按着按钮或提前按下按钮无效;
(3)反应时间显示xx.xx秒,准确到百分之一秒。
3、进一步设计要求
修改以上设计使进一步能测试人对不同事物的反应(响应)时间。如功能为:按启动钮,测试开始,
一旦红灯亮,立即按红灯测试钮,一旦绿灯亮,立即按绿灯测试钮,但黄灯亮为干扰。8×8点阵显示反应
时间xx.xx秒。若按错钮,则显示出错并响“嘟”一声。要求:
(1)编制2个随机数产生子程序,1个决定从按启动钮到LED 亮的时间,另一个决定亮何种颜色灯;
(2)同样要求在见到LED亮时按测试钮才有效;
(3)在倒计数时附有音乐伴奏。
二.方案论证与原理设计
1、设计思路
将系统分成3个大的模块:倒计时模块,计时模块,显示模块。
1)倒计时模块:通过一个子程序段获得随机数,并用这个随机数倒计时;
2)计时模块:倒计时结束时灯亮,开始计数,当有人按下键并正确时,锁存所用时间;
3)显示模块:将锁存的时间用八段码显示出来。
2、进一步设计
随机数程序我用读系统时钟的方法,得到随机数后一旦测试开始,通过loop倒计时, 倒 计时结束时,灯亮表示可以开始抢答。这里灯亮可以有两种选择:红灯和黄灯,我用随机数末位 进行选择,0则红灯亮,1则绿灯亮。这也变相实现了进一步设计要求中两个随机数子程序的要 求。
灯亮以后我用8253的计数器开始计数,当有人按下键且正确时,计数停止,得到一个计数 值。对这个计数值进行处理以后可以相应的通过8*8点阵的行选和红选黄选使时间在点阵上交替 显示。
由于系统板可以提供的时钟是1MHZ或2MHZ,这样计数器计出的数值再转化比较繁琐,我选 择用8253的另一个计数器输入1MHZ的时钟,采用方式3产生100HZ的方波,这样每个脉冲0.01 秒,计数得到的值单位为0.01秒,可以直接用来显示。
三.详细设计
1、 硬件连接图
PB0 PA0
PB1 PA1
PB2 PA2
PB3 PA3
PB4 PA4
PB5 PA5
PB6 PA6
PB7 PA7
红灯
GATE1
2A0H
8*8点阵
2A8H
绿灯
2B0H
8255
OUT2
CLK
CLK1 CLK2
GATE1 GATE2
OUT1 OUT2
PB0
5V
(CLK来自系统脉冲1MHZ)
CLK1
8253
2、主程序流程图与显示子程序流程图
主持人开始?
初始化芯片
产生随机数
是
随机数末位为0?
红灯亮
倒计时
开始计时
可以抢答
有人按下?
显示时间
正确?
是
是
是
绿灯亮
否
否
否
退出程序
否
否
开始
置初值
得到所要
显示数字的行码
输出行码
输出颜色列码
行号加1
列码左移一位
延时是否到?
是否4次?
是否4次?
退出
是
否
图一.主程序流程图 图二.显示子程序流程图
3、初始定义
在程序的数据段里定义好8253、8255各需要用到的端口地址,定义点阵的行选和列选地址。
4、初始化
首先显示提示信息,等待测试开始。
8253:用到计数器1、2,计数器1的控制字为01110001B,采用方式0,BCD码十进制计数, 计数器2的控制字为10110111B,采用方式3,二进制计数。计数器2初值选择10000,产生0.01s 脉冲,输出作为计数器1的时钟信号。
8255:控制字为10000000B,A口B口均做输出;B口接GATE1,需要开始计数时初值设为01H。
5、倒计时
通过读系统时钟得到一个随机数,启动后通过loop倒计数,计完时灯亮,可以开始抢答。 这里倒计数时我并没有用数码管显示,这样才更有不可预见性。
6、计反应时间
倒计时结束后灯亮,此时PB0输出高电平,使计数器1开始工作,当有键按下且是正确的时 PB0输出低电平,计数器1停止工作。8253计数器2产生的0.01s时钟使得计数器1计得得时间 是以0.01s为单位,用0减去计数停止时的数即为从开始计数到按键之间的时间。分别获得这个 时间各位数字存入不同的变量,就可以在点阵上交替显示这些变量来得到反应时间。实验中数字 显示形式为xx:xx秒,红色数字显示为秒,黄色显示为0.01秒,四个数字交替显示就是测试者 的反应时间。
7、显示模块
8*8点阵上数字的现实原理:
字形0~9与段码有对应关系,例如数字5:8fh,89h,89h,0f9h,将数字0~9的段码依次放在变量 numx中,显示方法:行选地址-2A0H,红选地址-2A8H,黄选地址-2B0H,要显示某一个数字,对 应到位选信号00h,04h,08h,0ch,10h,14h,18h,1ch,20h,24h中的一个,映射到段码变量中就是所 要显示数字的段码,依次扫描显示。
显示模块的中心思想就是扫描,利用人眼的视觉暂留,看到4列LED灯都亮,显示相应的信 息。
四. 方案实现与测试
现在提交的程序与验收时的有所不同,验收时并没有实现全部功能,如反应时间的显示是通过中断显示在屏幕上,算是变相的实现。此后我又完善了一些功能,如点阵显示,随机亮红灯或绿灯。基本完成了实验要求。
实验现象:开始时若按“q”,则退出测试;若按其他键,重新显示提示信息,重新开始;若按“1”,测试开始,等待,当有灯亮时,如为红灯按“2”,为绿灯按“3”,如果按键准确,点阵显示时间,如果按错,屏幕显示“wrong!”,“Continue? (Y/N)”。
程序编译无误后连接实验箱进行调试,调试时首先分别单独连接点阵,8255,8253进行简单功能的验证,验证无误保证硬件不会影响到方案的实现。对显示模块的调节花了比较多的精力,刚开始点阵不显示,但硬件验证的时候点阵是没问题的,所以我先改为屏幕显示,通过中断使在运行到某一些关键步骤的时候输出一定的信息,功能验证无误后再连接点阵。其次是delay环节的时间,因为数字的显示是通过扫描完成的,所以delay时间不能太长也不能太短,通过不断的调试终于得到了合适的delay值。
五.分析与总结
通过这四周的课程设计,我学到了不少也发现不少问题。很大的一个问题是我没有很好的利用TD等调试工具,造成的后果就是不能及时发现问题出在哪里,所以效率相对较低,如果以后还有类似的课题,我一定要好好利用这些工具。另外隔了一个假期,对有一些基本知识和功能有一些陌生了,所以熟悉这些也花了不少时间,这是以后需要改进的地方。
我从不断想方案,否定一个再试一个,到完善程序,到不断调试出结果,最后能完成基本功能,我还是比较欣慰的。这和许多实践类课程一样,重在实践,当你写完程序觉得逻辑功能都很完美的时候,只是走出了一小步,当调试时会遇到各种各样意想不到的问题,在不断改进的过程中才能对理论有更好的把握。
对于这次实验而言,它将原来有些枯燥的基本实验实例化了,而且需要我们根据要求把它们有机联系在一起,实际设计了利用微机系统的一些应用。同时我了解到微机,乃至以后单片机的一些设计和应用的方法。虽然我没能把系统功能非常完美的呈现,但在这个过程中我从不断的错误中吸取很多教训,这些对以后的学习时间都是很有帮助的。当然,如果时间更加充裕的话,我相信我的设计会做的更加完善。
参考书目:
[1] 东南大学《微机系统与接口》课程组,微机实验及课程设计教程(试用版2.0),2009年2月
[2] 杨素行 等编著,《微型计算机系统原理及应用(第2版)》,北京,清华大学出版社,2004年
附汇编代码
PORT EQU 0E000H-280H
TIM_CTL EQU PORT+283H ;8253控制寄存器
TIMER0 EQU PORT+280H ;计数器0 1 2
TIMER1 EQU PORT+281H
TIMER2 EQU PORT+282H
CW_TIMER0 EQU 00110000B ;计数器0控制字,方式0
CW_TIMER1 EQU 01110001B ;计数器1控制字,方式0
CW_TIMER2 EQU 10110111B ;计数器2控制字,方式3
P8255_CTL EQU PORT+28BH ;8255控制寄存器,A口输出
P8255A EQU PORT+288H ;8255 A B C口
P8255B EQU PORT+289H
P8255C EQU PORT+28AH
LED EQU PORT+2A0H
LED_R EQU PORT+2A8H ;红选
LED_Y EQU PORT+2B0H ;黄选
DATE SEGMENT ;数据段
MESS1 db ' ******** XXXXXXXXX********',0dh,0ah,'$'
MESS2 dB ' Start --press 1',0DH,0AH
db ' red light on --press 2',0dh,0ah
db ' green light on --press 3',0dh,0ah
db ' stop --ANY KEY',0DH,0AH
db ' quit --press q',0dh,0ah,'$'
MESS3 DB ' Wrong!',0dh,0ah,'$'
MESS4 DB ' Continue? (Y/N)',0DH,0AH,'$'
num DB 00h,04h,08h,0ch,10h,14h,18h,1ch,20h,24h
numx db 0Ffh,81h,81h,0ffh,0ffh,00h,00h,00h,0f1h,91h,91h,9fh,0ffh,91h,91h,91h,0ffh,08h,08h,0f8h,8fh,89h,89h,0f9h,8fh,89h,89h,0ffh,0ffh,80h,80h,80h,0ffh,89h,89h,0ffh,0ffh,89h,89h,0f9h
NUM1 DB ?
num2 DB ?
NUM3 DB ?
num4 DB ?
DATE ENDS
;=============================================================
STAC SEGMENT PARA STACK 'STACK' ;堆栈段
STA DW 32 DUP(?)
TOP EQU LENGTH STA
STAC ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATE,SS:STAC,ES:DATE
START:
MOV AX,DATE
MOV DS,AX
MOV ES,AX
MOV AH,09H
MOV DX,OFFSET MESS1 ;显示提示信息
INT 21H
RANDOM PROC
PUSH CX
PUSH DX
PUSH AX
STI
MOV AH,0 ;读时钟计数器值
INT 1AH
MOV AX,DX
MOV BH,AH
MOV BL,AL ;BX作随机数
POP AX
POP DX
POP CX
RET
RANDOM ENDP
START1:
; 计数器1计反应时间
MOV DX,TIM_CTL
MOV AL,CW_TIMER1
OUT DX,AL ;计反应时间
; 计数器2产生0.01秒时钟
MOV DX,TIM_CTL
MOV AL,CW_TIMER2
OUT DX,AL
MOV DX,TIMER2
MOV AX,10000 ;计数初值为10000,输入1MHZ,输出100HZ
OUT DX,AL
MOV AL,AH
OUT DX,AL
;8255 A OUT,B OUT
MOV DX,P8255_CTL
MOV AX,10000000B ;A口输出,PA0~3红灯,PA4~7绿灯
OUT DX,AL
MOV AH,09H ;显示提示信息
MOV DX,OFFSET MESS2
INT 21H
mov ah,08h
int 21h
cmp al,'q' ;按"q",测试退出
jz quit01
mov ah,08h ;等待键盘产生“1”
int 21h
cmp al,'1' ;按"1",测试开始
JNZ start1 ;其他键,重新开始
CALL RANDOM
and bl,01h
cmp bh,0 ;随机数末尾数等于零则跳至红灯,否则绿灯
jz redlight
;=============================================================
greenlight:
MOV DX,P8255A
MOV AL,00H
OUT DX,AL ; 灯暗
CALL RANDOM
MOV AH,BH ; 倒计时
MOV AL,BL ;bl随机数
MOV CX,AX ;ax->cx
LOOP $
MOV DX,TIMER1
MOV AX,00H ;计数器1初植
OUT DX,AL
OUT DX,AL
MOV AL,01H ;B口初值,PB0接GATE1,使GATE1高
MOV DX,P8255B
OUT DX,AL
MOV DX,P8255A
MOV AL,0F0H
OUT DX,AL ;绿灯亮
jmp greenpress
quit01: jmp quit
redlight:
MOV DX,P8255A
MOV AL,00H
OUT DX,AL ; 灯暗
CALL RANDOM
MOV AH,BH ; 倒计时
MOV AL,BL ; bx随机数
MOV CX,AX
LOOP $ ;"$"操作符表示当前地址,这条指令不断执行,直到cx=0
MOV DX,TIMER1
MOV AX,00H ;初植
OUT DX,AL
OUT DX,AL
MOV AL,01H ;B口初值,PB0接GATE1
MOV DX,P8255B
OUT DX,AL
MOV DX,P8255A
MOV AL,0FH
OUT DX,AL ;红灯亮
jmp redpress
greenpress:
mov ah,08h ;等待键盘输入“3”
int 21h
cmp al,'3'
MOV AL,00H ;PB0变低,停止计数
MOV DX,P8255B
OUT DX,AL
jnz wrongmsg ;不正确显示错误信息
jmp lockk ;正确则跳至显示程序
redpress:
mov ah,08h ;等待键盘输入“2”
int 21h
cmp al,'2'
MOV AL,00H ;PB0变低,停止计数
MOV DX,P8255B
OUT DX,AL
jnz wrongmsg ;不正确显示错误信息
jmp lockk ;正确则跳至显示程序
QUIT00:JMP START1
lockk:
MOV DX,TIMER1
IN AL,DX
XCHG AL,AH
IN AL,DX
XCHG AL,AH ;AX为计数后值
MOV BX,0
SUB BX,AX ;相减得到反应时间
MOV AX,BX
AND AX,000FH
MOV NUM1,AL ;将要输出的值分别放入num1和num2,num3,num4(低位到高位)
MOV AX,BX
AND AX,00f0H
MOV CL,4
SHR AX,CL
MOV NUM2,AL
MOV AX,BX
AND AX,0f00H
MOV CL,8
SHR AX,CL
MOV NUM3,AL
MOV AX,BX
AND AX,0f000H
MOV CL,12
SHR AX,CL
MOV NUM4,AL
LOP0:
CALL DISP
MOV DL,0FFH
MOV AH,06H ;直接控制台I/O,al=输入字符的asc码,zf=0
INT 21H
JZ LOP0
QUIT:
mov ah,09h
mov dx,offset mess4
int 21h
mov ah,08h
int 21h
cmp al,'y'
jz QUIT00
cmp al,'Y' ;y/Y重新开始
jz QUIT00
MOV AX,4C00H ;否则返回dos
INT 21H
wrongmsg:
MOV AH,09H ;显示出错信息
MOV DX,OFFSET MESS3
INT 21H
JMP quit
;====================================================
; 以下为显示子程序段
DISP PROC NEAR
MOV BL,NUM4 ;时间显示形式:xx.xx秒
CALL DISP_R ;红色代表秒
MOV BL,NUM3 ;黄色代表0.01秒
CALL DISP_R ;四个数字交替显示
MOV BL,NUM2
CALL DISP_Y
MOV BL,NUM1
CALL DISP_Y
DISP ENDP
;======================================================
DISP_R PROC
mov cx,0f0fh
d1:
mov ah,01h
push cx
mov cx,0004h
mov si,offset num
mov bh,00h
add si,bx ;通过要显示的数字选择num中段码,得到numx中相应数字的码
next1:
mov al,[SI]
mov bx,offset numx
xlat ;得到第一行码
mov dx,led
out dx,al
mov al,ah
mov dx,led_R
out dx,al ;显示第一行红
shl ah,01
inc si
push cx
mov cx,0ffffh
delay1:
loop delay1 ;延时
pop cx
loop next1
pop cx
call delay
RET
DISP_R ENDP
;======================================================
DISP_Y PROC
mov cx,0f0fh
d2:
mov ah,01h
push cx
mov cx,0004h
mov si,offset num
mov bh,00h
add si,bx ;通过要显示的数字选择num中段码,得到numx中相应数字的码
next2:
mov al,[SI]
mov bx,offset numx
xlat ;得到第一行码
mov dx,led
out dx,al
mov al,ah
mov dx,led_Y
out dx,al ;显示第一行红
shl ah,01
inc si
push cx
mov cx,0ffffh
delay2:
loop delay2 ;延时
pop cx
loop next2
pop cx
call delay
RET
DISP_Y ENDP
;=============================================================
DELAY PROC NEAR ;产生延时为0.1秒的子程序段
PUSH CX
MOV CX,0F00H
LOOP $
POP CX
RET
DELAY ENDP
CODE ENDS
END START
16
展开阅读全文