资源简介
本设计基于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
- 上一篇:音频分离应用
- 下一篇:传智播客黑马淘淘商城视频和源码课件笔记
相关资源
- 单片机仿真软件proteus6.7免安装绿色版
- 基于SPCE061A单片机的图形液晶模块的驱
- 基于SPCE061A单片机汇编语实现的流水灯
- 基于SPCE061A单片机的图形液晶模块的驱
- 物联网家居系统中基于单片机的多路
- 基于IAP15F2K61S2单片机的多路温度巡检
- 如何用单片机控制舵机及程序详细
- 单片机控制舵机电路图
- 基于MSP430单片机的实时多任务操作系
- 基于STM32F103C8单片机的晶联讯电子JL
- 广联达6.0写锁包,2020年11月最新
- 基于51单片机的交通信号灯程序
- 14284969_《STM32单片机应用与全案例实践
- GSM监控系统51单片机设计
- 精选单片机设计与制作30例
- 中颖单片机入门与实战
- 51单片机定时器/计数器的结构和原理
- MCS-51单片机定时器和计数器区别的理
- 基于32位单片机MC68HC376的高可靠性系统
- MC68HC08单片机程序设计速成
- PIC单片机人机接口模块4×4行列式
- PIC单片机人机接口模块4×4行列式
- 基于51单片机的多通道数据采集范围控
- ADC0832ADC0809DAC0832三种芯片程序,c程序
- 数据采集系统——ADC0808的应用
- 基于51单片机的直流电机转速控制及显
- 单片机控制步进电机PMW的驱动与放大
- 单片机驱动4相步进电机proteus仿真
- 使用PIC单片机开发的简易数字电压表
- 飞思卡尔单片机.s19文件方法详解
评论
共有 条评论