#include<reg52.h> sbit SPK=P1^2 //定义音运旅巧乐输镇做出端口unsigned char t // 休止符标志unsigned char w //
节拍选择 unsigned char Timer0_H,Timer0_L,Time//致爱丽旁键丝unsigned char code MUSIC[]={ 3,2,1,2,2,1,3,2,1,2,2,1, 3,2,1,7,1,1, 2,2,1,1,2,1,6,1,2,6,0,1, 1,1,1,3,1,1, 6,1,1,7,1,2,5,0,1, 3,1,1,5,1,1, 7,1,1,1,2,2,6,1,1, 3,1,1,3,2,1, 2,2,1,3,2,1,2,2,1, 3,2,1,7,1,1, 2,2,1,1,2,1,6,1,2,6,0,1, 1,1,1,3,1,1, 6,1,1,7,1,2,5,0,1, 3,1,1,5,1,1, 7,1,1,6,1,2,6,0,1, 7,1,1,1,2,1, 2,1,1,3,1,2,1,1,1, 5,1,1,4,2,1, 3,2,1,2,2,2,7,0,1, 4,1,1,3,2,1, 2,2,1,1,2,2,6,0,1, 3,1,1,2,2,1, 1,2,1,7,0,1,3,1,1, 3,1,1,3,2,1, 3,1,1,/* 3,2,1,3,2,1, 3,3,1,2,2,1, 3,2,1,2,3,1, //高音3,3,1,2,2,1, 3,2,1,2,3,1, 3,3,1,2,3,1,3,3,1,2,3,1, 3,3,1,7,2,1, 2,3,1,1,3,1,*/3,2,1,3,2,1, 3,2,1,2,2,1, 3,2,1,2,2,1, //低音3,2,1,2,2,1, 3,2,1,2,2,1, 3,2,1,2,2,1,3,2,1,2,2,1, 3,2,1,7,1,1, 2,2,1,1,2,1,6,2,2,6,1,1, 1,2,1,3,2,1, 6,2,1,7,2,2,5,1,1, 3,2,1,5,2,1, 7,2,1,1,3,2,6,1,1, 3,2,1,3,3,1, 2,3,1,3,3,1,2,3,1, 3,3,1,7,2,1, 2,3,1,1,3,1,6,2,2,6,1,1, 1,2,1,3,2,1, 6,2,1,7,2,2,5,2,1, 3,2,1,1,3,1, 7,2,1,6,2,4,6,2,4, 11 }// 音阶频率表 高八位code unsigned char FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC, 0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, //1,2,3,4,5,6,7,8,i0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, } // 音阶频率表 低八位code unsigned char FREQL[]={ 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6, 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B, 0x8F,0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, //1,2,3,4,5,6,7,8,i 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,}/*------------------------------------------------节拍延时函数 各调1/4节拍时间: 调4/4 125ms 调2/4 250ms ------------------------------------------------*/void delay_ms(){ unsigned char ifor(i=0i<230i++)}void delay(unsigned char t){unsigned char i for(i=0i<ti++){ unsigned int k,j j=500 for(k=0k<jk++) { delay_ms()}} }/*------------------------------------------------ 定时器0中断------------------------------------------------*/void TIM0_ISR() interrupt 1{ TR0=0if(t!=0) { SPK=!SPK} else { SPK=0} TH0=Timer0_HTL0=Timer0_LTR0=1}/*------------------------------------------------歌曲处理函数------------------------------------------------*/void Song(){ TH0=Timer0_H//赋值定时器时间,决定频率 TL0=Timer0_LTR0=1 //打开定时器 delay(Time)//延时所需要的节拍 }/*------------------------------------------------主函数------------------------------------------------*/ void main(void) { unsigned int k,i TMOD|=0x01//置定时器0工作方式1 EA=1 //打开全局中断 ET0=1 //打开定时0中断 while(1) { i=0// w=0while(MUSIC[i]!=11){ //音乐数组长度 ,唱完从头再来k=MUSIC[i]+7*MUSIC[i+1]-1//去音符振荡频率所需数据t=MUSIC[i] Timer0_H=FREQH[k] Timer0_L=FREQL[k] Time=MUSIC[i+2] //节拍时长i=i+3// w++ Song() } } }
51单片机蜂鸣器程序为:
#include"reg52.h"
typedef unsigned char u8
typedef unsigned int u16
sbit beep=P1^5
void delay(u16 i)
{
while(i--)
}
void main()
{
while(1)
{
beep=~beep
delay(1000)//控制音调频率
beep=~beep/控制声音大小
delay(10)
}
}
扩展资料:
BUZZER蜂鸣器的分类:
1、按其驱动方式的原理分,可分为:有源蜂鸣器(内含驱动线路,也叫自激式蜂鸣器)和无源蜂鸣器(外部驱动,也叫他激式蜂鸣器)。
2、按构造方式的不同,可分为:电磁式蜂鸣器和压电式蜂鸣器。
3、按封装的不同,可分为:DIP BUZZER(插针蜂鸣器)和SMD BUZZER(贴片式蜂鸣器)。
4、按电流的不同,可分为:直流蜂鸣器和交流蜂鸣器,其中,以直流最为常见压电式蜂鸣器,用的是压电腔团庆材料,即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样,当通电时压电材料会发生形变或丛。
电磁式蜂鸣器,主要是利用通电导体会产生磁场的特性,用一个固定的永久磁铁与通电导体产生磁力推动固定在线圈上的鼓膜伍握。
由于两种蜂鸣器发音原理不同,压电式结构简单耐用但音调单一音色差,适用于报警器等设备。而电磁式由于音色好,所以多用于语音、音乐等设备。
评论列表(0条)