历史上的今天
今天是:2024年09月11日(星期三)
2020年09月11日 | 51单片机8路抢答器
2020-09-11 来源:51hei
时间有限,用数码管显示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调用,实现设置时间功效。
史海拾趣
|
谈谈专门的视频压缩芯片 https://home.eeworld.com.cn/?uid-69557-action-viewspace-itemid-12624 DM642硬件设计应该注意的一些问题 https://home.eeworld.com.cn/?uid-69557-action-viewspace-itemid-12557 网站diy失败的原因 https://home.eewo ...… 查看全部问答> |
|
ARM9,ARM7同cortex-m3的数据在RAM的存贮的区别 ARM9 ARM7在RAM中是以字节,字,半字来存贮的,它们是按照一定的关系存放的,所以ARM9 ,ARM7可以把变量以字和半字来存取的。这样会浪费一个些空,具体浪费多大要根据指令情况而定,而CORTEX-M3就不是这样,而是按照无关联组织的,自由的存放,而在 ...… 查看全部问答> |
|
受友人之托,发此求助内容:有效期至2010年4月25日 Linux下用S3C2440实现对IIC器件(如IIC的AD转换芯片)、SPI器件(如SPI的AD转换芯片)、GPIO(如LED数码管、矩阵键盘)等的读取和控制;以及LPC2440芯片内部定时器和中断系统及串口等控制,要求 ...… 查看全部问答> |
|
高清TDS1012B-SC彩屏示波器(俗称“熊猫”)拆解图,懂行的高人看看好在何处? 我们实验室买回的新设备之一,泰克的,比国产货贵一些。 手痒痒,拆了再说,因没贴封条,据说仍能保修。 想看看它好在哪些方面,怎么达到每通道1GS/s采样率?盼大虾指点。图太多,整合成了PDF格式,见谅!… 查看全部问答> |
|
我是一名大二学生,进入大学后,一直是软件方面的东西学的比较多,现在感觉自己到了一个瓶颈地带,硬件方面的知识奇缺,而且学校开的硬件课太少了,自学的话又力不从心不知从何学起。哪位大侠能帮助小弟指点迷津,系统介绍一下学习硬件书籍的顺序呢… 查看全部问答> |
|
我在使用5410开发,采用Flash启动,现在系统上电启动总是不正常,第一次启动需要拔插电源插头才能工作,我怀疑是不是JTAG口引脚接法不对造成的,现在JTAG口是按照EVM板连接的,不知道是不是这个问题,请问还有什么PIN脚需要注意的,谢谢!… 查看全部问答> |
|
记得之前我用 LM3S8962 开发的时候,复位不会导致 USB 失去连接的,不知道为什么今天一复位 USB 就要重新连接一次,而且时好时坏,而且串口调试助手收不到数据且总是导致它死掉,必须用任务管理器才能关掉,这个问题有没有谁遇到过,大家讨论下有没 ...… 查看全部问答> |




