- /**************************************************************************************
- 籃球記分器的設(shè)計(jì)
- /AT89C51單片機(jī)、數(shù)碼管若干、38譯碼器、矩陣按鍵、蜂鳴器
- ***************************************************************************************/
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char u8;
- sbit LSA=P2^0; //38譯碼器控制
- sbit LSB=P2^1;
- sbit LSC=P2^2;
- sbit LSD=P2^3; //蜂鳴器觸發(fā)口
- sbit F1=P2^4; //倒計(jì)時(shí)數(shù)碼管控制口
- sbit F2=P2^5;
- sbit S1=P2^6;
- sbit S2=P2^7;
- u8 KeyValue; //用來存放讀取到的鍵值
- u8 feng; //蜂鳴器
- #define GPIO_DIG P0 //計(jì)分?jǐn)?shù)碼管輸出口
- #define GPIO_KEY P1 //矩陣按鍵輸入口
- #define GPIO_TIME P3 //倒計(jì)時(shí)數(shù)碼管輸出口
- u8 code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~9的值
- unsigned char Show[8]={ 0,0,0,0,0,0,0,0,}; //數(shù)組存放向數(shù)碼管輸入的數(shù)
- unsigned char TShow[4]={ 0,0,0,0,};
- u16 Ascore,Bscore,Change; //分?jǐn)?shù)
- u8 Period; //節(jié)數(shù)
- u8 m=12,n,c; //定時(shí)器變量
- /*******************************************************************************
- * 函 數(shù) 名 : delay
- * 函數(shù)功能 : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : KeyDown
- * 函數(shù)功能 : 檢測(cè)有按鍵按下并讀取鍵值
- *******************************************************************************/
- void KeyDown(void)
- {
- char a=0;
- GPIO_KEY=0x0f;
- KeyValue=20; //初始值
-
- if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
- {
- delay(100);//延時(shí)10ms進(jìn)行消抖
- if(GPIO_KEY!=0x0f)//再次檢測(cè)鍵盤是否按下
- {
- //測(cè)試列
- GPIO_KEY=0X0F;
- switch(GPIO_KEY)
- {
- case(0X0E): KeyValue=0;break;
- case(0X0D): KeyValue=4;break;
- case(0X0B): KeyValue=8;break;
- case(0X07): KeyValue=12;break;
- }
- //測(cè)試行
- GPIO_KEY=0XF0;
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0XB0): KeyValue=KeyValue+1;break;
- case(0XD0): KeyValue=KeyValue+2;break;
- case(0XE0): KeyValue=KeyValue+3;break;
- }
- while((a<500)&&(GPIO_KEY!=0xf0)) //檢測(cè)按鍵松手檢測(cè)
- {
- delay(1000);
- a++;
- }
- }
- }
- }
- /**********************************************************************
- *函 數(shù) 名 : Score
- *函數(shù)功能 : 加分程序,按鍵執(zhí)行程序
- *************************************************************************/
- void Score()
- {
- if(KeyValue!=20)
- switch(KeyValue)//A隊(duì)的計(jì)分
- {
- case(0): Ascore=Ascore+1;KeyValue=20;break;
- case(1): Ascore=Ascore+2;KeyValue=20;break;
- case(2): Ascore=Ascore+3;KeyValue=20;break;
- case(3): Ascore=Ascore-1;KeyValue=20;break;
- }
- switch(KeyValue)//B隊(duì)的計(jì)分
- {
- case(4): Bscore=Bscore+1;KeyValue=20;break;
- case(5): Bscore=Bscore+2;KeyValue=20;break;
- case(6): Bscore=Bscore+3;KeyValue=20;break;
- case(7): Bscore=Bscore-1;KeyValue=20;break;
- }
- switch(KeyValue)
- {
- case(8): Period=Period+1;KeyValue=20;break; //每一節(jié)加一
- case(9): Period=Period-1;KeyValue=20;break; //減一//
- case(10): Change=Ascore;Ascore=Bscore;Bscore=Change;break; //交換場(chǎng)地
- case(11): Ascore=0; Bscore=0;Period=0;KeyValue=20;break; //計(jì)分板復(fù)位
- case(12): TR0 = 1; m=12; n=0; KeyValue=20;break; //定時(shí)50ms,20*50=1000msbreak;
- case(13): TR0 = 1; break; //繼續(xù)比賽
- case(14): feng=1;TR0 = 0; KeyValue=20;break; //暫停比賽
- case(15): feng=0; KeyValue=20;break; //關(guān)閉蜂鳴器
- }
- }
- /************************************************************
- *函 數(shù) 名 : fengMQ
- *函數(shù)功能 : 蜂鳴器觸發(fā)程序
- **************************************************************/
- void fengMQ(void)
- {
- if(feng==1)
- {
- LSD=~LSD;
- }
- }
- /******************************************************************
- *函 數(shù) 名 : Conut
- *函數(shù)功能 : 分離開送給數(shù)碼管的數(shù)字
- *******************************************************************/
- void Conut(void)
- {
- Show[0]=Period%10;
- Show[1]=Ascore/100;
- Show[2]=Ascore/10%10;
- Show[3]=Ascore%10;
-
- Show[4]=0;
- Show[5]=Bscore/100;
- Show[6]=Bscore/10%10;
- Show[7]=Bscore%10;
-
- TShow[0]=m/10;
- TShow[1]=m%10;
- TShow[2]=n/10;
- TShow[3]=n%10;
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : DigDisplay
- * 函數(shù)功能 : 數(shù)碼管動(dòng)態(tài)掃描函數(shù),循環(huán)掃描8個(gè)數(shù)碼管顯示
- *******************************************************************************/
- void DigDisplay()
- {
- u8 i,w;
- for(i=0;i<8;i++)
- {
- switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,比分顯示
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
- }
- GPIO_DIG = DIG_CODE[Show[i]];//發(fā)送段碼
- delay(10); //間隔一段時(shí)間掃描
- P0=0x00;//消隱
- }
- for(w=0;w<4;w++) //倒計(jì)時(shí)顯示
- {
- switch(w) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- F1=0;F2=1;S1=1;S2=1; break;//顯示第1位
- case(1):
- F1=1;F2=0;S1=1;S2=1; break;//顯示第2位
- case(2):
- F1=1;F2=1;S1=0;S2=1; break;//顯示第3位
- case(3):
- F1=1;F2=1;S1=1;S2=0; break;//顯示第4位
- }
- GPIO_TIME = DIG_CODE[TShow[w]];
- delay(10); //間隔一段時(shí)間掃描
- P3=0x00; //消隱
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Timer0Init
- * 函數(shù)功能 : 配置定時(shí)器0,定時(shí)50ms
- *******************************************************************************/
- void Timer0Init()
- {
- TMOD |= 0x01; //選擇工作方式1
- TH0 = 0x3C; //設(shè)置初始值,定時(shí)50MS
- TL0 = 0xB0;
- EA = 1; //打開總中斷
- ET0 = 1; //打開定時(shí)器0中斷
- // TR0 = 1; //啟動(dòng)定時(shí)器0
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- *******************************************************************************/
- void main()
- {
- Timer0Init();
- while(1)
- {
- KeyDown();
- Score();
- Conut(); //分離出數(shù)
- fengMQ(); //*蜂鳴器
- DigDisplay(); //數(shù)碼管顯示函數(shù)
- }
- }
- void Timer0() interrupt 1 //中斷程序
- {
- static u16 q; //定義變量q,1s=50ms*20
- TH0 = 0x3C; //設(shè)置初始值,定時(shí)50MS
- TL0 = 0xB0;
- q++;
- if(q==20) //計(jì)時(shí)20次時(shí)為1秒
- {
- q=0; //變量q置零
- if(n==0) //當(dāng)?shù)褂?jì)時(shí)秒針為0時(shí),分針減一,秒針為59
- {
- n=60;
- m=m-1;
- }
- n=n-1; //每秒減一
- }
- if(m==0&&n==0) //一節(jié)結(jié)束定時(shí)器停止,時(shí)間重置12:00;
- {
- TR0 =0;
- }
- }
復(fù)制代碼
正在重新握手 ... 成功 [0.594"]
當(dāng)前的波特率: 115200
正在擦除目標(biāo)區(qū)域 ... 完成 ! [0.313"]
芯片出廠序列號(hào) : F002C4B208E7AE
正在下載用戶代碼 ... 完成 ! [0.875"]
正在設(shè)置硬件選項(xiàng) ... 完成 ! [0.015"]
更新后的硬件選項(xiàng)為:
. 當(dāng)前的時(shí)鐘頻率: 11.088MHz
. 系統(tǒng)頻率為12T(單倍速)模式
. 振蕩器的放大增益不降低
. 當(dāng)看門狗啟動(dòng)后,任何復(fù)位都可停止看門狗
. MCU內(nèi)部的擴(kuò)展RAM可用
. ALE腳的功能選擇仍然為ALE功能腳
. P1.0和P1.1與下次下載無關(guān)
. 下次下載用戶程序時(shí),不擦除用戶EEPROM區(qū)
單片機(jī)型號(hào): STC89C52RC/LE52RC
固件版本號(hào): 6.6.4C
操作成功 !
|