欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機籃球計分器
[打印本頁]
作者:
pqtomato
時間:
2017-5-26 10:37
標題:
51單片機籃球計分器
/******************************************************************
***************************籃球計時計分系統************************
*************************本系統滿足以下幾點要求********************
*1、能設置整個賽程的比賽時間,在比賽過程中能根據需要暫停和開始計時*
*2、能根據比賽情況刷新比賽雙方的比分*******************************
*3、中場交換比賽場地時,能交換A、B兩隊比分的位置*******************
*4、比賽結束時,能發出報警聲***************************************
******************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code HC595_ScanDATE[]= //定義數碼管位數組
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
unsigned char code LED_DATE [] = //定義數碼管段數組
{
0XC0, // 0
0XF9, // 1
0XA4, // 2
0XB0, // 3
0X99, // 4
0X92, // 5
0X82, // 6
0XF8, // 7
0X80, // 8
0X90 // 9
};
sbit DS =P2^0; //74HC595各I/O口定義
sbit SHCP =P2^1;
sbit STCP =P2^2;
sbit S2 =P3^2; //賽前設定比賽時間按鍵
sbit S3 =P1^0; //加1分按鍵
sbit S4 =P1^1; //加2分按鍵
sbit S5 =P1^2; //減1分按鍵
sbit S6 =P1^3; //半場換分按鍵
sbit S7 =P1^4; //停止蜂鳴器按鍵
sbit S8 =P1^5; //開始按鍵
sbit S9 =P1^6; //暫停/繼續按鍵
sbit S10 =P1^7; //加分減分隊伍選擇按鍵
sbit LED2 =P3^5; //A隊指示燈
sbit LED3 =P3^6; //B隊指示燈
sbit BUZZ =P3^7;
bit Flag_Score=0; //加分減分隊伍選擇標志位
void Display();
void HC595(uchar a);
void Delay_MS(uint ms);
void KEY();
void Init();
uint time=1200; //初始時間20分鐘
uchar A_Score=0; //A隊得分
uchar B_Score=0; //B隊得分
uchar Time_bit=0; //用于定時器溢出標志
void main()
{
Init();
while(1)
{
Display();
KEY();
}
}
void Init() //初始化函數
{
LED2=0;
TMOD=0x01; //定時器0 第一種工作方式
TH0=(65536-50000)/256; //裝初值,定時50ms
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //打開定時器0
}
void Timer() interrupt 1 //定時器函數,時間處理
{
Time_bit++;
if(Time_bit==20) //溢出20次,定時1秒
{
Time_bit=0;
if(time==0) //當比賽結束時,停止計時,并發出警報
{
BUZZ=0;
//time=0;
TR0=0;
}
else
time--;
}
TH0=(65536-50000)/256; //重裝初值,定時50ms
TL0=(65536-50000)%256;
}
void KEY()
{
uchar Transposition_Scores=0; //半場換分使用的緩存數據變量
if(S2==0) //比賽時間設定,按一次加5分鐘
{
Delay_MS(1000);
if(S2==0)
{
while(!S2);
if(TR0==0) //判斷是否開始,以免已經開始有誤按
{
time=time+300;
if(time>2700) //如果時間超過45分鐘,重新賦值20分鐘
time=1200;
}
}
}
if(S3==0) //加1分按鍵
{
Delay_MS(1000);
if(S3==0)
{
if(TR0==1) //判斷是否開始,以免還未開始有誤按
{
while(!S3);
if(Flag_Score==0)
A_Score++;
else
B_Score++;
}
}
}
if(S4==0) //加2分按鍵
{
if(TR0==1) //判斷是否開始,以免還未開始有誤按
{
Delay_MS(1000);
if(S4==0)
{
while(!S4);
if(Flag_Score==0)
A_Score=A_Score+2;
else
B_Score=B_Score+2;
}
}
}
if(S5==0) //減1分按鍵
{
if(TR0==1) //判斷是否開始,以免還未開始有誤按
{
Delay_MS(1000);
if(S5==0)
{
while(!S5);
if(Flag_Score==0)
{
if(A_Score==0) //防止分數是0時亂碼
A_Score=0;
else
A_Score--;
}
else
{
if(B_Score==0) //防止分數是0時亂碼
B_Score=0;
else
B_Score--;
}
}
}
}
if(S6==0) //半場換分
{
Delay_MS(1000);
if(S6==0)
{
while(!S6);
Transposition_Scores=A_Score; //A隊的得分先賦給緩存變量
A_Score=B_Score; //將B隊的得分賦給A隊
B_Score=Transposition_Scores; //再把緩存變量的值(也就是原先A隊的得分)賦給B隊
}
}
if(S7==0) //停蜂鳴器
{
Delay_MS(1000);
if(S7==0)
{
while(!S7);
BUZZ=1;
}
}
if(S8==0) //開始
{
Delay_MS(1000);
if(S8==0)
{
while(!S8);
if(time==0)
time=1200; //一輪比賽結束后重新給時間賦值
TR0=1; //定時器開始工作
}
}
if(S9==0) //暫停繼續
{
Delay_MS(1000);
if(S9==0)
{
while(!S9);
TR0=~TR0; //定時器暫停/繼續工作
}
}
if(S10==0) //切換加分減分隊伍
{
Delay_MS(1000);
if(S10==0)
{
while(!S10);
Flag_Score=~Flag_Score;
if(Flag_Score==0)
{
LED2=0;
LED3=1;
}
else
{
LED2=1;
LED3=0;
}
}
}
}
void Display() //顯示函數
{
P0=LED_DATE[time/1000]; //得出時間千位
HC595(HC595_ScanDATE[0]);
Delay_MS(500);
P0=0xff; //消隱
P0=LED_DATE[time%1000/100]; //得出時間百位
HC595(HC595_ScanDATE[1]);
Delay_MS(500);
P0=0xff; //消隱
P0=LED_DATE[time%100/10]; //得出時間十位
HC595(HC595_ScanDATE[2]);
Delay_MS(500);
P0=0xff; //消隱
P0=LED_DATE[time%10]; //得出時間最個位
HC595(HC595_ScanDATE[3]);
Delay_MS(500);
P0=0xff; //消隱
P0=LED_DATE[A_Score/10]; //得出A隊得分十位
HC595(HC595_ScanDATE[4]);
Delay_MS(500);
P0=0xff; //消隱
P0=LED_DATE[A_Score%10]; //得出A隊得分個位
HC595(HC595_ScanDATE[5]);
Delay_MS(500);
P0=0xff; //消隱
P0=LED_DATE[B_Score/10]; //得出B隊得分十位
HC595(HC595_ScanDATE[6]);
作者:
TiMan
時間:
2018-11-27 21:03
樓主能私發給我嗎
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1