籃球記分牌主要分為兩大部分:一部分是實現倒計時功能,和實驗課所做的60S倒計時類似。另一部分是實現計分功能,其基本功能和計數器類似。同時外加兩部分切換顯示功能。
需要注意的是程序中的管腳與原理圖中管腳必須一致,在畫原理圖時也一樣應當注意復位電路、晶振、電源、數碼管接在芯片正確的管腳。復位電路中REST接的是芯片第9腳,晶振電路中XTAL2和XTAL1分別接18、19腳,將晶振產生的時鐘信號作為定時信號。芯片20腳接GND,40腳和31腳接VCC,數碼管是共陰數碼管。
0.png (49.51 KB, 下載次數: 46)
下載附件
2018-4-29 15:44 上傳
圖片8.png (444.05 KB, 下載次數: 44)
下載附件
2018-4-29 11:08 上傳
0.jpg (32.13 KB, 下載次數: 46)
下載附件
2018-4-29 15:44 上傳
程序源碼如下: - #include<reg52.H> //*****頭文件*****//
- #define uchar unsigned char //*定義變量*//
- #define uint unsigned int //*定義uint為無符號整形變量*//
- unsigned t = 0x3cb0;
- uchar CZ=24; //*計時初值*//
- uchar key=0;
- uchar score;
- uchar mode=1;//*模式變量*//
- uchar score1=0; //*甲隊得分變量*//
- uchar score2=0; //*乙隊得分變量*//
- uchar bittime=0,bitdisplay=0; //*定義變量*//
- uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //*段碼0,1,2,3,4,5,6,7,8,9*//
- sbit J0=P3^0; //*獨立按鍵 *//
- sbit J1=P3^1;
- sbit J2=P3^2;
- sbit J3=P3^3;
- sbit J4=P3^4;
- sbit J5=P3^5;
- sbit J6=P3^6;
- sbit LED1 = P1^0;
- sbit LED2 = P1^1;
- sbit LED3 = P1^2;
- sbit LED4 = P1^3;
- sbit SPK=P1^7;
- /********延時函數******/
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /* 服務程序*/
- void timer0 (void) interrupt 1 using 0
- {
- TH0=0x3c; //*50ms*//
- TL0=0xb0;
- bittime++; //每來一次中斷,中斷次數bittime自加1
- while(bittime==20)
- {
- bittime=0; //每經一秒調用一次顯示程序
- bitdisplay=1;
- if(bitdisplay)
- {
- bitdisplay = 0;
- CZ--;
- if(-1 == CZ) CZ=24;
- }
- }
- }
- /* 甲隊分數顯示函數*/
- void display_1(uint z)
- {
- P2 = 0XFE; /*11111101甲隊個位分數顯示*/
- P0 = tab[z%10];
- delay(10);
- P2 = 0XFD; /*11111110甲隊十位分數顯示*/
- P0 = tab[z/10];
- delay(10);
- }
- /* 乙隊分數顯示函數*/
- void display_2(uint z)
- {
- P2 = 0Xfb; /*11110111乙隊個位分數顯示*/
- P0 = tab[z%10];
- delay(10);
- P2 = 0Xf7; /*11111011乙隊十位分數顯示*/
- P0 = tab[z/10];
- delay(10);
- }
- /* 甲分數處理函數*/
- int inc1()
- {
-
- if(~J3)
- {
- delay(10);
- score1= score1+1;
- }while(~J3);
-
- if(~J4)
- {
- delay(10);
- score1= score1+2;
- }while(~J4);
- if(~J5)
- {
- delay(10);
- score1= score1+3;
- }while(~J5);
-
- return score1;
- }
- /* 乙分數處理函數*/
- int inc2()
- {
- if(~J3)
- {
- delay(10);
- score2= score2+1;
- }while(~J3);
-
- if(~J4)
- {
- delay(10);
- score2= score2+2;
- }while(~J4);
- if(~J5)
- {
- delay(10);
- score2= score2+3;
- }while(~J5);
-
- return score1;
- }
- /* 甲乙隊切加分換處理函數*/
- uchar turn()
- {
- if(~J2)
- {
- delay(10);
- if(~J2)
- {
- delay(10);
- LED1 = 1;
- LED2 = 1;
- LED3 = 0;
- LED4 = 1;
- key = 1;
- }while(~J2);
- }
- if(~J6)
- {
- delay(10);
- if(~J6)
- {
- delay(10);
- LED1 = 1;
- LED2 = 1;
- LED3 = 1;
- LED4 = 0;
- key = 2;
- }while(~J6);
- }
- return key;
- }
- /* 加分顯示函數*/
- void marks()
- {
- turn();
- if(key == 1)
- {
- inc1();
- if(score1<100)
- {
- display_1(score1);
- display_2(score2);
- }
- else score1 =score1-100;
- }
- else if(key == 2)
- {
- inc2();
- if(score2<100)
- {
- display_1(score1);
- display_2(score2);
- }
- else score2 = score2-100;
- }
- }
- /*模式選擇函數*/
- uchar mode_select()
- {
- if(~J0)
- {
- delay(10);
- if(~J0)
- {
- delay(10);
- mode = 1;
- LED1 = 0;
- LED2 = 1;
- LED3 = 1;
- LED4 = 1;
- } while(~J0);
- }
- if(~J1)
- {
- delay(10);
- if(~J1)
- {
- delay(10);
- mode = 2;
- LED1 = 1;
- LED2 = 0;
- LED3 = 1;
- LED4 = 1;
- } while(~J1);
- }
- return mode;
- }
-
- /*倒計時處理*/
- void time_count()
- {
- TR0 = 1;
- P2 = 0XFB; /*11111010甲乙十位顯示*/
- P0 = tab[CZ/10];
- delay(10);
- P2 = 0XFD; /*11110101甲乙個位顯示*/
- P0 = tab[CZ%10];
- delay(10);
- }
- /* 主函數*/
- int main()
- {
- TMOD= 0x01;
- TH0=0x3c;
- TL0=0xb0;
- EA = 1; //cpu允許所有中斷
- ET0 =1;//定時器T0中斷允許
- TR0 = 0;//關閉定時器T0
- P2 = 0XF0;
- P0 = 0x3f;
- SPK=0;
- while(1)
- {
- mode_select();
- if(1 == mode) //加分功能
- {
- TR0 = 0;//關閉定時器
- CZ = 24; //重新賦初值24秒
- display_1(score1);
- delay(10);
- display_2(score2);
- marks();
- }
- if(2 == mode) //計時功能
- {
- if(CZ == 0){TR0 = 0,SPK=1;delay(30);SPK = 0;
- foul_sever();
- }
- time_count();}
-
- }
- return 0;
- }
復制代碼
全部資料51hei下載地址:
籃球計分牌.rar
(101.49 KB, 下載次數: 64)
2018-4-29 11:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|