|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (15.37 KB, 下載次數(shù): 62)
下載附件
2018-12-11 17:48 上傳
0.png (16.81 KB, 下載次數(shù): 57)
下載附件
2018-12-11 17:48 上傳
//總源程序
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K0=P3^0; //開(kāi)始搶答按鍵
sbit beep=P3^7; //蜂鳴器
sbit D0=P3^1; //指示燈
sbit K1=P1^0; //1號(hào)選手搶答按鍵
sbit K2=P1^1; //2號(hào)選手搶答按鍵
sbit K3=P1^2; //3號(hào)選手搶答按鍵
sbit K4=P1^3; //4號(hào)選手搶答按鍵
sbit K5=P1^4; //5號(hào)選手搶答按鍵
sbit K6=P1^5; //6號(hào)選手搶答按鍵
sbit K7=P1^6; //7號(hào)選手搶答按鍵
sbit K8=P1^7; //8號(hào)選手搶答按鍵
char s;
uchar num=0;
char time1; //搶答時(shí)間
char time2; //答題限時(shí)時(shí)間
uint m,n; //T0,T1定時(shí)器定一秒時(shí)
bit flag1,flag2,flag3,flag4; //標(biāo)志位
bit aa,bb; //時(shí)間調(diào)整標(biāo)志位
//延時(shí)子函數(shù)
void delay(uint z)
{uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--); }
uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,~0x40};
uchar code table2[]={
//共陽(yáng)數(shù)碼管位碼值
~0xfe,~0xfd,
~0xfb,~0xf7 };
//初始化子函數(shù)
void init()
{TMOD=0x11;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
ET0=1;
ET1=1;
EA=1;
P0=~0x00;
time1=10;
time2=10;
flag2=1; }
//開(kāi)始鍵掃描子函數(shù)
void key1()
{uchar i=100;
if(K0==0)
{delay(10);
if(K0==0)
{ while(K0==0&&i)
{i--;
delay(10);}
TR0=1;
s=time1;
m=0;
flag1=1;
flag2=1;
flag3=1;
num=0;
beep=1;
D0=1;
flag4=0; //清除違規(guī)標(biāo)志位
aa=0;
bb=0;
}
}
}
//選手搶答按鍵掃描子函數(shù)
void key()
{uchar i=100;
if(K1==0)
{delay(10);
if(K1==0)
{while(K1==0&&i)
{i--;
delay(10);}
num=1; //數(shù)碼管顯示1號(hào)"1"
TR0=0; //關(guān)閉定時(shí)器0,時(shí)間停止
TR1=1; //打開(kāi)定時(shí)器1,使揚(yáng)聲器響一聲
flag2=0; //關(guān)閉開(kāi)始鍵標(biāo)志位,使再按其他七個(gè)鍵不會(huì)響應(yīng)
}
}
if(K2==0) //下面七個(gè)鍵的處理同上
{
delay(10);
if(K2==0)
{while(K2==0&&i)
{i--;
delay(10);}
num=2;
TR0=0;
TR1=1;
flag2=0; //重要
}
}
if(K3==0)
{delay(10);
if(K3==0)
{while(K3==0&&i)
{i--;
delay(10);}
num=3;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K4==0)
{delay(10);
if(K4==0)
{while(K4==0&&i)
{i--;
delay(10);}
num=4;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K5==0)
{delay(10);
if(K5==0)
{while(K5==0&&i)
{i--;
delay(10);}
num=5;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K6==0)
{delay(10);
if(K6==0)
{while(K6==0&&i)
{i--;
delay(10);}
num=6;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K7==0)
{delay(10);
if(K7==0)
{while(K7==0&&i)
{i--;
delay(10);}
num=7;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K8==0)
{delay(10);
if(K8==0)
{while(K8==0&&i)
{i--;
delay(10);}
num=8;
TR0=0;
TR1=1;
flag2=0;
}
}
}
//數(shù)碼管顯示子函數(shù)
void display()
{if(flag1==1) //開(kāi)始鍵按下,開(kāi)始計(jì)時(shí)搶答
{if(num!=0) //如果有人搶答,則顯示相應(yīng)的幾號(hào)
{P0=table1[num]; //顯示幾號(hào)搶到了
P2=table2[0];
delay(2);
P0=~0;
P2=~0xff;
}
else //否則沒(méi)人搶答,則前面不顯示幾號(hào)
{P0=~0x00;
P2=~0xff;}
P0=table1[s/10]; //下面為顯示搶答倒計(jì)時(shí)
P2=table2[2];
delay(2);
P0=~0;
P2=~0xff;
P0=table1[s%10];
P2=table2[3];
delay(2);
P2=~0xff;
P0=~0x00;
}
else //如果開(kāi)始鍵沒(méi)有按下,則顯示F FF(若有違規(guī)者,則顯示違規(guī)號(hào)碼及 FF)或時(shí)間調(diào)整
{if(flag4==1) //違規(guī)顯示
{if(num!=0)
{P0=table1[num]; //顯示幾號(hào)違規(guī)了
P2=table2[0];
delay(2);
P0=~0x00;
P2=~0xff;
P0=table1[15]; //下面顯示 FF,表示違規(guī)了
P2=table2[2];
delay(2);
P0=~0x00; //消隱
P2=~0xff;
P0=table1[15];
P2=table2[3];
delay(2);
P0=~0x00;
P2=~0xff;
}
else
{
P0=~0x00;
P2=~0xff;}
}
else //沒(méi)有人違規(guī)才顯示調(diào)整時(shí)間
{if(aa==1)
{
P0=~0x76; //第一位數(shù)碼管顯示"5(S)"(表示搶答時(shí)間調(diào)整)
P2=table2[0];
delay(2);
P0=~0x00;
P2=~0xff;
P0=table1[time1/10]; //下面顯示調(diào)整的搶答時(shí)間
P2=table2[2];
delay(2);
P0=~0x00;
P2=~0xff;
P0=table1[time1%10];
P2=table2[3];
delay(2);
P0=~0x00;
P2=~0xff;
}
else if(bb==1)
{P0=~0x38; //第一位與第二位數(shù)碼管合起來(lái)顯示"T",表示答題 時(shí)間調(diào)整
P2=table2[0];
delay(2);
P0=~0x00;
P2=~0xff;
P0=table1[time2/10];
P2=table2[2];
delay(2);
P0=~0x00;
P2=~0xff;
P0=table1[time2%10];
P2=table2[3];
delay(2);
P0=~0x00;
P2=~0xff;
}
else //否則顯示F FF
{P0=table1[15];
P2=table2[0];
delay(2);
P0=~0x00;
P0=table1[15];
P2=table2[2];
delay(2);
P0=~0x00; //消隱
P2=~0xff;
P0=table1[15];
P2=table2[3];
delay(2);
P0=~0x00;
P2=~0xff;
}
}
}
}
void main()
{uchar i=100;
init(); //調(diào)用初始化子函數(shù)
while(1)
{key1(); //調(diào)用開(kāi)始鍵掃描子函數(shù)
if((flag1==0)&(flag2==1)) //違規(guī)
{key();
if(num!=0) //開(kāi)始鍵沒(méi)有按下時(shí),有人按下了搶答器,則置違規(guī)標(biāo)志位
{flag4=1;
D0=0;
}
}
if((flag1==1)&(flag2==1)) //如果開(kāi)始鍵按下且搶答鍵沒(méi)有人按下,則進(jìn)行八路 搶答鍵掃描
{key();}
display(); //顯示到數(shù)碼管上
}
}
//定時(shí)器0中斷子函數(shù)
void t0() interrupt 1
{TH0=(65536-2000)/256;//2ms
TL0=(65536-2000)%256;
if(flag3) //開(kāi)始(START)鍵按下,嘟一聲(長(zhǎng)1秒),表示開(kāi)始搶答
{
beep=~beep;
}
else
beep=1;
if(s<5) //搶答時(shí)間快到報(bào)警,隔1秒響一聲且紅燈閃爍,響三聲
{if(s%2==0)
{flag3=1;
D0=0;}
else
{flag3=0;
D0=1;}
}
m++;
if(m==500)//1秒
{m=0;
s--;
flag3=0; //關(guān)閉開(kāi)始鍵按下響一秒的嘟聲
if(s==-1)
{s=20;
TR0=0;
flag1=0; //顯示F FF
flag2=1;
num=0;
D0=1;}
}
}
//定時(shí)器1中斷子函數(shù)
void t1() interrupt 3 //定時(shí)器1處理有人按下?lián)尨鹌鬣揭宦?長(zhǎng)1秒)
{TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
beep=~beep;
n++;
if(n==500)
{n=0;TR1=0;}
}
全部資料51hei下載地址:
單片機(jī).zip
(53.98 KB, 下載次數(shù): 62)
2018-12-11 09:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|