• 大小: 28KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-12-01
  • 语言: 其他
  • 标签: 单片机  

资源简介

本设计基于STC-89C52系列单片机,利用按键、蜂鸣器、数码管实现了抢答功能。设计将3位选手中抢答成功的选手编号显示在数码管上,通过复位开始键,显示抢答剩余时间,初始为10s,时间分辨率不小于100ms,抢答成功后通过蜂鸣器播放一段小乐曲并显示选手编号,10秒内抢答结束时无人抢答,算作抢答失败,播放一段警报声,并显示FF。主要模块有:数码管显示模块、蜂鸣器模块、独立按键模块、中断模块、乐曲播放模块。

资源截图

代码片段和文件信息

#include 
#include  
#define uint unsigned int 
#define uchar unsigned char
sbit beep=P2^5;  //蜂鸣器口
sbit wela1=P2^6;
sbit wela2=P2^7;//两个位选,P0口为段选
sbit s1=P3^4;
sbit s2=P3^5;
sbit s3=P3^6;
sbit s4=P3^7; //定义按键
uchar code SONG_TONE[]={1591591061069393106
1191191261261421421590}; //乐曲音符频率编码

uchar code SONG_LONG[]={12121212241224
121212121212240};  //乐曲节拍编码

uchar code table[]={ 
0xbf0x860xdb0xcf
0xe60xed0xfd0x87
0xff0xef0x060x3f
0x5b0x4f0x6d0x71}; //数码管编码 0.~9. 10235F
uchar numt0geshi;
int lock = 1; 
int a=1;
void init();             
void display(uchar num1uchar num2);
void keycan();
void delay(uint z); 
void PlayMusic();
void main()   //主函数
{
init();
while(1)
{
keycan();
display(shige);
}
}

void init() //初始化函数,开定时器       
{
TMOD=0x01;   //设置定时器0为工作方式1
TH0=(65536-45872)/256;    //装初值50ms一次中断
TL0=(65536-45872)%256;   
EA=1;    //开总中断
ET0=1;    //开定时器0中断
}

void keycan() //按键控制函数
  {
if(s1==0)  //s1按下进入10s倒计时
{
delay(20); //延时防抖动
shi=10;  ge=11; //数码管显示的十位及个位
while(!s1); //按键弹起后再进行下一步
TR0=1;  //进入定时
lock = 1;
}
if(s2==0&&lock)    //s2为第一位选手按键
{
delay(20);
shi=11;ge=10;
display(shige);
while(!s2);
TR0=0;    //关定时,显示选手号码
lock = 0;    //锁存状态,其他选手按键无效
PlayMusic();   //播放乐曲
}
if(s3==0&&lock)
{
delay(20);
shi=11;ge=12;
display(shige);
while(!s3);
TR0=0;
lock = 0;
PlayMusic();
}
if(s4==0&&lock)
{
delay(20);
shi=11;ge=13;
display(shige);
while(!s4);
TR0=0;
lock=0;
PlayMusic();
}
  }

void delay(uint z)    //延时函数
{
uint xy;
for(x=z;x>0;x--)
for(y=110;y>0;y--); //z等于多少即延时约多少ms
}
void timer0() interrupt 1  //中断
{
    int i=50;
TH0=(65536-45872)/256;    //重装初值
TL0=(65536-45872)%256;
numt0++;
if(numt0==10)  // 如果到了10次即0.5s时间到 ,然后开始以0.5s为单位倒计时
{
numt0=0;
if(a==1)  //如果a=1则第二位显示5
{
ge=14;
a=0;
shi=shi-1;  //第一位减1
}
else
{
ge=11;  //如果a=0则第二位显示0,且第一位保持不变
a=1;
}
if(shi==0&&ge==11)   //如果数值为0.0,则说明抢答时间到
{
   shi=15;ge=15;   //显示FF
   lock=0;    //锁存状态,选手按键无效
   while(i--) //蜂鸣器发出警报
   {
   beep=0; //无源蜂鸣器给方波信号频率发声
   display(shige);
   delay(1);
   beep=1;
   delay(1);
   }
   TR0=0;
 }
}

}


void display(uchar num1uchar num2)    //数码管显示函数
{
if(shi!=11)
{
    wela2=1;  //如果十位不等于0,数码管动态扫描显示
        P0=table[num1];  //十位
wela2=0;
delay(5);
wela2=1;
 
wela1=1;  //个位
P0=table[num2];
wela1=0;
delay(5);
wela1=1;
}
else //如果十位等于0,即选手按下,则数码管静态显示个位
{
P0=table[num2];
   wela1=0;
}  
}

void PlayMusic()    //乐曲播放函数
{
uint i=0jk;
beep=0;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)  
{                                     
     for(j=0;j {
     beep=~bee

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        7973  2018-01-07 20:26  代码\1
     文件        2105  2018-01-07 20:26  代码\1.hex
     文件          34  2018-01-07 20:26  代码\1.lnp
     文件       11392  2018-01-07 20:26  代码\1.M51
     文件         161  2018-01-07 22:27  代码\1.plg
     文件       55746  2018-01-07 22:27  代码\1.uvopt
     文件       13217  2017-12-26 18:42  代码\1.uvproj
     文件       55746  2018-01-07 20:34  代码\1_uvopt.bak
     文件       13213  2017-12-25 22:37  代码\1_uvproj.bak
     文件        3522  2018-01-07 20:26  代码\a.c
     文件        8951  2018-01-07 20:26  代码\a.LST
     文件        9130  2018-01-07 20:26  代码\a.OBJ

评论

共有 条评论