|
時間有限,用數(shù)碼管顯示8路搶答
用定時器進行8路掃描,間隔可以調(diào)十分小
此外,具有設(shè)置時間的功能(搶答和答題時間)
8路搶答器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (17.9 KB, 下載次數(shù): 42)
下載附件
2019-1-12 03:18 上傳
0.png (7.81 KB, 下載次數(shù): 56)
下載附件
2019-1-12 03:19 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- void Setsecond();//搶答器答題和搶答時間的設(shè)置函數(shù)聲明
- void delay(int k); //延時函數(shù)聲明
- //數(shù)碼管選管位
- sbit Sel1=P2^0;
- sbit Sel2=P2^1;
- sbit Sel3=P2^2;
- sbit Sel4=P2^3;
- sbit Sel5=P2^4;
- sbit Sel6=P2^5;
- //搶答器的狀態(tài)指示燈
- sbit led=P2^6; //顯示復(fù)位和設(shè)置時間的狀態(tài)
- sbit Led1=P3^1; //搶答失敗時,該燈會一直閃爍
- sbit Led2=P3^2; //答題完畢時,該燈會一直閃爍
- //搶答器初始化搶答和答題時間按鍵
- sbit Set1=P3^3; //設(shè)置搶答時間,+
- sbit Set2=P3^4; //設(shè)置搶答時間,-
- sbit Set3=P3^5; //設(shè)置答題時間,+
- sbit Set4=P3^6; //設(shè)置答題時間,-
- sbit RST=P2^7; //搶答器的復(fù)位按鍵
- sbit EN=P3^0; //搶答器使能和設(shè)置搶答和答題時間按鍵
- unsigned char Tshu1=11,Tshu2=31,shu1=11,shu2=31,shu;//搶答器搶答時間和答題時間的相關(guān)變量
- unsigned char count0=0,count1=0,roberflag=0,scond1=0,second2=0,robernum=0;//搶答者的相關(guān)變量
- unsigned char Shuma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管段碼值
- bit Enflag=0; //搶答器使能的工作標(biāo)志變量,0表示正常工作,1表示設(shè)置時間(搶答和答題)
- void main() //主函數(shù)
- {
- unsigned char n=0;
- TMOD=0x11;Led1=0;Led2=0;
- TH0=(2^16-50000)/2^8;TL0=(2^16-50000)%2^8;
- TH1=(2^16-50000)/2^8;TL1=(2^16-50000)%2^8;
- TR0=1;ET0=1;TR1=1;ET1=1;EA=1;
- while(1)
- {
- for(n=0;n<6;n++) //這個循環(huán),實現(xiàn)數(shù)碼管的動態(tài)顯示
- {
- switch(n)
- {
- case 0:Sel1=1,Sel2=0,Sel3=0,Sel4=0,Sel5=0,Sel6=0;
- if(Enflag == 0)
- P0=~Shuma[shu/10];
- else
- P0=~Shuma[shu1/10];break;
- case 1:Sel1=0,Sel2=1,Sel3=0,Sel4=0,Sel5=0,Sel6=0;
- if(Enflag == 0)
- P0=~Shuma[shu%10];
- else
- P0=~Shuma[shu1%10];break;
- case 2:Sel1=0,Sel2=0,Sel3=1,Sel4=0,Sel5=0,Sel6=0;P0=0xBF;break;
- case 3:Sel1=0,Sel2=0,Sel3=0,Sel4=1,Sel5=0,Sel6=0;P0=0xBF;break;
- case 4:Sel1=0,Sel2=0,Sel3=0,Sel4=0,Sel5=1,Sel6=0;
- if(Enflag == 0)
- P0=~Shuma[robernum/10];
- else
- P0=~Shuma[shu2/10];break;
- case 5:Sel1=0,Sel2=0,Sel3=0,Sel4=0,Sel5=0,Sel6=1;
- if(Enflag == 0)
- P0=~Shuma[robernum%10];
- else
- P0=~Shuma[shu2%10];break;
- }
- delay(20);
- P0=0xff;
- }
- }
- }
- void delay(int k) //延時函數(shù),主要是為了數(shù)碼管的動態(tài)顯示
- {
- while(k--);
- }
- void Timer0() interrupt 1 //定時器0,主要用于各種按鍵的掃描,每200ms一次
- {
- TH0=(2^16-50000)/2^8;TL0=(2^16-50000)%2^8;
- count0++;
- P1=0x00;
- if(count0 == 5)
- {
- count0=0;
- Setsecond(); //調(diào)用設(shè)置時間函數(shù),檢測是否有設(shè)置時間的動作
- if(RST == 0) //檢測是否有復(fù)位動作,有動作,則實現(xiàn)部分變量初始化值
- {
- roberflag=0;
- robernum=0;shu=0;
- led=~led;Led1=0;Led2=0;
- shu1=Tshu1;shu2=Tshu2;
- }
- if(EN == 0)
- {
- Enflag=~Enflag;
- led=~led;Led1=0;Led2=0;
- }
- if(Enflag == 0) //正常工作時候的,搶答人號碼的識別和顯示(同時判斷8口,不準(zhǔn)次掃描,無優(yōu)先級)
- {
- if(P1 != 0x00)
- {
- if(roberflag == 0) //只有在搶答時間才能搶答,roberflag=0表示搶答,1答題,2搶答失敗,3答題完畢
- {
- roberflag++;
- switch(P1)
- {
- case 0x01:robernum=1;break;
- case 0x02:robernum=2;break;
- case 0x04:robernum=3;break;
- case 0x08:robernum=4;break;
- case 0x10:robernum=5;break;
- case 0x20:robernum=6;break;
- case 0x40:robernum=7;break;
- case 0x80:robernum=8;break;
- default:break;
- }
- }
- }
- }
- }
- }
- void Timer1() interrupt 3 //定時器1主要是用于工作時的數(shù)碼顯示,跑表,1一秒刷新一次
- {
- TH1=(2^16-50000)/2^8;TL1=(2^16-50000)%2^8;
- if(roberflag == 2)
- Led1=~Led1;
- if(roberflag == 3)
- Led2=~Led2;
- count1++;
- if(count1 == 20) //正常工作時候的跑表
- {
- if(Enflag == 0)
- {
- if(roberflag == 0) //搶答時間的跑表
- {
- shu1--;
- shu = shu1;
- }
- if(roberflag == 1) //答題時間的跑表
- {
- shu2--;
- shu = shu2;
- }
- if(shu1 == 0)
- roberflag=2;
- if(shu2 == 0)
- roberflag=3;
- }
- count1=0;
- }
- }
- void Setsecond() //搶答時間和答題時間設(shè)置函數(shù),也是被T0調(diào)用,實現(xiàn)設(shè)置時間功效。
- {
- if(Enflag == 1)
- {
-
- if( Set1 == 0)
- {
- Tshu1++;
- }
- if(Set2 == 0)
- {
- Tshu1--;
- }
- if(Set3 == 0)
- {
- Tshu2++;
- }
- if(Set4 == 0)
- {
- Tshu2--;
- }
- shu1=Tshu1; //Tshu1,Tshu2的出現(xiàn)是為了實現(xiàn)設(shè)置的搶答和答題時間具有存儲功能,不隨跑表而發(fā)生變化
- shu2=Tshu2;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
RoberAck.rar
(18.17 KB, 下載次數(shù): 131)
2019-1-11 19:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|