设计目的:设计一个八路抢答器,抢答时间为30S倒计时,抢到后,有10S的回答问题时间
#include <reg52.h>
#include <absacc.h>
unsigned char code SEG[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的断码表,共阴级
unsigned char dispbuf[2]={0,0}; //显示缓冲区百十个位
unsigned char flag=0; //1s到标志位
sbit setting=P3^0;
sbit opening=P3^1;
sbit beep=P3^7;
unsigned char number;//存放按键抢答号
unsigned char m;
unsigned char mm=30;//存放答题30秒
/*
定时器初始化函数
@ 彭王冲
*/
void delay();
void display(unsigned char m);
unsigned char anjian();//函数声明
void Timer0_Init()
{ TMOD=0x01; //定时器0方式1
TH0=(65536-5000)/256; //定时5ms
TL0=(65536-5000)%256;
ET0=1; //开中断
EA=1;
TR0=1; //开定时器0
}
void Timer0_ISR() interrupt 1 using 0
{
static unsigned char i=0,k=0;//其中m和mm分别为5秒倒数计时和30秒倒数计时
TH0=(65536-5000)/256; //重赋初值
TL0=(65536-5000)%256;
k++;
if(k==200)
{
k=0;
if(mm==0)
mm=0;
else
mm--;
}
if(mm==3)
{for(m=3;m--;m>0)
{beep=!beep;
delay();}
}
P1=0xff;//关闭数码管
if(i==2)
P1=SEG[number];
else
P1=SEG[dispbuf[i]];
P3 = ~(0x08<<i);
i++;
if(i==3)
i=0;
display(mm);
}
void display(unsigned char m)
{
dispbuf[1]= m/10 ; //获取十位
dispbuf[0]= m%10 ; //获取个位
}
//盐水
void delay()
{ unsigned char i;
for(i=0;i<120;i++); //延时1ms
}
void main()
{
Timer0_Init();
while(1)
{ if(opening==0)
mm=30;
if(P2!=0xff)//如果有按键按下,则返回按键值
{
number=anjian();
mm=10;
while(1)
{
if(opening==0)
{mm=30;number=0;break;}
}
}
}
}
//案件处理函数
unsigned char anjian()
{
switch(P2)
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
default:return 0;
}
}