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