電路圖如下
51hei.png (21.94 KB, 下載次數: 52)
下載附件
2020-6-6 01:47 上傳
1591344719(1).jpg (98.7 KB, 下載次數: 44)
下載附件
2020-6-5 16:12 上傳
源程序如下
/*
利用定時器T1定時,實現準確定時到秒
通過按鍵,可以進行加一分、加兩分、
加三分、或者因為記錯分修正操作,還
可以因特殊原因暫停計時,或重新計時等
時間:2020年6月4日制作
*/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^0; //積分數碼管段選信號的鎖存器控制
sbit wela=P2^1; //積分數碼管位選信號的鎖存器控制
sbit dula1=P2^2; //計時數碼管段選信號的鎖存器控制
sbit wela1=P2^3; //計時數碼管位選信號的鎖存器控制
sbit key1=P1^0; //紅隊進球加一分按鈕
sbit key2=P1^1; //紅隊進球加兩分按鈕
sbit key3=P1^2; //紅隊進球加三分按鈕
sbit key4=P1^3; //紅隊因錯記分 每次減一分按鈕
sbit key5=P1^4; //藍隊進球加一分按鈕
sbit key6=P1^5; //藍隊進球加兩分按鈕
sbit key7=P1^6; //藍隊進球加三分按鈕
sbit key8=P1^7; //藍隊因錯記分 每次減一分按鈕
sbit key0=P3^6; //從新計時按鈕
sbit key9=P3^7; //暫停計時按鈕
unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//數碼管各位的碼表
unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//數碼管段選碼表
uchar i=0;//藍隊加分標志
uchar j=0;//紅隊加分標志
uchar r=0;//計時標志
//毫秒延時函數
void delay(uint i)
{
uint m,n;
for(m=i;m>0;m--)
for(n=114;n>0;n--);
}
//計分顯示函數
void xianshi(uchar a,uchar b)
{
P0=wei[0];
wela=1;
wela=0;
P0=duan[a%10];
dula=1;
dula=0;
delay(1);
P0=wei[1];
wela=1;
wela=0;
P0=duan[a%100/10];
dula=1;
dula=0;
delay(1);
P0=wei[2];
wela=1;
wela=0;
P0=duan[a/100];
dula=1;
dula=0;
delay(1);
P0=wei[3];
wela=1;
wela=0;
P0=duan[b%10];
dula=1;
dula=0;
delay(1);
P0=wei[4];
wela=1;
wela=0;
P0=duan[b%100/10];
dula=1;
dula=0;
delay(1);
P0=wei[5];
wela=1;
wela=0;
P0=duan[b/100];
dula=1;
dula=0;
delay(1) ;
P0=wei[0];
wela1=1;
wela1=0;
P0=duan[(24-r)%10];
dula1=1;
dula1=0;
delay(1);
P0=wei[1];
wela1=1;
wela1=0;
P0=duan[(24-r)/10];
dula1=1;
dula1=0;
delay(1);
}
//按鍵檢測函數
void jiance()
{
if(key1==0)
{
delay(100);
if(key1==0) j+=1;
}
if(key2==0)
{
delay(105);
if(key2==0) j+=2;
}
if(key3==0)
{
delay(105);
if(key3==0) j+=3;
}
if(key4==0)
{
delay(105);
if(key4==0) j-=1;
}
if(key5==0)
{
delay(105);
if(key5==0) i+=1;
}
if(key6==0)
{
delay(105);
if(key6==0) i+=2;
}
if(key7==0)
{
delay(105);
if(key7==0) i+=3;
}
if(key8==0)
{
delay(105);
if(key8==0) i-=1;
}
}
void main()
{
uchar e=0;
EA=1; //開總中斷
TR1 = 1;//啟動定時器T1
TMOD = 0x10;//T1為定時器,工作模式1 16位計數器
TH1 = 0x4b;
TL1 = 0xfc;//給定時器T1賦值0x4bfc 定時50ms
while(1)
{
if(TF1 == 1)//判斷T1是否溢出
{
TH1 = 0x4b;
TL1 = 0xfc;//重新賦值0x4bfc 定時50ms
TF1 = 0;//清零便于下次判斷
e++;//50毫秒計數加1
}
if(e == 20)//判斷是否到1秒
{
e = 0;//清零便于下次記錄50ms的次數
r++;//秒加1
}
if(r>24) r=0;//24秒完,重新計時
//出現犯規等重新計時
if(key0==0)
{
delay(105);
if(key0==0)
{
r=0;
TH1 = 0x4b;
TL1 = 0xfc;//0x4bfc 定時50ms
e=0;
TR1=1;
}
}
//出現特殊情況,暫停計時
if(key9==0)
{
delay(105);
if(key9==0)
TR1=~TR1;
}
jiance(); //檢測按鍵有無按下
xianshi(i,j);//顯示比分
}
}
全部資料51hei下載地址:
籃球記分器 計時器.zip
(171.4 KB, 下載次數: 69)
2020-6-5 16:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
bandicam 2020-06-04 23-18-59-173.zip
(15.86 MB, 下載次數: 41)
2020-6-5 16:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|