单片机课程设计8位智能抢答器.doc

上传人:文库蛋蛋多 文档编号:4147516 上传时间:2023-04-07 格式:DOC 页数:30 大小:1.05MB
返回 下载 相关 举报
单片机课程设计8位智能抢答器.doc_第1页
第1页 / 共30页
单片机课程设计8位智能抢答器.doc_第2页
第2页 / 共30页
单片机课程设计8位智能抢答器.doc_第3页
第3页 / 共30页
单片机课程设计8位智能抢答器.doc_第4页
第4页 / 共30页
单片机课程设计8位智能抢答器.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《单片机课程设计8位智能抢答器.doc》由会员分享,可在线阅读,更多相关《单片机课程设计8位智能抢答器.doc(30页珍藏版)》请在三一办公上搜索。

1、摘 要本次课程设计是采用7端数码管显示结果,以AT89C51单片机为核心,由八个抢答按钮,两个锁存器,开始按钮,复位按钮组成。八位智能定时抢答器可靠性高,反应速度灵敏,抢答器具有PC接口,可以对系统进行初始化、工作方式、显示时间的集中设置,使用人机界面操作,使操作简单易行。单片机应用的重要意义在于从根本上改变了传统的控制系统设计思想和设计方法,以前必须由模拟电路或数字电路实现大部分功能,现在已能用单片机通过软件方法来实现了。目 录一、课程设计目的:3二、课程设计内容:3三、硬件设计:33.1、硬件总原理图(见附录1)33.2、主要硬件介绍43.2.1 AT89C51简介43.2.2 74HC5

2、73简介103.2.3 LED数码管简介11四、软件设计、134.1主程序流程图134.2 定时器T0T1中断服务处理134.3 抢答处理设计144.4键盘扫描程序流程图154.5 抢答数码显示软件程序设计174.6软件程序(见附录2)18五、设计总结:18参考文献:19附录120附录221单片机原理及接口技术课程设计(8位智能定时抢答器)一、课程设计目的:1、 熟悉单片机仿真软件Proteus,单片机开发环境Keil的应用;2、 增进对单片机的感性认识,加深对单片机理论方面的理解;3、 使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。二

3、、课程设计内容:此倒计时抢答器可容纳8组参赛的数字式抢答器,它们的编号分别是1、2、3、4、5、6、7、8,首先按下电源开关,指示灯亮,再按下启动按钮SB1,抢答器可以进行20秒倒计时,选手必须在20秒之内进行抢答,八个选手,谁先按下自己手中的按钮,LED显示器SM就会显示相对应的选手号码,如果20秒还没有人抢答,那么抢答器自锁,本次抢答无效,按下复位按钮S10后可继续抢答。声控功能:在麦克风接口MIC处插入麦克风,主持人喊一声“开始”,抢答器开始进入20秒倒计时抢答阶段。声控切换按钮SB2和启动抢答开始按钮S9具有互锁功能,当声控切换按钮SB2开启之后,开始按钮S9处于无效状态,防止主持人在

4、没说“开始”之前就误按了启动抢答按钮,八个选手,谁先按下自己手中的按钮,LED显示器SM就会显示相对应的选手号码。三、硬件设计:3.1、硬件总原理图(见附录1)3.2、主要硬件介绍3.2.1 AT89C51简介3.2.1.1 AT89C51描述单片机全称为单片微型计算机(Single Chip Microcomputer)。因为单片机主要用于控制系统中,所以又称微控制器(Microcontroller Unit,MCU)或嵌入式控制器(Embedded Controller)。它具有嵌入式应用系统所要求的体系结构,微处理器,指令系统,总线方式,管理模式等。他把计算机的基本部件都微型化集成到一块

5、芯片上了,通常片内部都含有中央处理部件(CPU),数据存储器(RAM),程序存储器(ROM,EPROM,Flsh ROM),定时器/计数器和各种输入/输出(I/O)接口他们之间的相互连接结构如图2-1所示。AT89C51是一个低电压,高性能CMOS。8位单片机带有4K字节的可反复擦写的程序存储器(PENROM)和128字节的存取数据存储器(RAM),这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。片内含有8位中央处理器和闪烁存储单元,有较强的功能的AT89C51单片机能够被应用到控制领域中。CPU ROMRAM 定时器/ 计数器I/O 外设接

6、口时钟 图2-1 单片机结构3.2.1.2 AT89C51单片机内部结构AT89C51是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。 AT89C51单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:中央处理器中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。数据存储器(RAM)AT89C51内部有128个8位

7、用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。程序存储器(ROM)AT89C51共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。定时/计数器(ROM)AT89C51有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。并行输入输出(I/O)口AT89C51共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。全双工串行口AT89C51内置一个全双工串行通信口,用于

8、与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。中断系统AT89C51具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。时钟电路AT89C51内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。INTEL的MCS-51系列单片机采用的是哈佛

9、结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。3.2.1.3 AT89C51引脚功能特性图2-2 89C51单片机引脚图AT89C51提供以下的功能标准:4K字节闪烁存储器,128字节随机存取数据存储器,32个I/O口,2个16位定时/计数器,1个5向量两级中断结构,1个串行通信口,片内震荡器和时钟电路。另外, AT89C51还可以进行0HZ的 静态逻辑操作,并支持两种软件的节电模式。 图2-2 AT89C51引脚示意图闲散方式停止中央处理器的工作,能够允许随机存取数据存储器、定时/计数器、串行通信口及中断系统继续工作。掉电方式保存随机存取数据存储器中的内容,但震荡器

10、停止工作并禁止其它所有部件的工作直到下一个复位。1、VCC:电源电压2、GND:接地3、P0口: P0口是一组8位漏极开路双向I/O口,即地址/数据总线复用口。作为输出口时,每一个管脚都能够驱动8个TTL电路。当“1”被写入P0口时,每个管脚都能够作为高阻抗输入端。P0口还能够在访问外部数据存储器或程序存储器时,转换地址和数据总线复用,并在这时激活内部的上拉电阻。P0口在闪烁编程时,P0口接收指令,在程序校验时,输出指令,需要接电阻。4、P1口:P1口一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级图2-3 MCS-51系列单片机的内部结构示意图可驱动4 个TTL电路。对端口写“1”,通

11、过内部的电阻把端口拉到高电平,此时可作为输入口。因为内部有电阻,某个引脚被外部信号拉低时输出一个电流。闪烁编程时和程序校验时,P1口接收低8位地址。 5、P2口:P3口是一组带有内部电阻的8位双向I/O口,P3口输出缓冲故可驱动4个TTL电路。对P3口写如“1”时,它们被内部电阻拉到高电平并可作为输入端时,被外部拉低的P3口将用电阻输出电流。P3口除了作为一般的I/O口外,更重要的用途是它的第二功能(表1所示)。除此之外P3口还接收一些用于闪烁存储器编程和程序校验的控制信号。 6、RST:复位输入。当震荡器工作时,RET引脚出现两个机器周期以上的高电平将使单片机复位。7、ALE/:当访问外部程

12、序存储器或数据存储器时,ALE输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE以时钟震荡频率的1/16输出固定的正脉冲信号 ,因此它可对输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲时,闪烁存储器编程时,这个引脚还用于输入编程脉冲。如果必要,可对特殊寄存器区中的8EH单元的D0位置禁止ALE操作。这个位置后只有一条MOVX和MOVC指令ALE才会被应用。此外,这个引脚会微弱拉高,单片机执行外部程序时,应设置ALE无效。表1 P3口的第二功能端口引脚第二功能P3.0RXDP3.1TXDP3.2INT0P3.3INT1P3.4T0P3.5T1P3.6

13、WRP3.7RD8、:程序储存允许输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器读取指令时,每个机器周期两次PSEN 有效,即输出两个脉冲。在此期间,当访问外部数据存储器时,这两次有效的PSEN 信号不出现。9、EA/VPP:外部访问允许。欲使中央处理器仅访问外部程序存储器,EA端必须保持低电平。需要注意的是:如果加密位LBI被编程,复位时内部会锁存EA端状态。如EA端为高电平,CPU则执行内部程序存储器中的指令。闪烁存储器编程时,该引脚加上+12V的编程允许电压VPP,当然这必须是该器件是使用12V编程电压VPP。10、XTAL1:震荡器反相放大器及内部时钟发生器的输入端

14、。11、XTAL2:震荡器反相放大器的输出端。3.2.2 74HC573简介 74HC573 (八进制3 态非反转透明锁存器)跟LS/AL573 的管脚一样。器件的输入是和标准CMOS 输出兼容的。加上拉电阻,他们能和LS/ALSTTL输出兼容。当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。 图2-4 SL74HC573SL74HC573使用参数:输出能直接接到CMOS,NMOS 和TTL 接口上操作电压范围:2.0V6.0V低输入电流:1.0uA CMOS 器件的高噪声抵抗特性 SL74HC573功能如表2所示

15、。 表2 SL74HC573功能输入输出输出使能功能使用DQLHHLHLLLLXHXXZ注:X=无 Z高阻抗 3.2.3 LED数码管简介LED数码管是目前最常用的数字显示器,图A、B为共阴管和共阳管的电路,图C为两种不同出线形式的引出脚功能图。一个LED数码管可用来显示一位09十进制数和一个小数点。小型数码管(0.5寸和0.36寸)每段发光二极管的正向压降,随显示光(通常为红、绿、黄、橙色)的颜色不同略有差别,通常约为22.5V,每个发光二极管的点亮电流在510mA。LED数码管要显示BCD码所表示的十进制数字就需要有一个专门的译码器,该译码器不但要完成译码功能,还要有相当的驱动能力。图A

16、共阴连接(“1”电平驱动) 图B 共阳连接(“0”电平驱动)图2-5 LED数码管符号及引脚功能图LED显示器有静态和动态两种工作方式LED显示器工作在静态显示方式下,共阴极或共阳极连接在一起,然后接地或+5V;每位的段选线(A,B,G,H)与一个8位并行口相连。这样,只要在每一位的段选线上保持段选码电平,该位就能保持相应的显示字符。在多位LED显示时,为了化简电路,降低成本,将所有位的断选线并联在一起,由一个8位的I/O口控制,即控制段选码而共阴极或共阳极点分别由相应的I/O线控制即控制位选码,这就是动态显示。4位LED动态显示电路只需一个8位I/O口及一个4位I/O口,其中8个I/O控制段

17、选码,4位I/O控制位选。进行4位字符显示时,采用扫描显示方式,即在每一瞬间只使某一位显示相应字符,在此瞬间,段选控制I/O口输出相应字符段选码,位选控制I/O口在该显示位送入选通电平(共阴极送低电平,共阳极送高电平),以保证该位显示相应字符。如此轮流,使每位显示该位应显示字符,并保持延迟一段时间(15ms),以造成视觉暂留效果。不断循环送出相应的段选码、位选码,就可以获得视觉稳定的显示状态。四、软件设计、4.1主程序流程图此程序的及时采用定时器T0和T1中断完成,其余状态循环调用显示子程序。系统主程序流程图如图4-1所示:图4-14.2 定时器T0T1中断服务处理定时器T0用于响铃程序,定时

18、器T1用于计时程序。当答题剩余5秒种时P3.7口不断取反使喇叭发出一定频率的声音,提示选手当有选手第一个按下抢答器按扭时数码管显示选手号码,开始倒计时,并锁定抢答。当在此选手之后再有选手按下按扭时无效,数码管不变。定时中断程序流程图如4-2所示: 图4-24.3 抢答处理设计通过89S51芯片的控制,从而构成了整个电路。抢答组数可以在八组以内任意使用,流程图设计如下图1-8所示:图4-34.4键盘扫描程序流程图本系统的键盘采用的是44矩阵式键盘,矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。一个44的行、列结构可以构成一个含有16个按键的键盘,显然,在按键数量较多时,矩阵式键盘较之独

19、立式按键键盘要节省很多I/O口。矩阵式键盘中,行、列线分别连接到按键开关的两端,在进行键盘扫描时,首先把矩阵键盘列线的第一根线置高,然后分别再检测矩阵键盘行线是否有高电平的信号,如果有信号,那么就证明这根行线与第一根列线相交处的按键被按下了,单片机就读入这个键值。如果所有的四根行线都没有信号,那么就把第一根列线置低,把第二根列线置高,再一次检测行线有没有信号,然后依次类推。由于键盘扫描的速度很快,而人按键总会持续一定的时间,因此只要单片机处在等待输入的状态,这个键盘扫描程序基本上不会错过任何一个按键信号。由于一般人按键会有抖动,抖动信号造成键盘扫描时会出现一些错误的信号,要不就是扫描不进数据,

20、要不就是重复输入很多次数据,因此需要有一个消除抖动的程序。让单片机不响应一些相关的抖动信号,而只响应一次确实存在的按键信号。消抖动程序是这样实现的,当检测到一个脉冲信号时,并不立即认为是一次按键,而是延时一段时间以后再进行检测,如果三次检测都有信号,那么就认为有一次按键动作发生了。延时的选择非常重要,太快了,起不到消除抖动的效果,太慢了又让键盘太不灵活,错过较多的按键信号。键盘扫描程序的流程图如图4-4示。图4-4键盘扫描程序流程4.5 抢答数码显示软件程序设计采用静态显示,显示器由9个共阳极数码管组成。输入只有两个信号,它们是串行数据线DIN和移位信号CLK。9个串/并移位寄存器芯片74LS

21、164首尾相连,了九位共阳极七段数码管,共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起,通常,公共阳极接高电平(一般接电源),七它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻,这里的限流电阻选100。数码显示程序流程如图4-5:图4-5数码显示程序流程4.6软件程序(见附录2)五、设计总结:本设计定位于本学科发展方向对单片机的编程及数字电路的应用进行研究,并且得到了一些有意义的结论。抢答器的出现已经

22、很多年了,并且种类很多。目前抢答器的功能是比较完善的,即智能化,可靠性高,速度快,工作稳定。本设计采用了部分智能化,在抢答时间方面还须改进,而且在准确性方面也有待于改进。一个学期的单片机学习主要是课本上理论知识的学习,这些理论知识远不满足对单片机的应用的要求,这次设计给我们提供了一次很好的理论联系实际的机会,使得我们对单片机的功能以及应用有了更深的了解。另外,程序设计是本次的一个难点,由于对指令的运用不够熟练使得在编程时碰壁。特别对于一些中断程序,因涉及到一些标志位而使得编程难度更高,虽然通过查资料以及同学老师的指导解决了这些问题,但编程方面的欠缺还是很大的,这为我以后的学习敲响了警钟,在以后

23、我应加强这方面的练习以提高自己。在此期间,其中的酸甜苦辣都尝到了,在这过程中几乎每晚12点后睡觉,遇到问题及时通过网络查找资料,就连晚上睡觉都会时常梦到做设计。很久很久没有这样的感觉了,虽然很累,但感觉很充实,很有收获,尤其是最后看到自己设计的成果成功运行后那种感觉无法用语言来描叙,感觉所有的付出都得到了回报,是那么的理所当然又是那么的出人意料。参考文献:1.李朝青.单片机原理及接口技术. 北京: 北京航空航天大学出版社,2009.2.张迎新.单片机初级教程. 北京: 北京航空航天大学出版社,2007.3. 张义和protel99pcb99设计与应用技巧, 北京:科学出版社2000版.附录1附

24、录2#include /*-宏定义-*/#define uint unsigned int#define uchar unsigned char/*-共阳极数码管编码表 0 - f显示-*/uchar code table=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E;/*-变量定义-*/sbit start_stop = P36;sbit reset = P37;sbit key1 = P10;sbit key2 = P11;sbit key3 = P12;sbit key4 =

25、 P13;sbit key5 = P14;sbit key6 = P15;sbit key7 = P16;sbit key8 = P17;sbit state = P34;sbit kaishi=P31;bit start_stop_flag = 0;bit key1_flag = 0;bit key2_flag = 0;bit key3_flag = 0;bit key4_flag = 0;bit key5_flag = 0;bit key6_flag = 0;bit key7_flag = 0;bit key8_flag = 0;bit reset_flag = 0;bit action

26、= 0;bit kaishi_flag=0;uchar second = 20;uchar timer0_count = 0;uchar number = 0;uchar number_display = 0;/*-延时函数-*/void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*-数码管显示驱动函数-*/void display(uchar number,uchar second)uchar second_first,second_second;second_first = second / 10;second_second

27、 = second % 10;P2 = 0x01;P0 = tablenumber;delay(2);P2 = 0x02;P0 = 0xbf;delay(2);P2 = 0x04;P0 = tablesecond_first;delay(2);P2 = 0x08;P0 = tablesecond_second;delay(2);/*-开始键扫描函数-*/void start_stop_keyscan()if(start_stop = 0)delay(8);if(start_stop = 0)&(!start_stop_flag)start_stop_flag = 1;action = 1;TR

28、0 = 1;state = 0;elsestart_stop_flag = 0;/*-八位抢答键扫描函数-*/uchar key_scan8()if(key1 = 0)delay(8);if(key1 = 0)&(!key1_flag)key1_flag = 1;number = 1;number_display = number;elsekey1_flag = 0;number = 0;if(key2 = 0)delay(8);if(key2 = 0)&(!key2_flag)key2_flag = 1;number = 2;number_display = number;elsekey2_

29、flag = 0;number = 0;if(key3 = 0)delay(8);if(key3 = 0)&(!key3_flag)key3_flag = 1;number = 3;number_display = number;elsekey3_flag = 0;number = 0;if(key4 = 0)delay(8);if(key4 = 0)&(!key4_flag)key4_flag = 1;number = 4;number_display = number;elsekey4_flag = 0;number = 0;if(key5 = 0)delay(8);if(key5 = 0

30、)&(!key5_flag)key5_flag = 1;number = 5;number_display = number;elsekey5_flag = 0;number = 0;if(key6 = 0)delay(8);if(key6 = 0)&(!key6_flag)key6_flag = 1;number = 6;number_display = number;elsekey6_flag = 0;number = 0;if(key7 = 0)delay(8);if(key7 = 0)&(!key7_flag)key7_flag = 1;number = 7;number_displa

31、y = number;elsekey7_flag = 0;number = 0;if(key8 = 0)delay(8);if(key8 = 0)&(!key8_flag)key8_flag = 1;number = 8;number_display = number;elsekey8_flag = 0;number = 0;if(number_display != 0)return 1;elsereturn 0;/*-复位键扫描函数-*/void reset_keyscan()if(reset = 0)delay(8);if(reset = 0)&(!reset_flag)second=20

32、;reset_flag = 1;number_display = 0;state = 1;elsereset_flag = 0; /* 开机函数*/ void kaishi_keyscan()if(kaishi = 0)delay(8);if(kaishi = 0)&(!kaishi_flag)kaishi_flag = 1;number_display = 0;state = 1;elsekaishi_flag = 0;/*-主函数-*/void main()TMOD=0x01; TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=0;while(1)while(kaishi

33、= 0)&(!kaishi_flag)start_stop_keyscan();reset_keyscan();while(action)while(!key_scan8()display(number_display,second);if(second = 0)second = 20;break;TR0 = 0;second = 0;display(number_display,second);action = 0;break;display(number_display,second);/*-中断服务函数-*/void timer0() interrupt 1TH0=0x3c;TL0=0xb0;timer0_count +;if(timer0_count = 20)timer0_count = 0;second -;if(second = 0)TR0 = 0;number_display = 0;state = 1;action = 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号