扬州大学单片机课程设计抢答器.docx_第1页
扬州大学单片机课程设计抢答器.docx_第2页
扬州大学单片机课程设计抢答器.docx_第3页
扬州大学单片机课程设计抢答器.docx_第4页
扬州大学单片机课程设计抢答器.docx_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

扬州大学能源与动力工程学院课程设计报告题 目: 八位竞赛抢答器的设计 课 程: 单片机原理及应用课程设计 专 业: 电气工程及其自动化 班 级: 姓 名: 学 号: 第一部分任务书单片机原理及应用课程设计任务书一、课题名称详见单片机课程设计题目(一):主要是软件仿真,利用Proteus软件进行仿真设计并调试;单片机课程设计题目(二):主要是硬件设计,利用单片机周立功实验箱进行设计并调试。二、课程设计目的课程设计是课程教学中的一项重要内容,是达到教学目标的重要环节,是综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。单片机原理及应用是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要的地位。单片机原理及应用课程设计的目的是让学生在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能将课堂上学到的理论知识与实际应用结合起来,而且能进一步加深对电子电路、电子元器件等知识的认识与理解,同时在软件编程、排错调试、相关软件和仪器设备的使用技能等方面得到较全面的锻炼和提高。为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。通过单片机硬件和软件设计、调试、整理资料等环节的培训,使学生初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。三、课程设计内容设计以89C51单片机和外围元器件构成的单片机应用系统,并完成相应的软硬件调试。1.系统方案设计:综合运用单片机课程中所学到的理论知识,学生根据所选课题的任务、要求和条件进行总体方案的设计。2.硬件电路设计:对方案中以单片机为核心的电路进行设计计算,包括元器件的选择和电路参数的计算,并画出总体电路图。3.软件设计:根据已设计出的软件系统框图,用汇编语言或C51编制出各功能模块的子程序和整机软件系统的主程序。4.调试:在单片机EDA仿真软件环境Proteus下进行仿真设计并调试;或在单片机周立功实验箱上进行相关设计并调试。四、课程设计要求详见单片机课程设计题目(一)单片机课程设计题目(二)五、进度安排序号内容天数1布置任务,熟悉课题要求0.52总体方案确定,硬件电路设计1.53软件编程1.54Proteus仿真,或在周立功实验箱上调试25总结,撰写课程设计报告1.5七、课程设计报告内容:总结设计过程,写出设计报告,设计报告具体内容要求如下:1课程设计的目和设计的内容。2课程设计的要求。3控制系统总框图及系统工作原理。4控制系统的硬件电路连接图,电路的原理。5软件设计流程图及其说明。6电路设计,软件编程、调试中遇到的问题及分析解决方法。7实验结果及其分析。8体会。第二部分课程设计报告目录1课题简介11.1 课题目的与任务11.2 课题要求11.3 扩展功能12 八位竞赛抢答器方案设计12.1 系统总体介绍12.2 系统整体框图22.3系统工作原理23. 八位竞赛抢答器硬件电路设计23.1单片机芯片型号的选择23.2 电源方案的选择43.3 抢答器按键的选择43.4 时钟电路的设计53.5 复位电路53.6 显示电路63.7 主持人控制电路和蜂鸣器电路73.8 抢答器总硬件电路图74 八位竞赛抢答器软件编程设计84.1程序中伪指令及重点标志位简单介绍(不含硬件驱动中的伪指令)84.2 主程序部分的设计84.3初始主持人开关及作弊识别94.4 8*2矩阵式键盘的实现114.5检测按键及保持124.6回答倒计时144.7 MAX7219子程序164.8 LCD显示子程序174.9中断程序195实验与结果分析205.1 实验的调试205.2 实验的结果205.2.1 抢答器初始状态205.2.2 抢答器时间设置205.2.3 抢答器作弊检测215.2.4 抢答器正常工作状态215.2.5 抢答器回答倒计时工作状态225.3发现的不足之处236小结与体会24参考文献25附录261课题简介1.1 课题目的与任务 以单片机为核心,设计一个8位竞赛抢答器。1.2 课题要求1.同时供8名选手或8个代表队比赛,分别用8个按钮S0S7表示。2.设置一个系统清除和抢答控制开关S,开关由主持人控制。3.抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。4.抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。5.当主持人启动“开始”键后,定时器进行减计时,同时蜂鸣器发出短暂的声响,声响持续的时间为0.5s左右。6.参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。7.如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。1.3 扩展功能1.LCD显示器显示当前工作状态。2.抢答开始前按下强大按钮定义为抢答作弊,在LCD上显示作弊者并且发出报警,并维持到主持人按复位或开始。3.加入回答功能,主持人增加三个按钮,分别为“回答计时”、“正确”和“错误”用于抢答完成后的操作,回答正确或错误均会在LCD上显示,如果在规定时间内未完成也会发生报警。4.扩展抢答人数,由最高8人抢答变为最高16路抢答,兼容更多场合。2 八位竞赛抢答器方案设计2.1 系统总体介绍 多路竞赛抢答器用于生活中常见抢答环节,本抢答器基于51单片机系统,利用单片机运行高速可靠的特点,结合适当的外部电路,达到自定抢答时间、作弊检测、16路抢答、回答倒计时等功能。抢答器使用了单片机P3.3 P3.4与抢答矩阵式按钮地址端相连,P1与数据端相连,达到16路输入的目的,在抢答按钮按下之前,复位按钮具有设定时间的功能,并且此时任意选手按抢答按钮都会被识别为作弊,并在LCD上显示及发出报警声,当按下抢答按钮后,发出短暂提示音,第一个按下抢答按钮的选手会被识别,其他选手信号被封锁,程序进入等待命令状态并发出报警声,由主持人决定是复位还是进行回答倒计时,如果复位,抢答器即刻进入初始状态,如果按回答计时按钮,那么程序将进入回答倒计时模式,主持人根据选手回答情况确定正确与否,结果在LCD上显示,如果在限定时间内选手未做回答,那么抢答器会发出报警声直到主持人复位。2.2 系统整体框图晶振电路复位电路AT89C51抢答键盘模块LCD显示模块蜂鸣器数码管显示模块主持人控制模块图12.3系统工作原理首先通过单片机编程检测来自主持人按钮的低电平信号控制抢答器的整体运行状态,在未开始抢答前,通过持续检测抢答按钮来达到防作弊的功能,当进入抢答环节时,通过高速扫描抢答按钮以达到准确指示抢答者的目的,在未进入中断的情况下,其检测精度可达10uS级别,基本可以做到公平性,并通过加入回答倒计时与结果显示,直观并且符合生活实际情况,通过MAX7219驱动数码管显示时间与抢答者,节省I/O口的同时也节省了CPU时间,间接上也为检测精度提供保证,使用了LCD1602指示抢答器各个部分的工作状态,并且可在开始前显示作弊者,抢答器实用性得以提高。3. 八位竞赛抢答器硬件电路设计3.1单片机芯片型号的选择在之前的单片机课程和实验中,我们学习和使用过AT89C51的单片机,用AT89C51单片机来控制电路,简单、方使用AT89C51单片机结合字符型LCD显示器设计一个简易的可编程作息时间控制器,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。程序执行后工作指示灯LED闪动,表示程序开始执行,同时显示系统时间。作息时间控制器是由4路可调闹钟组成,从而实现打铃等功能。当四路闹钟中的任一路到时,均会点亮灯、打铃。其中操作键K1K4的功能分别为:设置限制的时间/时的调整、显示闹钟设置的时间/分的调整、设置闹钟的时间/设置完成、闹钟更换。在电子计算机基础上发展而来的可编程作息时间控制器,它可以利用电子计算机的内部时间,通过程序判断处理,完成对作息时间的精确控制,并且由于是程序控制,所以可通过改变程序进而灵活改变作息时间,同时可以实时显示时间,并实现打铃功能。可编程时间控制器可实现对时间控制的智能化,摆脱由人控制时间的长短不同的不便,并且可以在必要时人工切入控制,完美的满足作息时间控制。便。最重要的就是写程序,如何通过程序来达到抢答器的作用,利用51单片机来说补充了集成电路中所缺的遗漏,更是在集成电路上更加精准,对选手更加的公平,让选手都站在同一的战线上。AT89C51的引脚功能说明Vcc:电源电压GND:地P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在FIash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。FIash编程和程序校验期间,P1接收低8位地址。P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVXDPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVXRI指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中R2寄存器的内容),在整个访问期间不改变。Flash编程或校验时,P2亦接收高位地址和其它控制信号。P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。图2RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的l6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的DO位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,这两次有效的PSEN信号不出现。EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000HFFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接VCC端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。XTAL2:振荡器反相放大器的输出端。3.2 电源方案的选择系统需要多个电源,AT89C51使用5V稳压电源。采用三端稳压集成78L05得到5V的稳定电压。利用该方法方便简单,工作稳定可靠。3.3 抢答器按键的选择 使用AT89C51单片机IO口直接连接按键,稳定可靠,但是现实中往往存在抢答人数不止8人的情况,而单片机IO口又有限,使用矩阵式键盘可以很好地解决这个问题,但存在每加一组键盘就要多一次扫描循环,需要在判断准确性与硬件资源之间做出选择,故使用了8*2的矩阵式键盘,配合相应程序,可以达到不错的效果。这16个按键两两接在P1口上,两根选择线分别为P3.3、P3.4,如图所示图33.4 时钟电路的设计本设计所采用的时钟信号为C51中的内部形式,内部方式实现单片机的时钟电路,利用单片机芯片上提供的反相放大器电路,在XTAL1和XTAL2引脚之间外接振荡器构成一个自激振荡器,自激振荡器与单片机内部的始终发生器构成单片机的时钟电路。如图中,由OSC和电容C1和C2构成了并联谐振回路作为定时元件,振荡源OSC可选用晶体振荡器或陶瓷振荡器,频率为12MHz,电容C1、C2为30pF,起频率微调作用。图43.5 复位电路在单片机工作过程中,由于某种原因使单片机陷入“死机”状态,或根据需要采用强制手段使程序重新开始执行等等,需要采用按钮开关复位方式。当按钮开关S按下时,+5V电源通过S接入电阻构成的电路网络,设计时使电阻上的分压达到高电平的阀值,就可以使单片机复位。因为我们按动按钮开关使其闭合的时间远远大于单片机复位所用的时间。通常把上电自动复位电路和按钮开关复位电路综合在一起,这样既可以在每一次电源接通时系统复位,也可以满足强制复位的要求。图53.6 显示电路MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。 只有一个外部寄存器用来设置各个LED的段电流。 MAX7221与SPI、 QSPI以及 MICROWIRE相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。 一个方便的四线串行接口可以联接所有通用的微处理器。 每个数据可以寻址在更新时不需要改写所有的显示。MAX7219同样允许用户对每一个数据选择编码或者不编码。 整个设备包含一个150A的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。本设计采用LED数码管和液晶显示器显示,其中四个数码管接MAX7219显示,MAX7219 DIN接P3.0、LOAD接P3.1、CLK接P3.2,液晶显示器D0-D7接P0口,P0口上拉至高电平,RS、RW、E分别接P2.4-P2.6,如图所示 图63.7 主持人控制电路和蜂鸣器电路抢答开始按钮接P2.1,复位与设置时间按钮接P2.0,回答计时按钮接P2.3,回答正确按钮接P2.6,回答错误按钮接P2.7图73.8 抢答器总硬件电路图图84 八位竞赛抢答器软件编程设计多路竞赛抢答器软件编程主要包括系统初始化、抢答时间的设定与复位、开始按键检测、抢答人按键检测、矩阵式键盘控制、回答环节控制、逻辑控制、MAX7219数码管显示、1602LCD液晶显示和蜂鸣器控制,整个程序中的按键检测是核心部分,需要抢答扫描循环尽可能快速,这样才能尽可能减少空窗时间得到准确的抢答人数据,得到抢答人的数据之后的数据处理与显示保持也尤为重要,这是抢答器基本功能的保证,配合其它各个模块,实现完整的抢答器功能。4.1程序中伪指令及重点标志位简单介绍(不含硬件驱动中的伪指令)SO BIT 2FH.0 ;发声标志RESET EQU P2.0 ;抢答复位与设定时间STA EQU P2.1 ;抢答开始TTIME EQU 10H ;暂存时间16进制TIME EQU 15H ;时间10进制PL EQU 12H ;抢答到的人TEAM EQU 39H ;抢答到的人所在组 ;LCD n的程序为显示子程序 ;F0为时间是否已到与KEY0 EQU P3.3KEY1 EQU P3.4FLAGT EQU 2FH.1 ;是否进HOLDON循环标志ANS EQU P2.2 ;回答按键FLAG0 EQU 2FH.2 ;选手编号跳出循环标志WRO EQU P2.6 ;抢答正确与否RIG EQU P2.7 1. F0定义为时间标志,F0在程序初始化时置1,当定时器T0达到预设时间时F0置02. SO定义为发声标志,SO在程序初始化时置0,定时器T1在初始化时就启动,在中断程序中如果SO为1则P3.7取反发声(500HZ)。3. FLAGT定义为是否进HOLDON循环标志,FLAGT在程序初始化时置0,用于判断是否有人抢答,程序中已跳过时间到而进该循环,主要用于后续MAX7219显示问题,也是由于加入16位抢答加入的判别标志位。4.2 主程序部分的设计使用VISIO画出系统简要流程图如下,代表了系统的总体运行逻辑,其中已略去了外围用户交互环节在流程图中的显示,程序已大量使用子程序模块化,避免重复代码段频繁出现,影响程序易读性和后续扩展,在初始化程序中已将各器件复位,主程序代码段较长,见附录。图94.3初始主持人开关及作弊识别初始时主持人有两个开关,复位按钮和开始按钮,复位开关在此时具有设置时间的功能,默认和最高均为30S,按一下加1到1S、2S,若长按,设定时间会大致每秒加1,操作方便,而此时也有作弊检测,具有较高的灵敏度和可重复性,当按下开始开关后,该循环跳出,进入下一循环,具体见流程图及程序。图10;判断开关是否按下ST0:LCALL DISPLAYJB RESET,ST1 ;判断是否需要调整时间JNB SO,NEXT1JNB RESET,INI ;作弊复位NEXT1:LCALL DELAYXINC TTIME ;这里设置为加1调整,MOV A,TTIME MOV B,#10DIV ABSWAP AADD A,BMOV TIME,A ;显示时间进制转换MOV A,TTIME CLR CCJNE A,#31,ST1 ;最高允许30s,也是默认值MOV TTIME,#01HMOV TIME,#01H ;超出30s重置为1s开始;*;判断是否有人作弊ST1:LCALL MATMOV A,P1CPL AMOV B,AJZ NEXTMOV CHEATER,#00H; DEAL0: ;将P0口读到的数据转换至对应作弊选手编号(移位)CLR C ;移位前准备RRC ACLR CINC CHEATER ;移位计数,获得作弊选手号JNZ DEAL0MOV A,CHEATERMOV A,#00HADD A,TEAMADD A,CHEATER ;得到编号MOV B,#10DIV ABMOV TEAM,AMOV CHEATER,BSETB SO ;发声报警LCALL LCD1NEXT:JB STA,ST0 ;没有开关按下,返回判断是否修正时间,否则执行抢答LCALL LCD3SETB F0 ;循环标志,后续用于跳出循环,时间到可使之置0 SETB TR0 ;启动定时LCALL DELAYSO ;短暂发声4.4 8*2矩阵式键盘的实现由于单片机I/O口有限,故使用了8*2的矩阵式键盘,首先将矩阵式键盘控制端口P3.3清零、P3.4置1,作为键盘初始化,在子程序中先对两口取反,然后在TEAM(已定义)单元中保存状态(0或8),为后续计算提供数据,具体见流程图及程序。图11;*;矩阵式键盘子程序MAT: CPL KEY0 CPL KEY1JB KEY0,ELSE0MOV TEAM,#00HRETELSE0:MOV TEAM,#08HRET4.5检测按键及保持抢答按键检测为抢答器的关键步骤,在这步中需重点解决检测的实时性,数据处理尽可能留在保持环节处理,以保证尽可能小的空窗时间,以达到抢答器的公平准确性,故采用了直接读P1口的方法,通过在保持环节移位以及与TEAM内寄存数字相加再转为10进制在数码管上显示,具体见流程图及程序。图12;*;关键循环,用于判断是否有按下START:JNB F0,HOLDON ;时间是否已到LCALL MAT ;矩阵式键盘子程序MOV A,P1XRL A,#0FFHJNZ HOLDONLJMP START;*;时间到或者有人抢答,转入此循环等待HOLDON:MOV 17H,A ;A数据暂存CLR TR0 ;有人抢答停止计时H1:JB F0,H2LCALL LCD4 ;LCD显示结束H2:JNB F0,HOLDLCALL LCD5 ;LCD显示抢答成功HOLD:MOV A,17H ;数据恢复JZ CONTINUE ;用于下面移位转换循环的执行条件MOV PL,#00H;SETB FLAGT ;有人抢答才置1DEAL: ;转换CLR CRRC ACLR C ;移位转换INC PLJNZ DEALCONTINUE:JB FLAG0,KOADD A,TEAMADD A,PL ;得到编号MOV B,#10DIV ABMOV TEAM,AMOV PL,BSETB FLAG0MOV 17H,#00HSJMP KOST00:LJMP INIKO:JNB FLAGT,$+6JNB ANS,ANSWER ;回答倒计时JNB RESET,ST00 ;按下复位键后回到起始状态,但由于此处转移字节已超过128B,所以迂回使用了LJMPSETB SOLCALL DISPLAYAJMP HOLD ;否则维持状态4.6回答倒计时回答倒计时是在选手已抢答成功的情况下使用的附加功能,首先将时间置为31(由于此时显示程序在T0中断,需过1秒才能显示,故设为31,使存在30秒这个显示时刻),如何进入判断主持人按钮正确错误循环,一旦选择,将在LCD显示器上有“RIGHT”或“WRONG”显示,如何进入等待复位循环,但如果在30S内未检测到按键,那么抢答器将停止计时并报警,按键面板仅有复位可用,具体见流程图及程序。图13;*;回答倒计时ANSWER:CLR SO ;停止报警MOV TTIME,#31 ;默认回答倒计时30SSETB TR0LCALL LCD6 ;LCD显示L1:JNB TR0,L3 ;封锁JB WRO,L2 ;回答正确与否LCALL LCD7CLR TR0L2: JB RIG,L1LCALL LCD8CLR TR0L3:JB RESET,$LJMP INI4.7 MAX7219子程序抢答器在使用时会有很多次使用数码管的情况,虽然已将使用MAX7219做成驱动程序,但是使用起来还是缺乏灵活性,故加入了DISPLAY子程序,使程序无论执行到何种情况,只要调用DISPLAY,均能直接得到数码管显示,省去了许多中间重复代码,即节省了ROM空间又提升了程序的易读性,抢答人显示数码管在不同情况不同,需满足逻辑:1.程序在初始及倒计时但为抢答时,抢答人的数码管为00;2.一旦有人抢答需即刻显示抢答人;3.进入回答倒计时时需显示抢答人。具体见流程图及程序。图14;* 39;MAX7219显示程序M7219_CLK BIT P3.2M7219_DIN BIT P3.0M7219_LOAD BIT P3.1LED_BUF EQU 50H SET_MODEL EQU 0FFH SET_BRIGHT EQU 04H SET_LIMIT EQU 03H SET_NORMAL EQU 01H SET_START EQU 01H DISPLAY:MOV A,#00HJNB FLAGT,GVA0;是否抢答MOV A,PL GVA0:MOV B,A;TTIME送端口 MOV A,#01HLCALL w_7219;放入MAX7290子程序 JB FLAGT,GVAMOV A,#00HSJMP GVA2GVA:MOV A,TEAMGVA2:MOV B,A MOV A,#02HLCALL w_7219MOV A,TIMEANL A,#0FHMOV B,AMOV A,#03HLCALL w_7219 MOV A,TIMESWAP AANL A,#0FHMOV B,AMOV A,#04HLCALL w_7219LCALL DELAYRETINIT_M7219: ;初始化MAX7219MOV A,#0BH MOV B,#SET_LIMIT LCALL W_7219MOV A,#09H MOV B,#SET_MODEL LCALL W_7219MOV A,#0AH ;设置亮度MOV B,#SET_BRIGHT ;15/32亮度LCALL W_7219MOV A,#0FH MOV B,#SET_NORMAL LCALL W_7219MOV A,#0CH MOV B,#SET_STARTLCALL W_7219RETDISP:MOV R0,#LED_BUFMOV R4,#01HMOV R3,#SET_LIMITDISP1:MOV A,R0MOV B,AMOV A,R4LCALL W_7219INC R0INC R4DJNZ R3,DISP1RET W_7219:CLR M7219_CLKCLR M7219_DINCLR M7219_LOAD ;置LOAD=0LCALL SD_7219 ;传送7219的地址MOV A,B LCALL SD_7219 ;传送数据SETB M7219_LOAD ;数据装载CLR M7219_DINRETSD_7219: ;向7219送地址与数据MOV R2,#08H C_SD: CLR CCLR M7219_CLKRLC AMOV M7219_DIN,C ;准备数据NOPSETB M7219_CLK ;上升沿将数据传入NOPNOPCLR M7219_CLKDJNZ R2,C_SDRET4.8 LCD显示子程序LCD器件使用简单,且大部分均为查表指令,故这里不多做介绍,进行一些格式控制,LCD即可显示不错的效果,。使用LCD时:VSS引脚接地,VDD提供电源,VEE接滑动变阻器来控制液晶屏的对比度。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。LCD显示子程序仅展示“PLAYER n CHEAT”这段显示的实现程序,其余大同小异,不再赘述。(由于读忙信号不稳,所以具体实现时使用了延时(5ms);*;LCD显示程序 RS EQU P2.3RW EQU P2.4E EQU P2.5LCD EQU P0BF EQU P0.7CHEATER EQU 36H;LCD显示区 (LCD显示内容)LCD1:LCALL LCDINIMOV A,#84HLCALL W_CMDMOV DPTR,#TABMOV R7,#0 ;CHEATLP1:MOVA,R7MOVC A,A+DPTRLCALL W_DATAINC R7CJNE R7,#06,LP1MOV A,#32;空格LCALL W_DATAMOV A,#30HADD A,TEAMLCALL W_DATAMOV A,#30HADD A,CHEATERLCALL W_DATAMOV A,#0C6HACALL W_CMDLP2:MOV A,R7MOVC A,A+DPTRLCALL W_DATAINC R7CJNE R7,#11,LP2RET;LCD初始化LCDINI:MOV A,#38HLCALL W_CMDMOV A,#0CHLCALL W_CMDMOV A,#06HLCALL W_CMDMOV A,#01HLCALL W_CMDRETW_CMD:ACALL WAITCLR RSCLR RWMOV LCD,ASETB ECLR ERETW_DATA:ACALL WAITSETB RSCLR RWMOV LCD,ASETB ECLR ERETWAIT:MOV R6,#20W1:MOV R5,#250DJNZ R5,$DJNZ R6,W1RETTAB: DB PLAYERDB CHEAT4.9中断程序本抢答器使用了两个定时器,定时器T0用于抢答器计时使用,T1作为蜂鸣器发声音源信号,两个定时器均工作在方式一,其中T0中断中调用了DISPLAY子程序,主要是为了数码管时间显示,放在该处考虑到这样占用CPU时间最少而又能达到效果,T1在SO为1时每中断一次翻转P3.7一次作为音源,具体中断程序如下。;*;中断;定时器T0中断T00: ;定时器t0中断MOV TH0,#3CHMOV TL0,#0B0H ;50ms定时DJNZ 11H,RETI1MOV 11H,#20 ;1s定时MOV A,TTIME DEC A MOV B,#10DIV ABSWAP AADD A,BMOV TIME,A ;定时进制转换16转10 LCALL DISPLAYDJNZ TTIME,RETI1CLR TR0 ;自停止CLR F0 ;时间到无人抢答清零F0跳出检测循环SETB SO ;发声RETI1:RETI;定时器1中断,频率500HZ,用于喇叭发声T11: MOV TH1,#0FCH MOV TL1,#18HJNB SO, RETT11 ;判断发声标志位SOCPL P3.7RETT11: RETI5实验与结果分析5.1 实验的调试设计要求:多路竞赛抢答器主要功能包括:抢答时间的设定与复位、抢答作弊检测、抢答倒计时、抢答人显示并维持、回答倒计时、显示工作状态以及蜂鸣器提示等功能由于编程使用Keil而仿真调试需要用到Protues,所以二者的联调显得格外重要,有利于程序后续的单步执行DEBUG。首先需要要把Keil的工程文件和Proteus的文件放在同一个目录下,从网上将VDM51.dll文件复制到Keil安装目录的C51BIN目录中(如果没有可以自己下载)。修改Keil安装目录下Tools.ini文件,在C51 栏目下加入TDRV9=BINVDM51.DLL (Proteus VSM Simulator),打开Proteus,加载相应的电路和hex文件,在Debug菜单中选中Use Remote Debug Monitor。打开Keil,载入程序,选择菜单Project-Option for target ,在Debug选项中右栏上部的下拉菜单选中Proteus VSM Simulator,再进入Setting,将IP名改为127.0.0.1,端口号为8000。在初始准备工作完成后,接下来就进行功能的调试与验收。5.2 实验的结果5.2.1 抢答器初始状态在程序编程中需达到的效果:LCD显示READY,计时显示为30,抢答人为00。抢答器符合预期要求。图155.2.2 抢答器时间设置在程序编程中需达到的效果:每按一次设定时间,时间加1,默认与最高时间均设为30S,长按设定时间大致每秒往上加1,时间可调性较好,且LCD显示为READY。抢答器符合预期要求。图165.2.3 抢答器作弊检测在程序编程中需达到的效果:LCD显示作弊者,格式为PLAYER N CHEAT,蜂鸣器报警,且如果松开按键LCD仍显示该人,如此时其他也有人按下,LCD也会进行更新显示,计时显示为设定时间,抢答人为00,且复位后时间变为30S,也可不复位直接进行抢答。抢答器符合预期要求。图175.2.4 抢答器正常工作状态在程序编程中需达到的效果:LCD显示RACING,蜂鸣器在开始按钮按下后有半秒左右提示,计时时间每秒减1,当有多人抢答时,抢答人为第一个按动抢答键的人所在编号,蜂鸣器提示,计时停止,LCD显示DONE,若设定时间已过仍未作答,则封锁按键信号,所有人不得抢答,蜂鸣器报警,LCD显示OVER。抢答器符合预期要求。图185.2.5 抢答器回答倒计时工作状态在程序编程中需达到的效果:仅在有选手合法抢答的情况下该功能才可用,按下回答计时键,抢答器开始30S倒计时并显示抢答者编号,LCD显示ANSWING,若在倒计时完成前选手回答完毕,由主持人按正确或错误按钮,抢答器结束计时,维持状态,LCD显示相应结果,若倒计时完成后选手还未完成作答,定义为抢答失败,蜂鸣器报警,数码管维持,按下复位键后恢复到初始状态。抢答器符合预期要求。图19图205.3发现的不足之处虽然本抢答器在检测循环做得比较到位,达到100000HZ左右频率高速检测,空窗时间较小大致为10uS,由于加入矩阵式键盘,空窗时间大致20uS,可以疏略不计,但在极限情况,在检测的时候进入每秒一次的7219中断显示,那么这段中断时间可能是检测循环耗时的百倍,也就是说在中断显示时会留出10mS及以上的空窗时间,这可能会导致这期间有两人同时作答,虽然发生可能性较小,但有必要进行一下说明。假使出现这种情况,那么由于程序中算法的设定,始终是显示高位的抢答者(移位算法所致),考虑到程序的易用性与可靠性,在编程中并未将移位中同时检测Cy的步骤加入,所以程序不会因此出现报错,在这种实时检测的系统中,最好是将计时器显示与抢答检测做成两个不同的硬件,通过信号连接起来,这样就不会出现上面的情况了。6小结与体会单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。所以学好单片机对于我们工科学生来说格外重要,这次单片机课程设计给了我们一个很好的机会去进一步熟悉单片机以及初步了解如何用单片机做开发。说得容易做的难,在这次单片机课程设计中我深深了解到了这一点,一开始我拿到题目时发现我做的是抢答器,想到大二数电时曾经做过一个,那时是纯硬件搭电路,就想当然以为这次差不多应该不花什么时间,结果到开始做了才发现程序这东西真的逻辑性很强,前面一点不留心的错误都会在程序其他地方有所体现,其中特别让我印象深刻的是我调用DELAY子程序,写成了LJMP,导致程序程序一DELAY就返回程序首端,一开始程序比较杂乱,找了很久才找到这个问题。在解决数码管显示的问题时,MAX7219这个芯片的使用也让我学到了不少,一开始自己写驱动,弄了半天也没出来,后来上网找了教程,按照上面的时序进行了改进,成功显示,可见查询资料也是非常重要的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论