可以實現籃球計分基本功能
仿真原理圖如下(大家自行畫一下圖)
單片機源程序如下:
- #include<reg52.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit A8=P2^0;
- sbit A9=P2^1;
- sbit A10=P2^2;
- sbit A11=P2^3;
- sfr P00=0x80;
- uchar code wei_1[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
- uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00,0X40};
- uchar minute=12; //分
- uchar second=0; //秒
- uchar key_status=0; //按鍵狀態值
- uchar scoreA=0; //A隊得分
- uchar scoreB=0; //B隊得分
- uchar count1=20; //記錄定時器時間
- uchar match=1; //比賽節數
- uchar rule_time=24; //記錄24秒規則
- uchar rule_flag=0; //記錄24秒規則是否啟用
- /*
- 初始化IO口
- */
- void IO_init(){
- A8=0;
- A9=0;
- }
- /*
- 初始化時間
- */
- void time_init(){
- TMOD = 0x01;
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- EA = 1;
- ET0 = 1;
- }
- /*
- 延時函數
- */
- void delay_ms(uint z){
- uint i;
- uchar j;
- for(i=0;i<z;i++){
-
- for(j=0;j<100;j++);
- }
- }
- /*
- 計時函數
- */
- void T0_Time() interrupt 1 using 1{
- if (count1-- == 0)
- {
- second--;
- rule_time--;
- count1 = 20;
- }
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- }
- /*
- 時間顯示函數
- */
- void time_display(uchar w2,uchar d2){
- uchar shi1,ge1;
- shi1=d2/10;
- ge1=d2%10;
-
- P00=wei_1[w2];
- A10=1;
- A10=0;
- P00=table[shi1];;
- A8=1;
- A8=0;
- delay_ms(5);
- P00=0;
- A10=1;
- A10=0;
- A8=1;
- A8=0;
-
- P00=wei_1[w2+1];
- A10=1;
- A10=0;
- P00=table[ge1];
- A8=1;
- A8=0;
- delay_ms(5);
- P00=0;
- A10=1;
- A10=0;
- A8=1;
- A8=0;
- }
- /*
- 分數顯示函數
- */
- void score_dispaly(uchar w2,uchar d2){
- uchar qian2,shi2,ge2;
- qian2=d2/100;
- shi2=d2%100/10;
- ge2=d2%100%10;
-
- P00=wei_1[w2];
- A9=1;
- A9=0;
- P00=table[qian2];;
- A8=1;
- A8=0;
- delay_ms(10);
- P00=0;
- A9=1;
- A9=0;
- A8=1;
- A8=0;
-
- P00=wei_1[w2+1];
- A9=1;
- A9=0;
- P00=table[shi2];
- A8=1;
- A8=0;
- delay_ms(10);
- P00=0;
- A9=1;
- A9=0;
- A8=1;
- A8=0;
-
- P00=wei_1[w2+2];
- A9=1;
- A9=0;
- P00=table[ge2];
- A8=1;
- A8=0;
- delay_ms(10);
- P00=0;
- A9=1;
- A9=0;
- A8=1;
- A8=0;
- }
- /*
- 鍵盤輸入函數
- */
- void key(){
- static uchar key_new = 0, key_l,temp;
- key_status = 0;
- P1 = 0x0f;
- if((P1 & 0x0f) != 0x0f)
- {
- delay_ms(1);
- if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
- {
- key_new = 0;
- /*
- 矩陣鍵盤掃描
- */
- key_l = (P1 | 0xf0);
- P1 = key_l;
- switch(P1)
- {
- /*
- 開始計時/比賽繼續
- */
- case 0x7e:
- TR0=1;
- rule_flag=1;
- time_display(6,rule_time);
- break;
- /*
- 暫停比賽
- */
- case 0x7d:
- TR0=0;
- break;
-
- /*
- 加分,同時24秒清零和總計時器停止計時
- */
- case 0xee:
- TR0=0;
- scoreA +=3;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xed:
- TR0=0;
- scoreA +=2;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xeb:
- TR0=0;
- scoreA +=1;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xde:
- TR0=0;
- scoreB +=3;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xdd:
- TR0=0;
- scoreB +=2;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xdb:
- TR0=0;
- scoreB +=1;
- rule_time=24;
- rule_flag=0;
- break;
- /*
- 增加比賽節數,同時24秒復位和總計時器復位
- */
- case 0xbd:
- match++;
- minute=12;
- second=0;
- TR0=0;
- rule_time=24;
- rule_flag=0;
- break;
- /*
- 手動24秒復位
- */
- case 0xbe:
- if(TR0==1){
- rule_time=0;
- rule_flag=0;
- }else{
- rule_flag=0;
- }
- break;
- }
- }
- }
- else
- {
- key_new = 1;
- }
- }
- void main()
- {
- IO_init();
- time_init();
- while(1){
- key();
-
- if(second==0){
- /*
- 判斷某節比賽是否結束
- */
- if(minute==0){
- /*
- 判斷是否為最后一節比賽
- */
- if(match<4){
- /*
- 計時系統恢復為默認值,比賽節數加一
- */
- second=60;
- minute=11;
- match++;
- rule_time=24;
- rule_flag=0;
- }
- TR0=0;
- }
- /*
- 比賽分鐘數減一
- */
- else {
- second=60;
- minute--;
- }
- }
- /*
- 24秒結束,計時器暫停和24秒復位
- */
- if(rule_time<=0){
- TR0=0;
- rule_time=24;
- }
-
- /*
- 顯示
- */
- time_display(0,minute);
- time_display(2,second);
- time_display(4,match);
- time_display(6,rule_time);
- score_dispaly(1,scoreA);
- score_dispaly(5,scoreB);
- }
- }
復制代碼
|