八路抢答器-基于单片机C语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7; //选手按键
sbit beep=P3^6; //蜂鸣器
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //0-9代码(共阴极)
uchar shiwei,gewei,xuanshou,count,i,second;
uchar score1,score2,score3,score4,score5,score6,score7,score8;//选手1~8的分数
uint t,m,n,a,a1,a2,a3,a4,a5,a6,a7,a8;
void Timer()
{
TMOD|=0x01;
TH0=0xd8; //初值55536,计数10000次,每次1US,总计10ms
TL0=0xf0;
IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1;
}
void tim(void) interrupt 1 using 1 //为定时中断TR0
{
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
if(count==100) //100*10ms=1秒
{
count=0;
second--; //秒减1
}
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);//延时1ms
}
void display (uchar shiwei,gewei,xuanshou) //显示函数
{
P2=0xfe; //打开显示时间十位的位选低电平有效1111 1110 P0=shiwei;//显示十位
delay(5);
P2=0xfd; //个位位选1111 1101
P0=gewei;
delay(5);
P2=0xf7; //选手位选1111 0111
P0=xuanshou;
delay(5);
}
void dis(void)//调用显示函数
{
shiwei=tab[second/10];
gewei=tab[second%10];
xuanshou=tab[i];
display (shiwei,gewei,xuanshou);
}
void init() //初始化函数
{
P2=0x04;//0000 0100
P0=0x3f;//数码管共阴0011 1111显示0
t=0;
beep=0;//蜂鸣器
i=0;
second=29;
score1=60;
score2=60;
score3=60;
score4=60;
score5=60;
score6=60;
score7=60;
score8=60;
a1=1;
a2=1;
a3=1;
a4=1;
a5=1;
a6=1;
a7=1;
a8=1;
}
void main()//主函数
{
init();//调用初始化函数
if(k==1){ m=0; if(k1==0) {delay(5);if(k1==0);while(!k1);beep=1;delay(500);beep=0;} // 违规抢答显示号码报警
while(t)
{
if(m==0) //开关,保证程序只执行一次
{
switch(t)
{
case 1:
{
TR0=0;i=1;second=score1;beep=1;delay(500);beep=0;
a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; //有选手抢答时显示选手号码蜂鸣器响,时间为0,t和i对应
}}} }
if(k2==0) {delay(5);if(k1==0);while(!k1);t=2;beep=1;delay(500);beep=0;}
if(k3==0) {delay(5);if(k1==0);while(!k1);t=3;beep=1;delay(500);beep=0;}
if(k4==0) {delay(5);if(k1==0);while(!k1);t=4;beep=1;delay(500);beep=0;}
if(k5==0) {delay(5);if(k1==0);while(!k1);t=5;beep=1;delay(500);beep=0;}
if(k6==0) {delay(5);if(k1==0);while(!k1);t=6;beep=1;delay(500);beep=0;}
if(k7==0) {delay(5);if(k1==0);while(!k1);t=7;beep=1;delay(500);beep=0;}
if(k8==0) {delay(5);if(k1==0);while(!k1);t=8;beep=1;delay(500);beep=0;}
}
if(k==0)
{
Timer();//中断定时器打开
delay(10);
while(!k);
while(1)
{