设计要求:
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的研究生,刚开始写博客。希望和大家多多交流,一起进步!
求朋友点赞、收藏、关注哈,鼓励一下新人博主,或者提出建议。