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