設計要求 1、一位主持人和3位搶答者,復位后,甲乙丙的綠、紅燈全亮,開始鍵、復位鍵的指示燈全暗;主持人按復位鍵則僅復位指示燈亮,其他都暗,準備開始;主持人按開始鍵,開始燈亮,允許甲乙丙搶答,此時優先者則相應成功指示燈亮,如允許前搶就相應犯規燈亮;答題開始進行倒計時,到規定時間不允許答題,并返回復位狀態。 2、具有搶答控制和倒計時顯示功能。 3、控制器應有復位控制、開始控制、搶答控制和狀態指示等功能,并有答題時間控制和顯示功能。
單片機源程序如下:
- #include"reg51.h" //包括一個51標準內核的頭文件
- #include "ABSACC.H" //庫函數
- #define a8255_PA XBYTE[0xD1FF] /*PA口地址*/
- #define a8255_PB XBYTE[0xD2FF] /*PB口地址*/
- #define a8255_PC XBYTE[0xD5FF] /*PC口地址*/
- #define a8255_CON XBYTE[0xD7FF] /*控制字地址*/
- unsigned char Timer_Count=0; //定義變量
- unsigned char second=9;
- unsigned char light;
- unsigned char const num_table[16]={
- 0xA0, /*0*/
- 0xBB, /*1*/
- 0x62, /*2*/
- 0x2A, /*3 */
- 0x39, /*4*/
- 0x2C, /*5 */
- 0x24, /*6*/
- 0xBA, /*7*/
- 0x20, /*8*/
- 0x28, /*9 */
- 0x30, /*A*/
- 0x25, /*B*/
- 0xE4, /*C*/
- 0x23, /*D*/
- 0x64, /*E*/
- 0x74, /*F */
- };
- void Timer1_Init(void); //函數聲明
- void GInt_Init(void);
- void delay (unsigned int x) ;
- void display (unsigned char place, unsigned char number) ;
- unsigned char keyboard();
- main() // 主程序
- {unsigned char flag=0;
- light=0xc0;
- Timer1_Init();定時器工作模式設定及初始化
- while(1) //主程序循環
- { GInt_Init(); //函數調用(打開中斷及相應的設定)
- P1=light;
- display(6,second);
- if(second==0)
- {second=0x09;
- TR1=0;
- light=0x7f;
- }
- flag=keyboard();
- if(light==0x3f)
- { switch(flag)
- {case 1: light= 0xfd,TR1=1; break;
- case 2: light= 0xf7, TR1=1 ; break;
- case 3:light=0xdf, TR1=1; break;
- default : light =0x3f;}
- }
- if(light==0x7f)
- { switch(flag)
- {case 1: light=0xfe; break;
- case 2:light=0xfb; break;
- case 3:light= 0xef; break;
- default : light =0x7f; }
- }
- }
- }
- void GInt_Init(void) //打開中斷及相應的設定
- { EA = 1;
- EX0 = 1;
- IT0 = 1;
- EX1= 1;
- IT1 = 1;
- ET1=1;
- }
- void ISR_Ex0(void) interrupt 0 //外中斷0
- { light=0x7f;}
- void ISR_Ex1(void) interrupt 2 //外中斷1
- { light&=0xbf;}
- void Timer1_Init(void) // 定時器工作模式設定及初始化
- { TMOD=0x10;
- TH1=(65535-50000 )/256;
- TL1=(65535-50000)%256;
- }
- void ISR_Timer1(void) interrupt 3 //1秒時間的設定
- {Timer_Count++;
- if(Timer_Count == 20)
- {Timer_Count = 0;
- second--; }
- Timer1_Init(); }
- void delay(unsigned int x) //延時
- {unsigned char i,j,k;
- while(x--)
- { for(i=0;i<=5;i++)
- for(j=0;j<=10;j++)
- ; }
- }
- void display(unsigned char place, unsigned char number) //顯示
- { a8255_CON=0x89;
- a8255_PA =0xff;
- a8255_PB=0xff;
- a8255_PA=~(0x01<<(place-1));
- a8255_PB=num_table[number];
- }
- unsigned char keyboard() //鍵盤
- { unsigned char PC_data;
- unsigned char j;
- unsigned char y=0;
- a8255_CON=0x89;
- a8255_PA=0xf1;
- a8255_PB=0xff;
- delay(1);
- PC_data=a8255_PC;
- for(j = 0;j<4;j++)
- { if((PC_data&(1<<j)) == (1<<j))
- y= j+1; }
- return(y) ; }
復制代碼
完整的Word格式文檔51黑下載地址:
#51單片機三路搶答器.doc
(207.5 KB, 下載次數: 22)
2019-12-26 19:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|