时间有限,用数码管显示8路抢答
用定时器进行8路扫描,间隔可以调十分小
此外,具有设置时间的功能(抢答和答题时间)
8路抢答器仿真原理图如下
单片机源程序如下:
#include #include void Setsecond();//抢答器答题和抢答时间的设置函数声明 void delay(int k); //延时函数声明 //数码管选管位 sbit Sel1=P2^0; sbit Sel2=P2^1; sbit Sel3=P2^2; sbit Sel4=P2^3; sbit Sel5=P2^4; sbit Sel6=P2^5; //抢答器的状态指示灯 sbit led=P2^6; //显示复位和设置时间的状态 sbit Led1=P3^1; //抢答失败时,该灯会一直闪烁 sbit Led2=P3^2; //答题完毕时,该灯会一直闪烁 //抢答器初始化抢答和答题时间按键 sbit Set1=P3^3; //设置抢答时间,+ sbit Set2=P3^4; //设置抢答时间,- sbit Set3=P3^5; //设置答题时间,+ sbit Set4=P3^6; //设置答题时间,- sbit RST=P2^7; //抢答器的复位按键 sbit EN=P3^0; //抢答器使能和设置抢答和答题时间按键 unsigned char Tshu1=11,Tshu2=31,shu1=11,shu2=31,shu;//抢答器抢答时间和答题时间的相关变量 unsigned char count0=0,count1=0,roberflag=0,scond1=0,second2=0,robernum=0;//抢答者的相关变量 unsigned char Shuma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码值 bit Enflag=0; //抢答器使能的工作标志变量,0表示正常工作,1表示设置时间(抢答和答题) void main() //主函数 { 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++) //这个循环,实现数码管的动态显示 { 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) //延时函数,主要是为了数码管的动态显示 { 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(); //调用设置时间函数,检测是否有设置时间的动作 if(RST == 0) //检测是否有复位动作,有动作,则实现部分变量初始化值 { 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口,不准次扫描,无优先级) { 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主要是用于工作时的数码显示,跑表,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() //抢答时间和答题时间设置函数,也是被T0调用,实现设置时间功效。
上一篇:基于单片机PID控制的自动电阻炉温度控制器设计
下一篇:51单片机MPU6050数字陀螺仪与LCD12864显示
推荐阅读最新更新时间:2024-11-04 20:55
设计资源 培训 开发板 精华推荐
- LT1725IGN 演示板、48Vin 至 3.3V/3A、10W 模块、隔离式反激式、1x2 占位面积
- LIS2DE12适配器板,标准DIL24插座
- 使用 Analog Devices 的 LT1076HVCR 的参考设计
- NCP692MN33T2GEVB,NCP692 3.3V DC 至 DC 单路输出电源评估板
- 使用 MaxLinear, Inc 的 SPX29303U 的参考设计
- LTM4625 的典型应用 - 20VIN、5A 降压型 DC/DC 模块稳压器
- 低功耗稳压器(10V-20V 至 5V)
- LT6654AHS6-3.3 八路 DAC 电压基准的典型应用
- 90C7101,Turbo-Lite 微控制器是一种混合信号 SOC 芯片,它包含一个模数转换器,一个 8 位微控制器
- 用于单节锂离子电池至 5V 转换器的 MCP1253 低噪声、正调节电荷泵的典型应用