- * 標題: 三路搶答器 *
- *
- * *
- * 實驗說明:在10s的時間內,三位選手進行按鍵搶答,如果1號搶答,那么數碼管將顯示*
- 1號選手的號碼。并且蜂鳴器響,以此類推。如果10s時間到,蜂鳴器響,選手
- 無法進行搶答 *
- #include <reg52.h>
- //IO口定義
- #define GPIO_DIG P0
- #define GPIO_SHOW P2
- sbit LSA=P3^0;
- sbit beep=P1^5;
- sbit K1=P3^1;
- sbit K2=P1^0;
- sbit K3=P1^1;
- sbit K4=P1^2;
- //--定義全局變量--//
- typedef unsigned int u16;
- unsigned char code DIG_CODE[18]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
- unsigned int Ge=0;
- unsigned int Shi=1;
- unsigned int num=0;
- unsigned int Res=10;
- unsigned int flag=0;
- //全局函數
- void DigDisplay();
- void delay(u16 i)
- {
- while(i--);
- }
- void main()
- {
- TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0x0B0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- DigDisplay();
- }
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
- while(1)
- {
- for(i=0;i<2;i++)
- {
- switch(i) //位選,選擇點亮的數碼管,
- {
- case(0):
- LSA=0;
- GPIO_DIG=DIG_CODE[Shi];//發送段碼
- break;//顯示第0位
- case(1):
- LSA=1;
- GPIO_DIG=DIG_CODE[Ge];//發送段碼
- break;//顯示第1位
- }
-
- /****************************************************************************/
- /*消隱函數要在數碼管更新頻率很快的條件下,才起作用,手動更換數碼管位選完全達不到這么快的速度,因此在這種情況下也是沒必要用消隱的 */
- j=10; //掃描間隔時間設定
- while(j--);
- GPIO_DIG=0x00;//消隱
- }
- if(K1==0)
- {
- Res=10;
- flag=0;
- }
- else if(K2==0)
- {
- GPIO_SHOW=~DIG_CODE[1];
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- GPIO_SHOW=~DIG_CODE[17];
- break;
- }
- }
- }
- else if(K3==0)
- {
- GPIO_SHOW=~DIG_CODE[2];
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- GPIO_SHOW=~DIG_CODE[17];
- break;
- }
- }
- }
- else if(K4==0)
- {
- GPIO_SHOW=~DIG_CODE[3];
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- GPIO_SHOW=~DIG_CODE[17];
- break;
- }
- }
- }
- }
- }
- void Int1() interrupt 1
- {
- TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0x0B0;
- num++;
- if(num==20)
- {
- num=0;
- flag++;
- Res--;
- Ge=Res%10;
- Shi=Res/10;
- }
-
- if(flag==10)
- {
- while(1)
- {
- beep=~beep;
- delay(10);
- if(K1==0)
- {
- Res=10;
- flag=0;
- break;
- }
- }
- }
- }
復制代碼
|