|
本帖最后由 小米熊724 于 2019-11-15 23:05 編輯
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;//選手1--4
sbit key5=P1^4;sbit key6=P1^5;sbit key7=P1^6;sbit key8=P1^7;//選手5--8
sbit d1=P0^0;sbit d2=P0^1;sbit d3=P0^2;sbit d4=P0^3;//選手指示燈1--4
sbit d5=P0^4;sbit d6=P0^5;sbit d7=P0^6;sbit d8=P0^7; // 5--8
sbit alarm=P3^1;//蜂鳴器控制端
uchar code display[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//共陽 0---9
bit flag=0;//是否允許搶答標志,初始 【不允許】
bit flag1=1;//是否允許掃描按鍵標記,初始【允許】
uchar counter,time=10;//計數(shù)器,10s搶答倒計時
//==========================================================延時函數(shù)=================================================
void delay1m(uint k)
{
uint j;
while(k--)
for(j=0;j<121;j++);
}
//===========================================================定時器,外中斷初始化函數(shù)================================
void init_function()
{
TMOD=0x01; //定時器T0,工作于方式1
TH0=(65535-50000)/256; //定時50ms
TL0=(65535-50000)%256;
TR0=0; //啟動T0
IT0=IT1=1;//外部中斷負跳變觸發(fā)
ET0=EX0=EX1=EA=1;//允許T0,外部中斷0,1中斷,開總中斷
}
//================================================T0中斷服務(wù)函數(shù) ====================================================
void time0() interrupt 1
{
TH0=(65535-50000)/256; //定時50ms
TL0=(65535-50000)%256 ;
counter++;
}
//===================================================響一聲=========================================================
void speak1()
{
alarm=1;
delay1m(300);
alarm=0;
}
//===================================================響兩聲=========================================================
void speak2()
{
alarm=1;
delay1m(200);
alarm=0;
delay1m(200);
alarm=1;
delay1m(200);
alarm=0;
}
void main()
{
delay1m(500);//延時檢測led,蜂鳴器
P0=0x00;alarm=0;//關(guān)led,蜂鳴器
init_function();//初始化函數(shù)
P2=display[0];//初始顯示 0
while(1)
{
while(flag1)
{
if(flag)//正常搶答
{
if (!key1){flag1=0;TR0=0;speak1();P2=display[1];while(flag1==0){d1=1;delay1m(300);d1=0;delay1m(300);}}//顯示1,蜂鳴器叫,對應(yīng)的led亮
else if(!key2){flag1=0;TR0=0;speak1();P2=display[2];while(flag1==0){d2=1;delay1m(300);d2=0;delay1m(300);}}//顯示2,蜂鳴器叫
else if(!key3){flag1=0;TR0=0;speak1();P2=display[3];while(flag1==0){d3=1;delay1m(300);d3=0;delay1m(300);}}//顯示3,蜂鳴器叫
else if(!key4){flag1=0;TR0=0;speak1();P2=display[4];while(flag1==0){d4=1;delay1m(300);d4=0;delay1m(300);}}//顯示4,蜂鳴器叫
else if(!key5){flag1=0;TR0=0;speak1();P2=display[5];while(flag1==0){d5=1;delay1m(300);d5=0;delay1m(300);}}//顯示5,蜂鳴器叫
else if(!key6){flag1=0;TR0=0;speak1();P2=display[6];while(flag1==0){d6=1;delay1m(300);d6=0;delay1m(300);}}//顯示6,蜂鳴器叫
else if(!key7){flag1=0;TR0=0;speak1();P2=display[7];while(flag1==0){d7=1;delay1m(300);d7=0;delay1m(300);}}//顯示7,蜂鳴器叫
else if(!key8){flag1=0;TR0=0;speak1();P2=display[8];while(flag1==0){d8=1;delay1m(300);d8=0;delay1m(300);}}//顯示8,蜂鳴器叫
else
{
if(counter>=20)//1S時間到
{
counter=0;time--;
if(time==0)//10S到
{
TR0=0;P2=display[time];speak1();//顯示0
flag=0;//搶答的時間內(nèi)沒人搶答,必須等待重新開始
}
P2=display[time];
}
}
}
else//犯規(guī)搶答
{
if (!key1){flag1=0;TR0=0;speak2();P2=display[1];while(flag1==0){d1=1;delay1m(100);d1=0;delay1m(100);}}//數(shù)碼管顯示1,蜂鳴器叫
else if(!key2){flag1=0;TR0=0;speak2();P2=display[2];while(flag1==0){d2=1;delay1m(100);d2=0;delay1m(100);}}//數(shù)碼管顯示2,蜂鳴器叫
else if(!key3){flag1=0;TR0=0;speak2();P2=display[3];while(flag1==0){d3=1;delay1m(100);d3=0;delay1m(100);}}//數(shù)碼管顯示3,蜂鳴器叫
else if(!key4){flag1=0;TR0=0;speak2();P2=display[4];while(flag1==0){d4=1;delay1m(100);d4=0;delay1m(100);}}//數(shù)碼管顯示4,蜂鳴器叫
else if(!key5){flag1=0;TR0=0;speak2();P2=display[5];while(flag1==0){d5=1;delay1m(100);d5=0;delay1m(100);}}//數(shù)碼管顯示5,蜂鳴器叫
else if(!key6){flag1=0;TR0=0;speak2();P2=display[6];while(flag1==0){d6=1;delay1m(100);d6=0;delay1m(100);}}//數(shù)碼管顯示6,蜂鳴器叫
else if(!key7){flag1=0;TR0=0;speak2();P2=display[7];while(flag1==0){d7=1;delay1m(100);d7=0;delay1m(100);}}//數(shù)碼管顯示7,蜂鳴器叫
else if(!key8){flag1=0;TR0=0;speak2();P2=display[8];while(flag1==0){d8=1;delay1m(100);d8=0;delay1m(100);}}//數(shù)碼管顯示8,蜂鳴器叫
}
}
}
}
//==========================================================外部中斷0中斷函數(shù),開始===================================
void extern_int0() interrupt 0
{
if(P2==display[0])//數(shù)碼管顯示0時開始鍵才響應(yīng)
{
flag=flag1=1;//允許搶答,允許響應(yīng)按鍵
time=10;
P0=0x00;//燈都滅掉
alarm=0;//關(guān)蜂鳴器
TR0=1;//倒計時,開定時器
}
}
//==========================================================外部中斷1中斷函數(shù),停止===================================
void extern_int1() interrupt 2
{
flag1=1;//允許搶答,
flag=0;// 不允許響應(yīng)按鍵
TR0=0;//關(guān)定時器
P0=0x00;//燈都滅掉
alarm=0;//關(guān)蜂鳴器
P2=display[0];//顯示0
}
|
-
-
daima.rar
2019-11-15 23:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
27.9 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5
直接在Keil里面使用
|