KJHMPM3`36MHAZ0B05)9GVX.png (155.31 KB, 下載次數: 34)
下載附件
2020-2-27 10:30 上傳
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//對應數碼管顯示數字0-9
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int m=1,n=0,x=0,y=0,x1,y1,i=0,h=0,k;
//定義全局變量并初始化,m,n表示分鐘與秒,x,y表示甲乙兩隊分數
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit dian=P0^7;
void delay(uint x)//定義延時程序,通過設置參數x,改變延時時間長度
{
while(x--)
{
uint y;
for(y=0;y<200;y++);
}
}
void display(int i,int j,int x,int y,int x1,int y1)//顯示子程序 變量i,j分別是分秒,變量x,y是甲乙兩隊的分數
{
P2=0xfe;
//數碼管刷新顯示時間的分鐘十位,調用延時程序
if(x1>=1)P0=(seg[i/10]|0x80);
else P0=seg[i/10];
delay(1); //延時數碼管點亮
P2=0xff;
P0=0xff;
P2=0xfd; //同上,刷新數碼管的分鐘位的個位
if(x1>=2)P0=(seg[i%10]|0x80);
else P0=seg[i%10];
delay(1);
P2=0xff;
P0=0xff;
P2=0xfb; //同上。刷新數碼管秒位的十位
if(x1>=3)P0=(seg[j/10]|0x80);
else P0=seg[j/10];
delay(1);
P2=0xff;
P0=0xff;
P2=0xf7; //同上,刷新數碼管秒位的個位
if(x1>=4)P0=(seg[j%10]|0x80);
else P0=seg[j%10];
delay(1);
P2=0xff;
P0=0xff;
P2=0xef; //同上。刷新數碼管甲隊分數的十位
if(y1>=1)P0=(seg[x/10]|0x80);
else P0=seg[x/10];
delay(1);
P2=0xff;
P0=0xff;
P2=0xdf; //同上。刷新數碼管甲隊分數的個位
if(y1>=2)P0=(seg[x%10]|0x80);
else P0=seg[x%10];
delay(1);
P2=0xff;
P0=0xff;
P2=0xbf; //同上。刷新數碼管乙隊分數的十位
if(y1>=3)P0=(seg[y/10]|0x80);
else P0=seg[y/10];
delay(1);
P2=0xff;
P0=0xff;
P2=0x7f; //同上。刷新數碼管乙隊分數的個位
if(y1>=4)P0=(seg[y%10]|0x80);
else P0=(seg[ y%10]);
delay(1);
P2=0xff;
P0=0xff;
}
void t0() interrupt 1 //定義中斷程序,調用定時器TO
{
TH0=0xb1; //對定時器T0送入初值,THO=0xb1
TL0=0x10; //TL0=0X10 故定時器定時為20毫秒,
if(n==0) //即每20毫秒調用一次
{
n=60;
m--;
}
i++;
if(i==50) //定義i的值為50,即50*20毫秒=1秒
{
n--;
i=0;
}
display(m,n,x,y,x1,y1);//調用數碼管顯示程序,即每20毫秒刷
}
void jiafen() //定義加分程序
{
if(P1_1==0)//當按下P1_1的時候
{
delay(1);//延時去抖
while(P1_1==0);
x++;//甲隊加一分
}
if(P1_2==0)//當按下P1_2的時候
{
delay(1);
while(P1_2==0);
x+=2;//甲隊加兩分
}
if(P1_3==0) //當按下P1_3的時候
{
delay(1);
while(P1_3==0);
x+=3;//甲隊加三分
}
if(P1_4==0) //當按下P1_4的時候
{
delay(1); //延時去抖
while(P1_4==0);
y++; //乙隊加一分
}
if(P1_5==0) //當按下P1_5的時候
{
delay(1);
while(P1_5==0);
y+=2; //乙隊加兩分
}
if(P1_6==0) //當按下P1_6的時候
{
delay(1);
while(P1_6==0);
y+=3; //乙隊加三分
}
}
void jianfen() //定義減分程序
{
if(P3_0==0&&x>0) //當按下P3_0并且甲隊分數大于0的時候
{
delay(1); //延時去抖
while(P3_0==0);
x--; //甲隊減1分
}
if(P3_1==0&&x>0) //當按下P3_1并且乙隊分數大于0的時候
{
delay(1);
while(P3_1==0);
y--; //乙隊減1分
}
}
void tiaoshi() //定義調時程序
{
if(P3_2==0) //當按下P3_2的時候
{
delay(1); //延時去抖
if(P3_2==0)
{
n++; //秒位加1
if(n==60)//當秒位到60的時候
{
m++;//分位加1,并且秒位變1
n=1;
}
}
}
if(P3_3==0) //當按下P3_3的時候
{
delay(1);
if(P3_3==0)
{
n--;//秒位減一
if(n==0)
//當秒位減到0的時候,分位減一,并且秒位變59
{
m--;
n=59;
}
}
}
}
void jiaohuan() //定義比分交換程序
{
int t; //定義中間變量t
if(P1_7==0) //當P1_7按下的時候
{
delay(1); //延時去抖
while(P1_7==0);
t=x; //利用中間變量t,將甲乙兩隊比分交換
x=y;
y=t;
t=x1;
x1=y1;
y1=t;
display(m,n,x,y,x1,y1); //刷新數碼管
}
}
void zanting() //定義暫停程序
{
if(P1_0==0) //當P1_0按下的時候
{
delay(1); //延時去抖
while(P1_0==0);
EA=0; //關中斷,進入死循環
while(1)
{
display(m,n,x,y,x1,y1);
if(P1_0==0) //當P1_0再次按下的時候,跳出死循環
{
delay(1);
while(P1_0==0)
EA=1;
break;
}
}
}
}
void baojing() //定義報警程序
{
if((m==0)&&(n<=10)&&(n>1)) //判斷當倒計時只剩下10秒的時候
{
P3_7=1;
P3_6=1; //使P3_7和P3_6同時間隔輸出高低電平,點亮發光二極管和使蜂鳴器蜂鳴
delay(20);
P3_7=0;
P3_6=0;
delay(20);
}
}
void jieshu() //定義結束子程序
{
M: if(h==1)
//當時間條件滿足時,關閉中斷,使數碼管保持狀態顯示
{
EA=0;
delay(20);
m=0;
n=0;
P3_6=1;
P3_7=1;
delay(200);
P3_7=0;
P3_6=0;
while(1)
{
display(m,n,x,y,x1,y1);
jiafen();
jianfen();
jiaohuan();
if(P1_0==0) //當P1_0再次按下的時候,跳出循環
{
delay(1);
while(P1_0==0)
{
EA=1;
m=10; //重新賦予時間初始值開始下半場比賽
n=0;
h=0;
goto M ;
}
}
}
}
}
void main() //定義主程序
{
TMOD=0x01; //初始化程序
EA=1;
ET0=1;
P3_7=1;
P0=0xff;
P2=0xff;
k1=k2=1;
if(P1_0==0) //第一次按下P1_0,單片機啟動,并顯示初始值
{ //由于調用了一次暫停功能,會顯示初始值
TH0=0xb1;
TL0=0x10;
TR0=1; //啟動定時器
P3=0xff;
P1=0x7f;
P3_7=1;
P1_7=1;
while(1)
{
jiafen(); //加分子程序
jianfen(); //減分子程序
tiaoshi(); //調時子程序
jiaohuan(); //比分交換子程序
zanting(); //暫停子程序
baojing(); //報警子程序
if((m==0)&&(n==1)) //判斷結束子程序的調用條件
{
h=1;
}
jieshu(); //結束子程序dian=0;P2=0xf0;
if(k1==0){delay(20);if(x1<4)x1++;if(x1==4){P3_6=1;P3_7=1;while(k1==1);P3_6=0;P3_7=0;x1=1;dian=0;P2=0xf0;}while(!k1);delay(20);}
if(k2==0){delay(20);if(y1<4)y1++;if(y1==4){P3_6=1;P3_7=1;while(k2==1);P3_6=0;P3_7=0;y1=1;dian=0;P2=0x0f;}while(!k2);delay(20);}
}
}
}
|