微机原理课程设计抢答计时器
微机实验及课程设计课程设计报告目 录一课程设计目的与要求3二方案论证与原理设计3三详细设计4四方案实现与测试6五分析与总结71、基本要求设计一个用于智力竞赛的抢答计时器,同时能测试人的反应(响应)时间。按启动钮,测试开始,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 PA0PB1 PA1PB2 PA2PB3 PA3PB4 PA4PB5 PA5PB6 PA6PB7 PA7红灯GATE1 2A0H8*8点阵 2A8H绿灯 2B0H8255OUT2CLKCLK1 CLK2GATE1 GATE2 OUT1 OUT2 PB05V (CLK来自系统脉冲1MHZ) CLK1 82532、主程序流程图与显示子程序流程图主持人开始? 初始化芯片 产生随机数是随机数末位为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点阵上数字的现实原理:字形09与段码有对应关系,例如数字5:8fh,89h,89h,0f9h,将数字09的段码依次放在变量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 杨素行 等编著,