本产品模拟竞赛中抢答环节赛事,八组选手同时按下按钮只有一组通过的设计。
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- //八路抢答器说明:P2.7口为显示个位数码管的位选线;P2.6口为显示十位数码管的位选线 ;抢答或倒计时结束后按复位键进行下一次抢答.
- #include<reg52.h>
- #define uchar unsigned char //宏定义
- #define uint unsigned int
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管段码表
- sbit beep=P2^4; //蜂鸣器控制位
- uchar num,t1,shu,temp,shi,ge;//声明变量
- uint i;
- //延时子程序
- void delay(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- //初始化子程序
- void init()
- {
- P0=0xff;//消隐
- P2=0xff;
- P1=0xff;//保证抢答前P1口全为高电平(单片机检测低电平认为抢答)
- temp=P1;
- TMOD=0x01; //选择定时器0为工作方式
- TH0=(65536-50000)/256;//定时器装初值
- TL0=(65536-50000)%256;
-
- EA=1; //开总中断
- ET0=1; //开定时器0
- TR0=1; //启动定时器0
- num=30; //倒计时数为30
- }
- void display()//抢答倒计时显示子函数
- {
- shi=num/10;
- ge=num%10;
- P0=table[shi]; //显示十位 送段码
- P2=0xfe; //送位码
- delay(2); //延时
- P0=table[ge]; //显示个位 ,送段码
- P2=0xfd; //送位码
- delay(2); //延时
- }
- //主程序
- void main()
- {
- init(); //调初始化
- //大循环
- while(1)
- {
- //倒计时显示程序
- while(temp==0xff)
- {
-
- display(); //抢答倒计时显示函数
- temp=P1;//判断之前,先把P1口的数据送给temp;
- while(temp!=0xff) //判断
- break;
- }
-
- //独立键盘扫描程序
- while(temp!=0xff)//有键按下
- {
- delay(5);//软件延时消抖
- temp=P1; //重读按键
- while(temp!=0xff)//再次确认有键按下
- {
- temp=P1;
- switch(temp)//判断哪个键按下
- {
- case 0xfe : shu=1; //1号选手抢答成功
- break;
- case 0xfd : shu=2; //2号选手抢答成功
- break;
- case 0xfb : shu=3; //3号选手抢答成功
- break;
- case 0xf7 : shu=4; //4号选手抢答成功
- break;
- case 0xef : shu=5; //5号选手抢答成功
- break;
- case 0xdf : shu=6; //6号选手抢答成功
- break;
- case 0xbf : shu=7; //7号选手抢答成功
- break;
- case 0x7f : shu=8; //8号选手抢答成功
- break;
- }
- P0=table[shu];//显示所按下的键 ,送段码
- P2=0xfd; //送位码
- beep=0; //开蜂鸣器
- delay(500);//有键按下时蜂鸣器响500ms
- beep=1; //关闭蜂鸣器
- while(1);//进入死循环,将所按下的键显示并定格,防止有键再按下时将其覆盖;
- }
- }
- }
- }
- //定时器T0中断子函数
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256; //重赋初值,定时时间为50ms
- TL0=(65536-50000)%256;
- t1++;
- if(t1==20) //50ms*20=1s,1秒到
- {
- t1=0; //定时计数清0
- num--;//30秒倒计时
- if(num==0)
- {
- TR0=0; //关断定时器0
- beep=0; //开蜂鸣器
- while(1)//进入死循环防止超时抢答
- {
- for(i=0;i<600;i++)//循环调用显示延时,同时刷新显示
- {
- display(); //抢答倒计时显示函数
- }
- beep=1; //关断蜂鸣器
- }
- }
- }
-
- }
复制代码
所有资料51hei提供下载:
8路抢答器.zip
(1.96 MB, 下载次数: 52)
|