資源簡介
基于C51單片機的籃球計分器,資源中包含完整源代碼、已編譯的hex文件以及proteus仿真圖。 可通過按鈕設置A、B隊加減分,可通過按鍵暫停倒計時,可以調快時間或調慢時間。支持換場分數互換

代碼片段和文件信息
?#include
code?unsigned?seg[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};
?// 分別對應數碼管顯示字形0-9
int?m=15n=00x=0y=0jie=2bujin=1zanting=0chuzanting=0; ?
?//初始化,m、n為分、秒計時 x、y為A、B兩隊分數?,其余為中間變量
?
sbit?A_add?=?P3^0; // A隊加分按鈕
sbit?B_add?=?P3^1; // B隊加分按鈕
sbit?Time_add?=?P3^2; // 時間加按鈕
sbit?Time_sub?=?P3^3; // 時間減按鈕
sbit?A_sub?=?P3^4; // A隊減分按鈕
sbit?B_sub?=?P3^5; // B隊減分按鈕
sbit?pause?=?P3^6; // 暫停、啟動按鈕
sbit?change?=?P3^7; //?換場地按鈕
void?keyScan(); //按鍵掃描函數
void?delay(int?t) //延時子程序,通過參數t,可以調整暫停時間
{
while(t--)
{
unsigned?int?i;
for(i=0;i<200;i++); ???//設置變量i的變化范圍,能調整延時的單位時間長度,i越小,延時單位時間越短,精度越高
}
}
void?display(int?mint?nint?xint?y)//數碼管動態刷新顯示程序
{
if(jie==1&&bujin!=2)??//中間變量jie=1時,為上半場,對p1賦值
P1=0xbf; ???//p1=0xbf即p1=1011111B,點亮上半場對應指示燈
P2=0xfe; //數碼管動態刷新顯示程序p2=11111110,i為分鐘
P0=seg[m/10]; ???//刷新顯示時間顯示分鐘十位,調用延時程序
delay(1); //延時數碼管的點亮
P2=0xff;
P0=0;
P2=0xfd; //同理,?分鐘個位并延時點亮
P0=seg[m%10];
delay(1);
P2=0xff;
P0=0;
P2=0xfb;?????????????//秒鐘十位
P0=seg[n/10];
delay(1);
P0=0;
P2=0xff;
P2=0xf7; ?????//秒鐘個位
P0=seg[n%10];
delay(1);
P0=0;
P2=0xff;
P2=0xef; ??//??A隊分數十位
P0=seg[x/10];
delay(1);
P2=0xff;
P0=0;
P2=0xdf; ????????//A隊分數個位
P0=seg[x%10];
delay(10);
P2=0xff;
P0=0;
P2=0xbf; ??//B隊分數十位
P0=seg[y/10];
delay(1);
P0=0;
P2=0xff;
P2=0x7f; ???//B隊分數個位
P0=seg[y%10];
delay(1);
P0=0;
P2=0xff;
}
void?t0(void)?interrupt?1??//調用定時器T0??基本計時單位秒 ?中斷
{
int?i;
TH0=0xb1; ?//利用定時器T0送入計數初值TH0TL0
TL0=0x10;????????????//定時器定時單位為20ms
i++;
if(i==50) ?//利用中間變量i,令i的值為50?50*20ms=1秒
{
if(n==0) ??//分鐘與秒時間的調整??當秒減到0后分鐘減1
{
n=60;
if(m?>?0)?m--;
}
n--; ??//實現1秒計時
i=0;
}
}
void?main() ???//主程序
{
TMOD=0x01; //設置定時器工作方式
EA=1;
ET0=1;
TH0=0xb1; ???//定時計送計數初值,EA=1,開中斷p3口電平拉高
TL0=0x10; ?//p1-0x7f,上半場指示燈點亮
TR0=1;
P3=0xff;
P1=0x7f;
while(1) ?//通過while(1),反復調用循環體內子程序
{
display(mnxy); ?//調用動態刷新顯示程序
keyScan(); //按鍵處理函數
if(m?<=0?&&?n<=0) //時間結束了
{
ET0=0; //關閉中斷,停止計時
TR0?=?0;
}
}
}
void?keyScan() //按鍵掃描函數
{
int?temp; ???//中間變量temp,檢測到有按鍵按下時交換AB兩隊分數
if(A_add==0) //當檢測到A隊加分按鍵按下,對應加分
{
delay(1); ??//調用延時子程序,實現按鍵抖動功能,即當檢測到按鍵按下時,延時,按鍵仍按下,說明非抖動,A隊對應加分
if(A_add==0)
{
x++;
}
}
if(B_add==0) ??//B隊加分鍵被按下
{
delay(1);
if(B_add==0)
{
y++;
}
}
if(A_sub==0) //A隊減分
{
delay(1);
if(A_sub==0)
{
if(x>=1)?x--;
}
}
if(B_sub==0) //B隊減分
{
delay(1);
if(B_sub==0)
{
if(y>=1)y--;
}
}
if(Time_add==0) //時間增加按鈕
{
delay(10);
if(Time_add==0)
{
n++;
if(n==60)
{
m++;
n=1;
}
}
}
if(Time_sub==0) //時間減少
{
delay(10);
if(Time_sub==0)
{
if(!(m?==?0?&&?n?==?0)) //防止被減成了負數
{
if(n?<=?0)
{
n?=?60;
m--;
}
n--;
}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????90360??2016-12-21?11:06??ISIS.dmp
?????文件??????108751??2016-12-21?18:58??lanqiu.DSN
?????文件?????????742??2016-12-23?16:04??lanqiu.PWI
?????文件????????9039??2016-12-21?19:24??lanqiu1
?????文件????????4034??2016-12-21?19:24??lanqiu1.c
?????文件????????3115??2016-12-21?19:24??lanqiu1.hex
?????文件??????????62??2016-12-21?19:24??lanqiu1.lnp
?????文件???????11311??2016-12-21?19:24??lanqiu1.LST
?????文件???????14440??2016-12-21?19:24??lanqiu1.M51
?????文件????????9957??2016-12-21?19:24??lanqiu1.OBJ
?????文件?????????754??2016-12-21?14:46??lanqiu1.plg
?????文件????????5046??2016-12-21?17:33??lanqiu1.uvopt
?????文件???????14041??2016-12-21?17:33??lanqiu1.uvproj
?????文件???????55324??2016-12-21?12:37??lanqiu1_uvopt.bak
?????文件???????????0??2016-12-20?21:23??lanqiu1_uvproj.bak
?????文件??????113387??2016-12-21?18:58??Last?Loaded?lanqiu.DBK
?????文件????????6376??2009-05-07?14:37??STARTUP.A51
?????文件???????14052??2016-12-21?19:24??STARTUP.LST
?????文件?????????749??2016-12-21?19:24??STARTUP.OBJ
- 上一篇:織夢dedecms城市分站插件.zip
- 下一篇:ECG檢測QRS波、、、、、、
評論
共有 條評論