16路抢答器(带电路图和程序)

更新时间:2024-06-02 08:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机课程设计

题目:十六路抢答器

学 院: 电 气 学 院

学生姓名: 学生学号: 指导老师:

摘 要

抢答器是一种应用非常广泛的设备,无论是在学校、工厂、军队还是益智性电 视节目都会举办各种各样的智力竞赛, 都会用到智力抢答器。目前市场上已有各 种各样的智力竞赛抢答器, 但绝大多数是早期设计的, 以模拟电路、数字电路或 者模拟电路与数字电路相结合的产品。这部分抢答器已相当成熟, 但功能越多的 电路相对来说就越复杂, 且成本偏高, 故障高, 显示方式简单( 有的甚至没有显 示电路) , 无法判断提前抢按按钮的行为, 不便于电路升级换代。近年来随着单 片机的应用不断深入,基于单片机控制的抢答器的设计越来越被人们广泛的接受, C51 语言的成熟和单片机本身的汇编语言的融合即混合编程使得它比一般的汇编 语言有更好的可读性。 本次设计中将采用AT89S51单片机为主控核心,在设有16个抢答键的抢答电路 模块、控制电路模块和LED显示电路模块的共同作用下,可供16人同时抢答。主持 人按下开始按钮后,哪一个先抢答,则在数码管上显示选手编号,同时给出声音 提示并封锁输入,其他选手再抢答则无效。具有定时抢答功能,抢答时间可由主持 人设定。在设定时间内抢答有效,定时器停止工作。定时时间已到,无人抢答,本次 抢答无效。

关键词: 关键词:抢答器智力;单片机; 抢答器;数码显示

一、课题研究的主要内容

在抢答未开始时任何抢答均无效,抢答开始可显示最先抢答代表

队的编号, 同时给出声光提示,并封锁输入的数据,在系统清零前禁止其他选手抢答。具有定 时抢答功能,抢答时间可由主持人设定。 在设定时间内抢答有效,定时器停止工作, 定时时间已到,无人抢答,本次抢答无效,其主要技术参数如下:

(1)可同时供16 个代表队参加比赛; (2)给节目主持人一个控制开关,用来控制系统清零和抢答开始; (3)能随时更改抢答时间; (4)有数码显示功能。

二、硬件电路设计 2.1系统框图

AT89S51单片机要实现主持人按开始键后,抢答器开始20秒倒计时。20秒之内有人抢答,则在LED数码管上显示该代表队编号并封锁输入,其他选手抢答无效。此时按下开始键,复位键有效。在开始抢答之前,主持人可预先设定抢答时间和限时时间。系统具有声光提示功能。由我们分析可以看到,核心部分还是AT89S51单片机,基于AT89S51单片机的系统框图如图2-1-1所示:

电源电路 复位电路 主持人按键

anjian按键 选手按键

图2-1 系 统 框 图

AT89C51 数码提示

2.2时钟电路设计

单片机必须在时钟的驱动下才能工作。AT89C51

中有一个用

于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。时钟频率控制电路如图2-2-1所示。

图2-2 外部振荡电路

单片机在工作时,由内部振荡器产生或由外部直接输入的送至内

部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数。时钟频率选为12MHz。

2.3复位电路设计

在抢答器中复位是为定时做铺垫的,在抢答之前要复位,抢答完毕要复位,按了复位键之后LED显示F。单片机的复位引脚RST出现2个机器周期以上的高电平时即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图2-3所示。

图2-3 复位电路

2.4抢答电路设计

单片机常用的键盘有全编码键盘和非编码键盘两种。全编码键盘能有硬件逻辑自动提供与被按键对应的编码,如BCD码键盘、ASCII码键盘等,价格较贵,一般的单片机应用系统较少采用;非编码键盘分为独立式键盘和矩阵式键盘,硬件上只是提供通、断两种状态,其他工作都靠软件完成,经济实用,目前单片机应用系统中多采用这种方法。

在智力抢答器设计中,要求有16个代表队参加抢答,每个代表队一个抢答按钮,就需要16个按钮,而选手抢答器按钮就是用独立式键盘或矩阵式键盘来完成的。独立式键盘电路要求一个端口连接一个按键,硬件电路简单但浪费成本。当按键数较多时,要占用较多的I/O口线。因此一般在按键数大于8时,通常采用矩阵式键盘电路。若P0口和P2口用于控制数码管的显示(P1口控制七段数码管,P2口则驱动数码管的位显示),P3口用于主控电路的设计,剩下的八位的P1口如果用独立式键盘明显达不到要求,但如果采用矩阵式键盘电路,8个I/O刚好可以构成4×4矩阵式键盘电路,满足16个代表队参加抢答的要求。

16路抢答器抢答电路设计即4×4矩阵式键盘电路,如图2-4:

图2-4 矩阵式键盘

2.5 显示电路设计

在本设计中采用的是共阴极接法的数码管,由P0口驱动七段数码显示管,P2口驱动数码管位。由P0、P2口共同组成LED数码管显示电路。由于P0口不带有上拉电阻,所以在设计中需另外外接上拉电阻,以提供一定的拉电流。P2口本身自带电阻,所以无需外接。因为AT89C51单片机P0、P2口都自带锁存器,所以无需另外外接锁存器。其与单片机一起来显示所抢答的代表队的编号和倒计时时间或限时时间。其接口电路如图2-5所示:

图2-5 显示电路

2.6 控制电路设计

抢答器控制电路主要控制抢答开始、停止以及抢答时间调节。它是供主持人操作的实现调节抢答时间、开始抢答等控制的控制功能电路。控制电路的设计跟报警电路的设计都需要通过语言来实现,单纯的硬件电路并不能实现任何东西。在控制电路的设计中,我接的是P3口,是因为P3口的每一个口线都有第二功能,在这里要用到的也就是它的第二功能,在前面的介绍中我们已经知道,P3口有两个中断,两个定时,一个读一个写口线,还有串行输入输出口线。16路智力抢答器硬件电路设计图如图2-6:

图2-6 控制电路

三、程序流程图 开始 初始化 N N 开始键按调时键按下? 下? Y Y 抢答键是否加1S或减1S 按下 N Y 判断哪位选手抢答,并 在数码管上显示 倒计时 Y 选手是否作 N 时间到 答 Y 按下复位键 进入下一题,并重新开始计时

参考文献

[1]周润景,袁伟亭,景晓松. Proteus在MCS-51&ARM7系统中的应用百例[M].北京:电子工业出版社,2006.5-7

[2]余发山,王福忠等.单片机原理及应用技术[M].徐州:中国矿业大学出版社,2003 [3]张凯,马忠梅编著,MCS-51单片机综合系统及其设计开发[M].北京:科学出版社,1996

[4]欧阳文.ATMEL89 系列单片机的原理及开发实践[M].北京:中国电力出版社,2007

[5]靳栀,潘育山,邬芝权.单片机原理及应用 C51编程技术[M].成都:西南交通大学出版社,2004

[6]黄继昌,乔苏文,张海贵.实用报警电路[M].北京:人民邮电出版社,2005.2 [7]求是科技.单片机典型模块设计实例导航[M].北京:人民邮电出版社,2008 [8]龚云新,胡长盛.单片机实用技术教程[M].北京:北京师大出版社,2007.6 [9]徐爱钧.8051单片机实践教程—asm51汇编语言与C51高级语言应用[M].北京:电子工业出版社,2005.3

[10]王凌霄.微型计算机原理及应用[M].徐州:中国矿业大学出版社,2004 [11]康华光.电子技术基础(模拟部分)[M].高等教育出版社.1999 [12]康华光.电子技术基础(数字部分)[M].高等教育出版社.1999 [13]何希才.常用电子电路应用365例[M].北京:电子工业出版社,2006 [14]张肃文.高频电子线路[M].高等教育出版社.2007 [15]徐曼.电子基础与技能[M].北京:电子工业出版社,2006.6

附录A 总电路图

附录B 程序清单

#include #define uint unsigned int #define

#define KEYIO P1

uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,

sbit led1 = P2^0; sbit led2 = P2^1; sbit led3 = P2^2; sbit led4 = P2^3;

sbit key1 = P3^0; sbit key2 = P3^1; sbit key3 = P3^2; sbit key4 = P3^3;

sbit bur = P3^7;

uchar keydata; uchar reset_flag; uchar time_count; uchar stop_flag;

0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};

uchar unsigned char

void display(uchar disdata); void display_time(uchar disdata); uchar keyscan();

void delayms(uint xms) //延时函数 {

uint i,j; }

void init_timer0() {

TMOD=0x01;

TH0=(65536-50000)/256; TL0=(65536-50000)%6; EA=1; ET0=1; TR0=1; }

void main() {

uchar time_max=30; led1 = 1; led2 = 1; init_timer0();

time_count = time_max;

for(i=xms;i>0;i--) for(j=110;j>0;j--);

stop_flag =1; while(1) {

display(keydata); { }

if(key2==0) {

delayms(10); if(key2==0) { }

while(!key2); stop_flag =1; reset_flag = 0; delayms(10); if(key1==0) { }

while(!key1); reset_flag = 1;

time_count = time_max; stop_flag = 0; bur = 1; if(key1==0)

display_time(time_count);

}

if(key3==0) { }

if(key4==0) { }

if(reset_flag==1) {

keydata = keyscan(); if(keydata!=0) {

display(keydata); stop_flag = 1; delayms(10); if(key4==0) { }

while(!key4); time_max--;

time_count = time_max; delayms(10); if(key3==0) { }

while(!key3); time_max++;

time_count = time_max;

} }

}

reset_flag = 0;

bur = 0; }

void display(uchar disdata) {

P0=table[shi];

P0=table[ge]; }

void display_time(uchar disdata) {

P0=table[shi];

uchar ge,shi; shi = disdata/10; ge = disdata; led2 = 0; delayms(4); led2 = 1;

led1 = 0; delayms(4); led1 = 1; uchar ge,shi; shi = disdata/10; ge = disdata;

P0=table[ge]; }

led3 = 0; delayms(4); led3 = 1;

led4 = 0; delayms(4); led4 = 1;

void T0_time() interrupt 1 {

//中断程序

static uchar count; TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

}

uchar keyscan()

count++; if(count==20) { count = 0; if(time_count!=0) { } }

if(stop_flag==0) { }

time_count--;

{

uchar temp,key=0; KEYIO=0xfe; temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0) {

delayms(10); temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0) {

temp=KEYIO; switch(temp) {

case 0x7e: key=1;

break;

case 0xbe: key=2;

break;

case 0xde: key=3;

break;

case 0xee:

key=4;

break;

}

while(temp!=0xf0) {

temp=KEYIO;

temp=temp&0xf0; } } }

KEYIO=0xfd; temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0) {

delayms(10); temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0) {

temp=KEYIO; switch(temp) {

case 0x7d: key=5;

break;

case 0xbd: key=6;

break;

KEYIO=0xfb; temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0) {

delayms(10); temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0) {

temp=KEYIO; switch(temp) } }

case 0xed: }

while(temp!=0xf0) { }

temp=KEYIO; temp=temp&0xf0; key=8;

break;

case 0xdd: key=7;

break;

{

case 0x7b: key=9;

break;

case 0xbb: key=10;

break;

case 0xdb: key=11;

break;

} }

case 0xeb: }

while(temp!=0xf0) { }

temp=KEYIO; temp=temp&0xf0; key=12;

break;

KEYIO=0xf7; temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0)

{

delayms(10); temp=KEYIO; temp=temp&0xf0; if(temp!=0xf0) {

temp=KEYIO; switch(temp) {

case 0x77: key=13;

break;

case 0xb7: key=14;

break;

case 0xd7: key=15;

break;

case 0xe7: }

while(temp!=0xf0) {

temp=KEYIO; temp=temp&0xf0; key=16;

break;

}

} }

}

return key;

本文来源:https://www.bwwdw.com/article/uwl6.html

Top