收藏 分销(赏)

微机原理课程设计_抢答计时器[1].doc

上传人:xrp****65 文档编号:8972631 上传时间:2025-03-09 格式:DOC 页数:16 大小:130.50KB
下载 相关 举报
微机原理课程设计_抢答计时器[1].doc_第1页
第1页 / 共16页
微机原理课程设计_抢答计时器[1].doc_第2页
第2页 / 共16页
点击查看更多>>
资源描述
《微机实验及课程设计》报告 《微机实验及课程设计》 课程设计报告 目 录 一.课程设计目的与要求…………………………………………………………………………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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服