|
單片機新手來看看我做的課程設計, 籃球計時計分系統的proteus仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (36.88 KB, 下載次數: 120)
下載附件
2017-5-17 18:40 上傳
0.png (66.76 KB, 下載次數: 116)
下載附件
2017-5-17 18:39 上傳
0.png (33.16 KB, 下載次數: 117)
下載附件
2017-5-17 18:40 上傳
單片機籃球計時計分器源程序如下:
- /******************************************************************
- ***************************籃球計時計分系統************************
- *************************本系統滿足以下幾點要求********************
- *1、能設置整個賽程的比賽時間,在比賽過程中能根據需要暫停和開始計時*
- *2、能根據比賽情況刷新比賽雙方的比分*******************************
- *3、中場交換比賽場地時,能交換A、B兩隊比分的位置*******************
- *4、比賽結束時,能發出報警聲***************************************
- ******************************************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code HC595_ScanDATE[]= //定義數碼管位數組
- {
- 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
- };
- unsigned char code LED_DATE [] = //定義數碼管段數組
- {
- 0XC0, // 0
- 0XF9, // 1
- 0XA4, // 2
- 0XB0, // 3
- 0X99, // 4
- 0X92, // 5
- 0X82, // 6
- 0XF8, // 7
- 0X80, // 8
- 0X90 // 9
- };
- sbit DS =P2^0; //74HC595各I/O口定義
- sbit SHCP =P2^1;
- sbit STCP =P2^2;
- sbit S2 =P3^2; //賽前設定比賽時間按鍵
- sbit S3 =P1^0; //加1分按鍵
- sbit S4 =P1^1; //加2分按鍵
- sbit S5 =P1^2; //減1分按鍵
- sbit S6 =P1^3; //半場換分按鍵
- sbit S7 =P1^4; //停止蜂鳴器按鍵
- sbit S8 =P1^5; //開始按鍵
- sbit S9 =P1^6; //暫停/繼續按鍵
- sbit S10 =P1^7; //加分減分隊伍選擇按鍵
- sbit LED2 =P3^5; //A隊指示燈
- sbit LED3 =P3^6; //B隊指示燈
- sbit BUZZ =P3^7;
- bit Flag_Score=0; //加分減分隊伍選擇標志位
- void Display();
- void HC595(uchar a);
- void Delay_MS(uint ms);
- void KEY();
- void Init();
- uint time=1200; //初始時間20分鐘
- uchar A_Score=0; //A隊得分
- uchar B_Score=0; //B隊得分
- uchar Time_bit=0; //用于定時器溢出標志
- void main()
- {
- Init();
- while(1)
- {
- Display();
- KEY();
- }
- }
- void Init() //初始化函數
- {
- LED2=0;
- TMOD=0x01; //定時器0 第一種工作方式
- TH0=(65536-50000)/256; //裝初值,定時50ms
- TL0=(65536-50000)%256;
- EA=1; //開總中斷
- ET0=1; //打開定時器0
- }
- void Timer() interrupt 1 //定時器函數,時間處理
- {
- Time_bit++;
- if(Time_bit==20) //溢出20次,定時1秒
- {
- Time_bit=0;
- if(time==0) //當比賽結束時,停止計時,并發出警報
- {
- BUZZ=0;
- //time=0;
- TR0=0;
- }
- else
- time--;
- }
- TH0=(65536-50000)/256; //重裝初值,定時50ms
- TL0=(65536-50000)%256;
- }
- void KEY()
- {
- uchar Transposition_Scores=0; //半場換分使用的緩存數據變量
- if(S2==0) //比賽時間設定,按一次加5分鐘
- {
- Delay_MS(1000);
- if(S2==0)
- {
- while(!S2);
- if(TR0==0) //判斷是否開始,以免已經開始有誤按
- {
- time=time+300;
- if(time>2700) //如果時間超過45分鐘,重新賦值20分鐘
- time=1200;
- }
- }
- }
- if(S3==0) //加1分按鍵
- {
- Delay_MS(1000);
- if(S3==0)
- {
- if(TR0==1) //判斷是否開始,以免還未開始有誤按
- {
- while(!S3);
- if(Flag_Score==0)
- A_Score++;
- else
- B_Score++;
- }
- }
- }
- if(S4==0) //加2分按鍵
- {
- if(TR0==1) //判斷是否開始,以免還未開始有誤按
- {
- Delay_MS(1000);
- if(S4==0)
- {
- while(!S4);
- if(Flag_Score==0)
- A_Score=A_Score+2;
- else
- B_Score=B_Score+2;
- }
- }
- }
- if(S5==0) //減1分按鍵
- {
- if(TR0==1) //判斷是否開始,以免還未開始有誤按
- {
- Delay_MS(1000);
- if(S5==0)
- {
- while(!S5);
- if(Flag_Score==0)
- {
- if(A_Score==0) //防止分數是0時亂碼
- A_Score=0;
- else
- A_Score--;
- }
- else
- {
- if(B_Score==0) //防止分數是0時亂碼
- B_Score=0;
- else
- B_Score--;
- }
- }
- }
- }
-
- if(S6==0) //半場換分
- {
- Delay_MS(1000);
- if(S6==0)
- {
- while(!S6);
- Transposition_Scores=A_Score; //A隊的得分先賦給緩存變量
- A_Score=B_Score; //將B隊的得分賦給A隊
- B_Score=Transposition_Scores; //再把緩存變量的值(也就是原先A隊的得分)賦給B隊
- }
- }
-
- if(S7==0) //停蜂鳴器
- {
- Delay_MS(1000);
- if(S7==0)
- {
- while(!S7);
- BUZZ=1;
- }
- }
- if(S8==0) //開始
- {
- Delay_MS(1000);
- if(S8==0)
- {
- while(!S8);
- if(time==0)
- time=1200; //一輪比賽結束后重新給時間賦值
- TR0=1; //定時器開始工作
- }
- }
- if(S9==0) //暫停繼續
- {
- Delay_MS(1000);
- if(S9==0)
- {
- while(!S9);
- TR0=~TR0; //定時器暫停/繼續工作
- }
- }
- if(S10==0) //切換加分減分隊伍
- {
- Delay_MS(1000);
- if(S10==0)
- {
- while(!S10);
- Flag_Score=~Flag_Score;
- if(Flag_Score==0)
- {
- LED2=0;
- LED3=1;
- }
- else
- {
- LED2=1;
- LED3=0;
- }
- }
- }
-
-
- }
- void Display() //顯示函數
- {
- P0=LED_DATE[time/1000]; //得出時間千位
- HC595(HC595_ScanDATE[0]);
- Delay_MS(500);
- P0=0xff; //消隱
- P0=LED_DATE[time%1000/100]; //得出時間百位
- HC595(HC595_ScanDATE[1]);
- Delay_MS(500);
- P0=0xff; //消隱
- P0=LED_DATE[time%100/10]; //得出時間十位
- HC595(HC595_ScanDATE[2]);
- Delay_MS(500);
- P0=0xff; //消隱
- P0=LED_DATE[time%10]; //得出時間最個位
- HC595(HC595_ScanDATE[3]);
- Delay_MS(500);
- P0=0xff; //消隱
- P0=LED_DATE[A_Score/10]; //得出A隊得分十位
- HC595(HC595_ScanDATE[4]);
- Delay_MS(500);
- P0=0xff; //消隱
- P0=LED_DATE[A_Score%10]; //得出A隊得分個位
- HC595(HC595_ScanDATE[5]);
- Delay_MS(500);
- P0=0xff; //消隱
- P0=LED_DATE[B_Score/10]; //得出B隊得分十位
- HC595(HC595_ScanDATE[6]);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載(帶仿真圖與源碼):
籃球計分系統.zip
(104.14 KB, 下載次數: 165)
2017-5-17 17:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|