1、完美抢答器仿真图及程序课程设计题目:基于单片机的智能八路抢答器设计一、设计项目简介1、 设计意义及目的抢答器在现实生活中应用广泛,比如在各类娱乐节目中,像中央电视台的幸运52,开心辞典,因此做一个抢答器就是具有现实意义的。抢答器具有人数限制,我们选择做八路抢答器。当某人抢答时,能够显示她的号码,限定她的答题时间,别人不能抢答,主持人要有启动与清空的权利。八路抢答器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视觉就是很难判断出哪组先答题。利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。抢答
2、组数可以在八组以内任意使用,本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:单片机最小系统、显示模块、显示驱动模块、抢答开关模块。2、 系统功能描述设计一个具有特定功能的抢答器。该抢答器上电或按键复位后能自动显示系统提示符“P、”, 进入准备工作状态。主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指
3、示灯亮,数码管显示违规台号。蜂鸣器发出音响;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。3、 设计达到目标我们在要求的基础上拓展了一些功能,比如增加倒数剩下5S的时候每秒响一声,最后一声比较悠长,以提示选手抢答或者回答时间将尽,还将抢答按键与答完按键做在了同一个按键上,抢答之后选手答完题目再次按下该抢答按键即就是答完,使剩余时间与台号定格。总体上我们达到了:按该抢答器上电或按键复位后能自动显示系统提示符“P、”, 进入准备工作状态。主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠
4、长,提示抢答时间到;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号,与抢答期间一样,回答期间最后5S倒计时蜂鸣器每秒响一声提示,最后一声比较悠长,提示回答时间到;答完按钮设置在抢答按键上,再次按下抢答按键即就是答完,此时蜂鸣器响一声,时间定格在答完题目之后剩下的时间;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。二、系统硬件设计1、 系统设
5、计方案(1) 利用译码芯片先根据74LS148的优先功能,确定了先抢答到的选手的编码号,再根据74LS279的锁存功能,将其信号保持下来,并实现了锁定功能,将选手的编码锁定。再者,根据74LS48的译码功能,将74LS279锁定的数字编译成二进制,将信号送到显示器中。这样就实现了抢答功能。原理框图如图1所示。 (2)利用单片机可以利用单片机的定时/计数器进行计时,设定抢答时间与答题时间;可以利用单片机的I/O口线接按键,通过按键按下后,所接口线电平的变化来判断那位选手按下键。我选择利用单片机做抢答器。1、仿真图2、程序/* 操作非常简单* 主持人先按键,然后有30s的时间,等待选手按键* 选手
6、在30s内按键,就显示选手的号数,及30s的回答倒计时* 此时,其她选手按键无效,* 只有抢答选手按键,才停止,并显示锁定* 最后,按复位,进行新一轮抢答*/#includereg52、h#includeintrins、h#includeabsacc、h#define uchar unsigned char#define uint unsigned int #define ulong unsigned long/* 定义定时器T0与T1时间常数与方式控制字 */#define v_th0 0x3c#define v_tl0 0xb0#define v_tmod 0x11sbit P30=P30
7、;sbit P36=P36;sbit P32=P32;sbit P31=P31;uchar led_buf8;/显示缓冲数组uchar code dispcode11=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c;/段码数组uchar keyzhi; uint m,time,time2; void delay(uint a) /延时程序 while(a-); void led() /违规指示灯亮程序 P32=0; delay(2000); delay(2000); void ring() /蜂鸣器程序 P36=0; delay(1
8、0000); P36=1; void ledk() /P、显示程序 uchar dmask=0x01; /位控码初始化 uchar pos; for(pos=0;pos3;pos+) P2=dmask; /位控码输出到位控口 P0=dispcode10; /取显示段码并输出到段控口 delay(200); dmask=_crol_(dmask,1); /位控码左移一位 void led_buf_auto_flush(void) reentrant /显示缓冲区更新函数 led_buf0=m; /获得选手的号码 led_buf1=time/10; /获得秒十位 led_buf2=time%10;
9、 /获得秒的个位 void timer0(void) interrupt 1 /定时器t0中断服务函数,选用定时器0工作方式为1 uchar j; static uchar click=0; TH0=v_th0; TL1=v_tl0; /设置初始值50ms为循环20次为1ms,12MHz +click; if(click=20) /定时器0定时中断次数 -time; click=0; if(time=20)&(j=0xff) ring(); if(time=5)&(time!=0)&(j=0xff) ring(); if(time=0)&(j=0xff) ring(); delay(1000)
10、; ring(); led_buf_auto_flush(); /LED显示缓冲区时间值更新 void timer1(void) interrupt 3 /选用定时器1工作方式为1 uchar j; static uchar click=0; /定时器0定时中断次数 TH1=v_th0;TL1=v_tl0; /设置初始值50ms为循环20次为1ms,12MHz +click; if(click=20) -time2; click=0; if(time2=5)&(time2!=0)&(j!=0xff) ring(); if(time2=0)&(j!=0xff) ring(); delay(100
11、0); ring(); TR1=0; P32=0; time=time2; led_buf_auto_flush(); /LED显示缓冲区时间值更新 void put_on_leds(void) /显示输出函数 uchar dmask=0x01; /位控码初始化 uchar pos; for(pos=0;pos4;pos+) P2=dmask; /位控码输出到位控口 P0=dispcodeled_bufpos; /取显示段码并输出到段控口 delay(100); /延时 delay(100); dmask=_crol_(dmask,1); /修改未控码 void init_sys(void)
12、/进行初始化并接受用户的初始化时间设置 TMOD=v_tmod; TH0=v_th0; TL0=v_tl0; TH1=v_th0; TL1=v_tl0; /设置时间初值 TR0=0; EA=1; ET0=1; TR1=0; ET1=1; /开启中断,关闭定时器 uchar keychuli() /处理与键盘相连的P1口的内容,作为键值 uchar k; k=P1; /P1口内容送K return(k); /返回键值uchar key()/键盘扫描函数,函数返回值即键值 uchar keyzhi,keyzhii; /电子钟键盘按键键值临时存放 keyzhi=keychuli(); /调P1口处理
13、函数 if(keyzhi!=0xff) /有键动作延时去抖动,否则函数返回 delay(100); /再次调P1口处理函数 if(keyzhi!=0xff) /真正有键按下,取键值并暂存 keyzhii=keyzhi; while(keyzhi!=0xff) /判按键就是否释放,没有释放延时去抖动等待释放 put_on_leds(); put_on_leds(); keyzhi=keychuli(); keyzhi=keyzhii; /按键释放后恢复按键键值 return(keyzhi); /返回按键键值void main() /主函数调用init_sys()函数对系统初始化,调用put_on
14、_leds()函数 uchar j; uchar c=1; /C 1,2,3 1:无人违规合法抢答,2:有人违规,3: 允许答完 uchar keyzhiii; while(1) keyzhiii=key(); /调键盘扫描函数得到按键键码 ledk(); /调P、程序 if(P30=0) /主持人就是否按下启动键 delay(100); if(P30=0) c=1; break; if(keyzhiii!=0xff) c=2; led(); break; init_sys(); /调用init_sys()函数对系统初始化 time=30; time2=30; TR0=1; /开定时器0 wh
15、ile(1) put_on_leds(); /调显示函数 delay(100); /调延时函数 if(c=1) /判断有没有违规 keyzhiii=key(); /调键盘扫描函数得到按键键码 j=keyzhiii; if(c=3) keyzhiii=key(); /调键盘扫描函数得到按键键码 if(time=0) while(1) TR0=0; put_on_leds(); delay(100); if(c=1|c=2) switch(keyzhiii) /按键功能控制 case 0xfe: /1号选手抢答,抢答时间设定为三十秒 m=1; if(c=1) ring(); /有人正常按下,蜂鸣器
16、发出声音 TR1=1; /开定时器1,关定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0; time=0; led_buf_auto_flush(); put_on_leds(); break; case 0xfd: /2号选手抢答 m=2; if(c=1) ring(); /有人正常按下,蜂鸣器发出声音 TR1=1; /开定时器1,关定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0; time=0; led_buf_auto_flush(); put_on_leds(); break;
17、 case 0xfb: /3号选手抢答 m=3; if(c=1) ring(); /有人正常按下,蜂鸣器发出声音 TR1=1; /开定时器1,关定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0; time=0; led_buf_auto_flush(); put_on_leds(); break; case 0xf7: /4号选手抢答 m=4; if(c=1) ring(); /有人正常按下,蜂鸣器发出声音 TR1=1; /开定时器1,关定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0;
18、 time=0; led_buf_auto_flush(); put_on_leds(); break; case 0xef: /5号选手抢答 m=5; if(c=1) ring(); /有人正常按下,蜂鸣器发出声音 TR1=1; /开定时器1,关定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0; time=0; led_buf_auto_flush(); put_on_leds(); break; case 0xdf: /6号选手抢答 m=6; if(c=1) ring(); /有人正常按下,蜂鸣器发出声音 TR1=1; /开定时器1,关
19、定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0; time=0; led_buf_auto_flush(); put_on_leds(); break; case 0xbf: /7号选手抢答 m=7; if(c=1) ring(); /有人正常按下,蜂鸣器发出声音 TR1=1; /开定时器1,关定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0; time=0; led_buf_auto_flush(); put_on_leds(); break; case 0x7f: /8号选手抢答
20、m=8; if(c=1) ring(); /有人正常按下,蜂鸣器发出声音 TR1=1; /开定时器1,关定时器0 TR0=0; c=3; keyzhiii=0xff; if(c=2) /有人违规 TR1=0; time=0; led_buf_auto_flush(); put_on_leds(); break; if(c=3) /无人违规,等待答完 TR1=1; TR0=0; if(j=keyzhiii) ring(); /有人答完,蜂鸣器发出声音 TR1=0; TR0=0; while(1) led_buf_auto_flush(); put_on_leds(); led_buf_auto_flush(); put_on_leds();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1