单片机实验8路抢答器C语言版.docx
- 文档编号:2285486
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:13
- 大小:80.75KB
单片机实验8路抢答器C语言版.docx
《单片机实验8路抢答器C语言版.docx》由会员分享,可在线阅读,更多相关《单片机实验8路抢答器C语言版.docx(13页珍藏版)》请在冰豆网上搜索。
单片机实验8路抢答器C语言版
单片机综合实验报告
题目:
8路抢答器实验
班级:
姓名:
学号:
指导老师:
时间:
一、实验内容:
以单片机为核心,设计一个8位竞赛抢答器:
同时供8名选手或8个代表队比赛,
分别用8个按钮SO〜S7表示。
本实验有Protues软件仿真。
分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。
抢答器具有锁存与显示功能。
即选手按按钮抢答时,锁存相应的编号,并且优先抢
答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。
抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。
当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。
二、实验电路及功能说明
分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。
抢答器具有锁存与显示功能。
即选手按按钮抢答时,锁存相应的编号,并且优先抢
答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。
复位后参赛队员可继续抢答。
如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢
答,定时显示器上显示00。
三、实验程序流程图:
主程序;
非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯
规处理程序;显示及发声程序。
主流程图如下图所示
子程序
芥法抢4答处理
回答4
时间
四、实验结果分析
五、心得体会
六、程序清单
#inelude
#defineucharunsignedchar
#defineuintunsignedint
sbitwela_a=P3A0;
sbitwela1=卩3人1;
sbitwela2=P3A7;
sbitrest=P3A5;
sbithost=P3A6;
sbitled仁P3A4;〃绿灯
sbitled2=P3A3;〃红灯
sbitled3=P3A2;〃黄灯
sbitkey1=P1A0;
sbitkey2=P1Al;
sbitkey3=P1A2;
sbitkey4=P1A3;
sbitkey5=P1A4;
sbitkey6=P1A5;
sbitkey7=P1A6;
sbitkey8=P1A7;
ucharx,q,d,s,ge,tO,t1,start,flag;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voidinit();/*初始函数申明*/
voiddisplay(uchars,ucharge,uchara);
voiddelay(uintz);
voidkeyscan();
voidmain()
{
init();
display(s,ge,a);
while
(1)
{
if(host==0)//主持人控制开关
{
delay(5);
if(host==0)
{
flag=1;
start=1;
delay(5);延时
while(!
host);检测开关
}
}
if(rest==0)//复位
{
delay(5);
if(rest==0)
{
q=30;
led2=1;
led3=1;
x=0;
delay(5);
start=1;
delay(5);
while(!
rest);
}
}
if(flag==1)
{
if(start==O)〃选手按下,倒计10秒开始
{
led3=0;
wela1=0;
wela2=0;
delay
(1);
TRO=O;
TR1=1;
display(s,ge,a);
delay
(1);
}
if(start==1)//主持人按下,倒计时30秒
{
led仁0;
wela1=0;
wela2=0;
delay
(1);
TR0=1;
TR1=0;
display(s,ge,a);
delay
(1);
keyscan();
}
}
}
}
voidinit()/*初始化*/
{
t0=0;
t1=0;
flag=0;
q=30;
d=10;
wela_a=0;
a=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
}
voiddisplay(uchars,ucharge,uchar
a)/*数码管动态扫描*/
{
wela1=1;
P0=table[ge];
delay(5);
wela2=1;
PO=table[s];
delay(5);
wela_a=O;
P2=table[a];
delay(5);
}
voidkeyscan()/*按键扫描函数*/
{
if(key1==O)
{
delay(5);
if(key1==0)
{
a=1;
P2=table[a];
start=0;
TR1=1;
TR0=0;
delay(5);
while(!
key1);
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
a=2;
P2=table[a];
delay(5);while(!
key2);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
a=3;
P2=table[a];start=0;
delay(5);while(!
key3);
}
}
if(key4==0)
{
delay(5);
if(key4==0)
{
a=4;
P2=table[a];start=0;
delay(5);while(!
key4);
}
}
start=0;
if(key5==0)
delay(5);
if(key5==0)
{
a=5;
P2=table[a];start=0;
delay(5);while(!
key5);}
}
if(key6==0)
{
delay(5);
if(key6==0)
{
a=6;
P2=table[a];start=0;
delay(5);while(!
key6);}
}
if(key7==0)
{
delay(5);
if(key7==0)
{
a=7;
P2=table[a];
start=0;
delay(5);
while(!
key7);
}
}
if(key8==0)
{
delay(5);
if(key8==0)
{
a=8;
P2=table[a];
start=0;
delay(5);
while(!
key8);
}
}
}
voiddelay(uintz)/*延时函数*/
{
uinti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voidtime0()interrupt1/*定时器0*/
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
s=q/10;
ge=q%10;
t0++;
定时器1*/
//最后,给朋友们一点点提示,本程序有一点点小问题,有个中断没关,当主持人复位之后,后面的选手回答问题的时间就没有10
秒了(可怜啊)。
但还是可以运行的,要求不高的朋友可借鉴一哈。
if(t0==20)
{
to=o;
q--;
s=q/10;
ge=q%10;
if(q==0)
{
while
(1)
{
q=0;
a=0;
led1=1;
led2=0;
wela1=0;
wela2=0;
delay
(1);display(s,ge,a);
}
}
}
}
voidtime1()interrupt3/*
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
s=d/10;
ge=d%10;
t1++;
{
t仁0;
d--;
s=d/10;
ge=d%10;
if(d==0)
{
while
(1)
{
d=0;
a=0;
led1=1;
led3=1;
led2=0;
wela1=0;
wela2=0;
delay
(1);display(s,ge,a);
}
}
}
}
if(t仁=20)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 抢答 语言版