单片机抢答器.docx
- 文档编号:23794858
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:17
- 大小:86.78KB
单片机抢答器.docx
《单片机抢答器.docx》由会员分享,可在线阅读,更多相关《单片机抢答器.docx(17页珍藏版)》请在冰豆网上搜索。
单片机抢答器
单片机综合实验报告
题目:
8位竞赛抢答器的设计
班级:
0309410
姓名:
许高杨
学号:
030941020
指导老师:
高林
时间:
2011.12.28
实验内容:
以单片机为核心,设计一个8位竞赛抢答器:
同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。
设置一个系统清除和抢答控制开关S,开关由主持人控制。
抢答器具有锁存与显示功能。
即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。
抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。
当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
通过键盘改变抢答的时间,原理与闹钟时间的设定相同,将定时时间的变量置为全局变量后,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。
同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在LED上。
2、实验电路及功能说明
主持人按“抢答开始”键,立刻进入抢答倒计时(预设20S抢答时间),如有选手抢答,会有提示,并会显示其号数,不进行抢答查询,所以第一个按抢答的选手有效。
倒数时间到小于5S会每秒响一下提示音。
如倒计时期间,主持人想停止倒计时可以随时按“停止”按键,系统会自动进入准备状态,等待主持人按“抢答开始”进入下次抢答计时。
如果主持人未按“抢答开始”键,则无法按抢答按键。
三、实验程序流程图:
3、实验结果分析
如图表示5号选手获得抢答机会,剩余18秒抢答时间。
4、心得体会
我觉得通过这次的设计,不仅学会了很多原来没有掌握的理论教科书上的知识,更多是学到了一些理论书上没有的,如设计各种功能电路的方法、修改电路等。
在平时的学习中基本不会遇到错误的电路,但现在是自己设计,还要自己发现错误,再自己修改,所以这需要很好的知识基础。
很高兴有这样一个锻炼、提高自己的机会。
六、程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
/*-----------------------------------------------------------
共阴极数码管编码表0-f显示
------------------------------------------------------------*/
unsignedcharcodetable[]={0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10,0x08,0x03,
0x46,0x21,0x06,0x0e};
/*-----------------------------------------------------------
变量定义
------------------------------------------------------------*/
sbitstart=P3^6;
sbitstop=P3^5;
sbitreset=P3^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
sbitbuzzer=P3^4;
bitstart_flag=0;
bitstop_flag=0;
bitkey1_flag=0;
bitkey2_flag=0;
bitkey3_flag=0;
bitkey4_flag=0;
bitkey5_flag=0;
bitkey6_flag=0;
bitkey7_flag=0;
bitkey8_flag=0;
bitreset_flag=0;
bitaction=0;
ucharsecond=20;
uchartimer0_count=0;
ucharnumber=0;
ucharnumber_display=0;
/*-----------------------------------------------------------
延时函数
------------------------------------------------------------*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*-----------------------------------------------------------
数码管显示驱动函数
------------------------------------------------------------*/
voiddisplay(ucharnumber,ucharsecond)
{
ucharsecond_first,second_second;
second_first=second/10;
second_second=second%10;
P2=0xfd;
P0=table[number];
delay
(2);
P2=0xf7;
P0=0x3f;
delay
(2);
P2=0xfb;
P0=table[second_first];
delay
(2);
P2=0xfe;
P0=table[second_second];
delay
(2);
}
/*-----------------------------------------------------------
开始键扫描函数
------------------------------------------------------------*/
voidstart_keyscan()
{
if(start==0)
{
delay(8);
if((start==0)&&(!
start_flag))
{
start_flag=1;
action=1;
TR0=1;
}
}
else
{
start_flag=0;
}
}
/*-----------------------------------------------------------
八位抢答键扫描函数
------------------------------------------------------------*/
ucharkey_scan8()
{
if(key1==0)
{
delay(8);
if((key1==0)&&(!
key1_flag))
{
key1_flag=1;
number=1;
number_display=number;
}
}
else
{
key1_flag=0;
number=0;
}
if(key2==0)
{
delay(8);
if((key2==0)&&(!
key2_flag))
{
key2_flag=1;
number=2;
number_display=number;
}
}
else
{
key2_flag=0;
number=0;
}
if(key3==0)
{
delay(8);
if((key3==0)&&(!
key3_flag))
{
key3_flag=1;
number=3;
number_display=number;
}
}
else
{
key3_flag=0;
number=0;
}
if(key4==0)
{
delay(8);
if((key4==0)&&(!
key4_flag))
{
key4_flag=1;
number=4;
number_display=number;
}
}
else
{
key4_flag=0;
number=0;
}
if(key5==0)
{
delay(8);
if((key5==0)&&(!
key5_flag))
{
key5_flag=1;
number=5;
number_display=number;
}
}
else
{
key5_flag=0;
number=0;
}
if(key6==0)
{
delay(8);
if((key6==0)&&(!
key6_flag))
{
key6_flag=1;
number=6;
number_display=number;
}
}
else
{
key6_flag=0;
number=0;
}
if(key7==0)
{
delay(8);
if((key7==0)&&(!
key7_flag))
{
key7_flag=1;
number=7;
number_display=number;
}
}
else
{
key7_flag=0;
number=0;
}
if(key8==0)
{
delay(8);
if((key8==0)&&(!
key8_flag))
{
key8_flag=1;
number=8;
number_display=number;
}
}
else
{
key8_flag=0;
number=0;
}
if(number_display!
=0)
{
return1;
}
else
{
return0;
}
}
/*-----------------------------------------------------------
复位键扫描函数
------------------------------------------------------------*/
voidreset_keyscan()
{
if(reset==0)
{
delay(8);
if((reset==0)&&(!
reset_flag))
{
reset_flag=1;
number_display=0;
second=20;
}
}
else
{
reset_flag=0;
}
}
voidfengming()//蜂鸣函数,脉宽t=1ms周期T=2ms频率f=0.5khz实际发现延时1ms的时候效果最好
{
//延时1ms
buzzer=0;//给P3.7口送高电平
delay(100);//延时1ms
buzzer=1;
delay(100);
}
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
voidmain()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
while
(1)
{
start_keyscan();
reset_keyscan();
while(action==1)
{if(second<=5&&second>0)
fengming();
while(!
key_scan8()&&!
stop==0)
{
display(number_display,second);
if(second==0)
{
second=20;
break;
}
}
TR0=0;
display(number_display,second);
action=0;
break;
}
display(number_display,second);
}
}
/*-----------------------------------------------------------
中断服务函数
------------------------------------------------------------*/
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timer0_count++;
if(timer0_count==20)
{
timer0_count=0;
second--;
if(second<=5&&second>0)
fengming();
if(second==0)
{
TR0=0;
number_display=0;
action=0;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 抢答
![提示](https://static.bdocx.com/images/bang_tan.gif)