資源簡介
本設(shè)計(jì)基于STC-89C52系列單片機(jī),利用按鍵、蜂鳴器、數(shù)碼管實(shí)現(xiàn)了搶答功能。設(shè)計(jì)將3位選手中搶答成功的選手編號(hào)顯示在數(shù)碼管上,通過復(fù)位開始鍵,顯示搶答剩余時(shí)間,初始為10s,時(shí)間分辨率不小于100ms,搶答成功后通過蜂鳴器播放一段小樂曲并顯示選手編號(hào),10秒內(nèi)搶答結(jié)束時(shí)無人搶答,算作搶答失敗,播放一段警報(bào)聲,并顯示FF。主要模塊有:數(shù)碼管顯示模塊、蜂鳴器模塊、獨(dú)立按鍵模塊、中斷模塊、樂曲播放模塊。

代碼片段和文件信息
#include?
#include??
#define?uint?unsigned?int?
#define?uchar?unsigned?char
sbit?beep=P2^5;??//蜂鳴器口
sbit?wela1=P2^6;
sbit?wela2=P2^7;//兩個(gè)位選,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};??//樂曲節(jié)拍編碼
uchar?code?table[]={?
0xbf0x860xdb0xcf
0xe60xed0xfd0x87
0xff0xef0x060x3f
0x5b0x4f0x6d0x71}; //數(shù)碼管編碼?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() ??//主函數(shù)
{
init();
while(1)
{
keycan();
display(shige);
}
}
void?init()?//初始化函數(shù),開定時(shí)器???????
{
TMOD=0x01; ??//設(shè)置定時(shí)器0為工作方式1
TH0=(65536-45872)/256;? ??//裝初值50ms一次中斷
TL0=(65536-45872)%256; ??
EA=1; ???//開總中斷
ET0=1; ???//開定時(shí)器0中斷
}
void?keycan()?//按鍵控制函數(shù)
??{
if(s1==0) ?//s1按下進(jìn)入10s倒計(jì)時(shí)
{
delay(20);?//延時(shí)防抖動(dòng)
shi=10; ?ge=11; //數(shù)碼管顯示的十位及個(gè)位
while(!s1); //按鍵彈起后再進(jìn)行下一步
TR0=1; ?//進(jìn)入定時(shí)
lock?=?1;
}
if(s2==0&&lock) ???//s2為第一位選手按鍵
{
delay(20);
shi=11;ge=10;
display(shige);
while(!s2);
TR0=0; ???//關(guān)定時(shí),顯示選手號(hào)碼
lock?=?0; ???//鎖存狀態(tài),其他選手按鍵無效
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)? ??//延時(shí)函數(shù)
{
uint?xy;
for(x=z;x>0;x--)
for(y=110;y>0;y--); //z等于多少即延時(shí)約多少ms
}
void?timer0()?interrupt?1? //中斷
{
????int?i=50;
TH0=(65536-45872)/256; ???//重裝初值
TL0=(65536-45872)%256;
numt0++;
if(numt0==10) ?// 如果到了10次即0.5s時(shí)間到?,然后開始以0.5s為單位倒計(jì)時(shí)
{
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) ??//如果數(shù)值為0.0,則說明搶答時(shí)間到
{
???shi=15;ge=15; ??//顯示FF
???lock=0; ???//鎖存狀態(tài),選手按鍵無效
???while(i--) //蜂鳴器發(fā)出警報(bào)
???{
???beep=0; //無源蜂鳴器給方波信號(hào)頻率發(fā)聲
???display(shige);
???delay(1);
???beep=1;
???delay(1);
???}
???TR0=0;
?}
}
}
void?display(uchar?num1uchar?num2) ???//數(shù)碼管顯示函數(shù)
{
if(shi!=11)
{
??? wela2=1; ?//如果十位不等于0,數(shù)碼管動(dòng)態(tài)掃描顯示
??????? P0=table[num1]; ?//十位
wela2=0;
delay(5);
wela2=1;
?
wela1=1; ?//個(gè)位
P0=table[num2];
wela1=0;
delay(5);
wela1=1;
}
else //如果十位等于0,即選手按下,則數(shù)碼管靜態(tài)顯示個(gè)位
{
P0=table[num2];
?? wela1=0;
} ?
}
void?PlayMusic() ???//樂曲播放函數(shù)
{
uint?i=0jk;
beep=0;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) ?
{?????????????????????????????????????
???? for(j=0;j {
???? beep=~bee
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件????????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
- 上一篇:音頻分離應(yīng)用
- 下一篇:傳智播客黑馬淘淘商城視頻和源碼課件筆記
評(píng)論
共有 條評(píng)論