单片机按键控制蜂鸣器发声程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include〈reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 Count,i;
sbit Speak =P1^2; //蜂鸣器器控制脚
sbit key1 =P3^2;//按键控制引脚
sbit key2 =P3^3;
sbit key3 =P3^4;
/*以下数组是音符编码*/
uint8 code SONG[] ={0xff,0x39,0x30,0x33,0x30,0xff,0x30,0x30,0x00,};
void Time0_Init()//定时器T0方式1,定时10ms
{
TMOD = 0x01;
IE = 0x82;
TH0 = 0xDC;
TL0 = 0x00;
}
void Time0_Int() interrupt 1
{
TH0 = 0xDC;
TL0 = 0x00;
Count++;
}
void delay (uint8 k)//按键防抖延时
{
uint8 j;
while((k—-)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
void Delay_xMs(uint8 x)//发声延时
{
uint8 i,j;
for(i=0; i〈x;i++)
{
for(j=0; j〈3; j++);
}
}
void Play_Song(uint8 i)//蜂鸣器发声函数
{
uint8 Temp1,Temp2;
uint8 Addr;
Count = 0;//中断计数器清0 Addr = i *3;
while(1)
{
Temp1 = SONG[Addr++];
if (Temp1 == 0xFF) //休止符
{
TR0 = 0;
Delay_xMs(100);
}
else if (Temp1 == 0x00) //歌曲结束符
{
return;
}
else
{
Temp2 = SONG[Addr++];
TR0 = 1;
while(1)
{
Speak = ~Speak;
Delay_xMs(Temp1);
if(Temp2 == Count)
{
Count = 0;
break;
}
}
}
}
}
void keyscan (void)//按键切换声音函数
{
if(key1==0)
{
delay(10);
if(key1==0)
{
i=0;
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
i=1;
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
i=2;
}
}
}
void Main()
{
Time0_Init();//定时器0中断初始化
while(1)
{
keyscan ();
Play_Song(i);
}
}。