|
1、利用各种器件设计一个八路智力竞赛抢答器
2、并用PROTEL或EWB画原理图与印制板电路图。3、总结检验电路设计的结果2)设计要求
1、抢答器同时供八名选手或八个代表队比赛,分别用八个按钮S0~S7表示。2、设置一个系统清除和抢答控制开关s,该开关由主持入控制。
3、抢答器具有锁存于显示功能。即选手按动按钮,锁存相应的编号,并且优先抢答选手的编号一直保持到主持人讲系统清零为止。
4、抢答器具有定时抢答功能,且一次抢答的时间由主持人设定。当主持人启动开始键后,定时器进行减计时,同时扬声器发出知暂的声响,声响持续的时间在3秒左右,与此同时,指示灯会亮,提示抢答开始。
5、参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清零为止。
6、如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
单片机源程序:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define max 20
- uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
- sbit d1=P2^4;//**************段选
- sbit d2=P2^5;
- sbit x1=P2^6;
- sbit x2=P2^7;
- sbit k1=P1^0;//*********************八位选手开关
- sbit k2=P1^1;
- sbit k3=P1^2;
- sbit k4=P1^3;
- sbit k5=P1^4;
- sbit k6=P1^5;
- sbit k7=P1^6;
- sbit k8=P1^7;
- sbit zk1=P2^0;//*****************************主持人开关zk1 zk2
- sbit zk2=P2^1;
- sbit buz=P2^2;//*******************蜂鸣器
- uchar num,aa;
- uchar f,flag;
- void jianpan();
- void init(void)
- {
- TMOD=0X01;//***************T0,模式1,定时
- TL0=0XB0; //********************定时50ms
- TH0=0X3C;
- ET0=1; //**************开中断
- EA=1;
- num=max;//置倒计时计数初值
- }
-
- void delay(uint xms)
- {
- uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
-
- }
- /**********************************************
- 倒计时 选手号显示函数
- **********************************************/
- void display()
- {d1=0; //控制开始置数
- P0=tab[num/10];//倒计时控制取最高位
- delay(5);
- d1=1; //停止置数操作
-
- d2=0;
- P0=tab[num%10];//倒计时取最低位
- delay(5);
- d2=1;
-
- x1=0; //控制开始置数
- P0=tab[flag/10];//选手号控制
- delay(5);
- x1=1; //停止置数操作
- x2=0;
- P0=tab[flag%10];
- delay(5);
- x2=1;
- }
- /**********************************************************主函数部分
- **********************************************************/void main()
- {
- init();
- while(1)
- { jianpan();display();} }
-
- /***************************************
- 中断控制倒计时
- *************************************/
- void timer0(void) interrupt 1
- {
- TL0=0XB0; //******重装初值,定时50ms
- TH0=0X3C;
- aa++;
- if(aa==20)//**********************************1秒到了
- {
- aa=0;//**************************************计数清零
- num--;
- if(num==0)//倒计时为0时迅速变为初值同时关中断停止倒计时
- { num=max;
- TR0=0; }
-
- buz=0;//***************要求蜂鸣器响
- delay(20);//**************************蜂鸣器响,特别注意时间为一秒buz=1;
-
- }
- }
- /**************************************************
- 按键控制 程序的核心部分
- ****************************************************/
- void jianpan()
- {
- if(zk1==0&flag=0)
- {
- delay(5);//消除数码管抖动操作
- flag=0;//数码管显示0
- display();
- TR0=1;//ZK1键按下,开中断以此控制:只有当此键按下时才抢答
- }
- if(zk2==0&&TR0==0)//注意这里要求TR0=0;
- {
- delay(5);//消除抖动
- if(zk2==0&&TR0==0)
- if(flag==0)
- {num--;buz=0;delay(20);buz=1;}
- if(num==0)
- num=max;
- if(flag!=0)//ZK2键清零操作
- {
- flag=0;
- num=max;//倒计时显示最大值
- TR0=0;//注意此时关中断,不再进行倒计时
- buz=0;
- delay(20);
- buz=1;
- }
- while(!zk2)//倒计时中ZK2 键不可影响
- display();
- }
-
- /**********************************************************TR0控制抢答先后顺序
- *********************************************************/
-
- if(k1==0&&TR0==1)//注意此时TR0=1才执行以下按键操作
- {
- buz=0;
- delay(20);
- buz=1;
- delay(5);
- flag=1;
- TR0=0;//此键按下关中断,其他选手按键不再受影响
- display();
- }
- /*************************************
- 以下原理相同
- *************************************/
- if(k2==0&&TR0==1)
- {
- buz=0;delay(20);buz=1;
- delay(5);
- flag=2;
- TR0=0;
- display();
- }
-
- if(k3==0&&TR0==1)
- {
- buz=0;delay(20);buz=1;
- delay(5);
- flag=3;
- TR0=0;
- display();
- }
- if(k4==0&&TR0==1)
- {
- buz=0;delay(20);buz=1;
- delay(5);
- flag=4;
- TR0=0;
- display(); }
- if(k5==0&&TR0==1)
- {
- delay(5);
- flag=5;
- TR0=0;
- display();
- }
- if(k6==0&&TR0==1)
- {
- buz=0;delay(20);buz=1;
-
- delay(5);
-
- flag=1;
-
- TR0=0;
- display(); }
-
-
- if(k7==0&&TR0==1)
- {
- buz=0;delay(20);
- buz=1;
- delay(5);
- flag=7;
- TR0=0;
- display();
- }
-
- if(k8==0&&TR0==1)
- {
- buz=0;delay(20);
- buz=1;
- delay(5);
- flag=8;
- TR0=0;
- display();
- }
-
- }
复制代码
|
-
-
代码.docx
15.23 KB, 下载次数: 10, 下载积分: 黑币 -5
|