一个简单实用的抢答器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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)
|