一個簡單實用的搶答器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ拼音截圖20180101110707.png (180.55 KB, 下載次數: 73)
下載附件
2018-1-1 11:07 上傳
0.png (14.41 KB, 下載次數: 87)
下載附件
2018-1-2 02:56 上傳
單片機源程序如下:
- #include <pic.h>
- __CONFIG(XT&WDTDIS);
- #define TIMER1 (65536-2000)
- unsigned char LED1=0;
- unsigned char LED2=0;
- unsigned char LED3=0;
- unsigned char LED4=0;
- unsigned char LED_L=0;
- unsigned int time=0;
- const unsigned char table[11]=
- {
- 0x3f, //0
- 0x06, //1
- 0x5b, //2
- 0x4f, //3
- 0x66, //4
- 0x6d, //5
- 0x7d, //6
- 0x07, //7
- 0x7f, //8
- 0x6f, //9
- 0x00,
- };
- void timer1init(void)//初始化
- {
- T1CON=0X01; //打開定時器1
- TMR1IF=0; //清除TMR1中斷標志
- TMR1IE=1; //TMR1中斷允許
- TMR1H=TIMER1>>8; //賦初值,以便TMR1每2MS左右中斷一次
- TMR1L=TIMER1;
- PIR1=0; //清除所有中斷標志
- PEIE=1; //允許外圍總中斷 INTCON寄存器
- GIE=1; //總中斷開關打開 INTCON寄存器
-
- }
- void interrupt T1(void)//中斷處理
- {
- if(TMR1IF==1)//如果是定時器1中斷
- {
- time++;//利用time的值來判斷時間
- TMR1IF=0;//清除定時器1中斷標志
- TMR1H=TIMER1>>8;//重新復初值
- TMR1L=TIMER1;
- switch(LED_L)
- {
- case 0://點亮第一個數碼管
- RE2=1;
- RE1=0;
- RE0=0;
- RA5=table[LED1];
- PORTB = table[LED1];
- LED_L = 1;
- break;
- case 1://點亮第二個數碼管
- RE2=0;
- RE1=1;
- RE0=0;
- RA5=table[LED2];
- PORTB = table[LED2];
- LED_L = 2;
- break;
- case 2:
- RE2=1;
- RE1=1;
- RE0=0;
- RA5=table[LED3];
- PORTB = table[LED3];
- LED_L = 3;
- break;
- case 3:
- RE2=0;
- RE1=0;
- RE0=1;
- RA5=table[LED4];
- PORTB = table[LED4];
- LED_L = 0;
- break;
- default://語句d
- LED_L = 0;
- break;
- }
- }
- }
- delay(unsigned int n);
- void port_set();
- void ready();
- void check();
- void reset();
- main() //主函數開始
- {
- port_set();
- while(1)
- {
- RD7=1;
- ready();
- RD7=0;
- delay(5);
- check();
- reset();
- }
- } //主函數結束
- void port_set()//端口設置
- {
- int a=1,b=0;
- ADCON1=0X06;//初始化
- TRISA5=0;
- TRISA1=0;
- TRISB=0;
- TRISE=0;
- TRISD=0X01;
- PORTD=0XF0;
- timer1init();//定時器1初始化
- RA1=1;//使能138譯碼器
- LED1=0;//數碼管1顯示
- LED2=0;
- LED3=0;
- LED4=0;
- }
- void ready()//準備函數
- {
- if(RD0==1)
- {
- delay(10);
- if(RD0==1)
- {
- RD6=0;
- RD5=0;
- RD4=0;
- LED4=8;
- LED1=8;
- LED2=8;
- LED3=8;
- }
- while(RD0==1);
- }
- }
- void check()//校對函數,查看搶答成功
- {
- if(LED4==8)
- {
- RD4=1;
- if(RD0==1)
- {
- delay(10);
- if(RD0==1)
- {
- LED1=1;
- LED4=1;
- LED2=8;
- LED3=8;
- }
- while(RD0==1);
- }
- RD4=0;
- delay(1);
- RD5=1;
- if(RD0==1)
- {
- delay(10);
- if(RD0==1)
- {
- LED2=2;
- LED4=2;
- LED1=8;
- LED3=8;
- }
- while(RD0==1);
- }
- RD5=0;
- delay(1);
- RD6=1;
- if(RD0==1)
- {
- delay(10);
- if(RD0==1)
- {
- LED3=3;
- LED4=3;
- LED1=8;
- LED2=8;
- }
- while(RD0==1);
- }
- RD6=0;
- }
- }
- void reset()//當一輪搶答結束后,長按1s后復位
- {
- if(LED4==1|LED4==2|LED4==3)
- {
- RD7=1;
- while(RD7=1)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
qiangdaqi.rar
(139.81 KB, 下載次數: 8)
2018-1-1 11:09 上傳
點擊文件名下載附件
搶答器 下載積分: 黑幣 -5
|