Bootstrap

基于STC15系列单片机的多路抢答器的设计

设计要求:

          1. 设计一款6路或以上的抢答器;(20)

          2. 设计一个抢答控制开关(开始抢答后才允许答题者抢答),供主持人用;(20)

          3.  设定抢答时间限制,超过时间后,该题作废;(20)

          4* 设定答题时间(5)

          5* 数字LED显示当前答题者号数(15) ;

          6 其他功能(创新部分 6分)

          7.做出实物(4分)

          有犯规(未按开始键就抢答的)时显示其号码

设计目的:

1.掌握按键、数码管、蜂鸣器的使用方法

2.掌握定时器的编程方法

3.掌握面包板制作单片机电路的使用方法

产品实物图

 源程序

#include <stc15.h> //头文件
#include <intrins.h>
#define uchar unsigned char //uchar 代替 unsigned char
#define uint  unsigned int  //同上
	/*按键*/
sbit k1=P3^0;                //选手1
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit k5=P3^4;
sbit k6=P3^5; 
uchar m =0;    //引入变量,开始答题与停止答题共用一个按键,通过位变量d的奇数偶数区分
uchar n =1;  //n表示事件是否没有人抢答,'1'为真,'0'为假
uchar haoshu;//用来表示答题者号数
uint flagone =0;//定时器0累加变量
uint flagtwo =0;//定时器1累加变量
//蜂鸣器
sbit beep=P3^6;
//8位共阳极数码管组
 uchar code table[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
 void delay(uint z)//带参数的延时函数
{
 uint x,y;
 for(x=z;x>0;x--)
 for(y=5000;y>0;y--);
}
void Play(uchar t)//提示音
{
         uint i;
	       beep = 1;
        for(i=0;i<10;i++)
        {
                 beep = ~beep;
                delay(t);
        }
        beep = 1;
}

 void display()//显示子函数——按键控制数码管显示
 {
	 if(k1==0) haoshu=1;
	 if(k2==0) haoshu=2;
	 if(k3==0) haoshu=3;
	 if(k4==0) haoshu=4;
	 if(k5==0) haoshu=5;
	 if(k6==0) haoshu=6;
	 P1=table[haoshu];
 }
 void main()
 {
	 P1M1=0x00;
	 P1M0=0xff;     //设置P1口为推挽输出驱动模式,用以驱动数码管
	 P2M1=0;
	 P2M0=0;
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x4C;		//设置定时初值
	TF0 = 0;		//清除TF0标志
  AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初值
	TH1 = 0x4C;		//设置定时初值
	TF1=0;       //清除TF1标志

  P24=1;
	 
	 while(1)
	 {
		 P10=0;
		 if(P20==0) //开始、停止共用按键
		 {
			 delay(10);
			 if(P20==0) 
			 {m++;P24=~P24;}//按键奇数次开始抢答,按键偶数次清零复位;用白色LED直观地表示m的取值(见实物视频)
		 }
		 if((m%2)==1)
		 { 
			 ET0=1;       //开定时器0中断                        
       TR0=1;       //启动定时器0
			 	EA=1;       //开总中断
		 }
		 if((m%2)==1&&(k1==0||k2==0||k3==0||k4==0||k5==0||k6==0))//开始抢答键按下且有人抢答
		 {
			 n=0;
			 display();
		   Play(5);
			 ET1=1;       //开定时器1中断
	     TR1 = 1;		//定时器1开始计时
			 	EA=1;       //开总中断
			 ET0 = 0;   //关定时器0中断
			 TR0 = 0;   //定时器0停止计时
			 delay(100);
		}
			 
		 if((m%2)==0&&(k1==0||k2==0||k3==0||k4==0||k5==0||k6==0))//开始抢答键未按下且有人抢答
		 {
			 display();
			 Play(3);
			 P21=0; 若有人违反规定抢答,点亮红色LED(见实物视频)
			 delay(30);
		 }
 }
	 }
 void T0_ISR() interrupt 1
 {
	 flagone++;
	 if(flagone==1200&&n==1)//定时器最大定时长度不超过1s,定时50ms、累加1200次为60s
	 {m=0;P22=0;}           //若规定时间内无人抢答,点亮黄色LED(见实物视频),同时进行复位
 }
 void T1_ISR() interrupt 3
 {
	 flagtwo++;
	 if(n==0&&flagtwo==600)//若规定时间内有人按规定抢答,进行答题时间30s计时
	 {m=0;P23=0;}          //若规定时间内未回答正确,点亮绿色LED(见实物视频),同时进行复位
 }

具体工程文件获得及疑问或指导可以在评论区里提问。 

我是小韩每天进步一点点,一名研0的研究生,刚开始写博客。希望和大家多多交流,一起进步!

求朋友点赞、收藏、关注哈,鼓励一下新人博主,或者提出建议。

;