1、无源蜂鸣器,需要外部提供脉冲信号才会发声,且声音会随脉冲频率变化而变化。而有源蜂鸣器内部有振荡器,所以只需要提供电压(高电平)就能发声,它们的原理不同。
2、例如定义 一个IO连接蜂鸣器。比如,sbit fmq=P1^0; 再来个500US延时函数。
void beep() //所以会产生1KHZ频率声音{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
那得开你的标志位flag1的值有没有改变了,如果你一直没有程序去更改flag1的值,且它的值为0时,那么就会出现你说的那种现象了,你在didi函数里面响两声后那里加一个flag1=1;应该就好了,或者是你执行完didi后,main里面的一些函数在改变flag1的值,但凭你写的那个didi函数来看,那就是蜂鸣器响两声的函数,它一直响,肯定是在循环执行didi函数……
void delay();
void main()
{
PORTD = 0xFF;
DDRD = 0xFF;//初始化 AVR的不知道是不是这样的
while(1)
{
int i;
for(i=0;i<3;i++)
{
PORTD=0x01;//蜂鸣器IO
_delay(X);//x为响一次“滴”的时间
}
PORTD=0x00;
delay(Y);//Y为你所说的 间隔1S想一次(改变Y值 调试你要的1s或用你的延时函数里的
}
}
void delay(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<300;j++);
}
将51单片机的P12口连接到蜂鸣器的一个管脚上,另外一个管脚接地。若声音小,则添加一个三级管放大电路或直接串一个UL2003
/------------------------------------------------/
#include<reg52h> //包含头文件,一般情况不需要改动
//头文件包含特殊功能寄存器的定义
/------------------------------------------------
硬件端口定义
------------------------------------------------/
sbit SPK=P1^2; //定义音乐输出端口
unsigned char Timer0_H,Timer0_L,Time;
//世上只有妈妈好数据表
code unsigned char MUSIC[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
// 音阶频率表 定时器高八位
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,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, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
/------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/------------------------------------------------
节拍延时函数
各调1/4节拍时间:
调4/4 125ms
调2/4 250ms
调3/4 187ms
------------------------------------------------/
void delay(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++)
DelayMs(250);
TR0=0;
}
/------------------------------------------------
定时器0中断
------------------------------------------------/
void TIM0_ISR() interrupt 1
{
TR0=0;
SPK=!SPK;
TH0=Timer0_H;
TL0=Timer0_L;
TR0=1;
}
/------------------------------------------------
歌曲处理函数
------------------------------------------------/
void Song()
{
TH0=Timer0_H;//赋值定时器时间,决定频率
TL0=Timer0_L;
TR0=1; //打开定时器
delay(Time); //延时所需要的节拍
}
/------------------------------------------------
主函数
------------------------------------------------/
void main(void)
{
unsigned char k,i;
TMOD|=0x01; //置定时器0工作方式1
EA=1; //打开全局中断
ET0=1; //打开定时0中断
while(1)
{
i=0;
while(i<100)
{ //音乐数组长度 ,唱完从头再来
k=MUSIC[i]+7MUSIC[i+1]-1;//去音符振荡频率所需数据
Timer0_H=FREQH[k];
Timer0_L=FREQL[k];
Time=MUSIC[i+2]; //节拍时长
i=i+3;
Song();
}
}
}
不会修改程序,但是可以送你一段程序,如果有心就看看吧;
//以下程序运行于STC12C单片机
// BUZ为蜂鸣器输出I/O口定义名称
void Delay_1us(uint aa) //1T单片机/12MHz的n个us用于蜂鸣器
{
while (aa--)
{
_nop_();
_nop_();
}
}
/----------------------------
响一声短音
----------------------------/
void beep(void)
{
uint a;//定义变量用于发声的长度设置
for(a=300;a>0;a--)//第一个声音的长度
{
BUZ = ~BUZ;//产生音频
Delay_1us(100);//音调设置,延时调整赋值量可以调节音调
}
BUZ = 1;//音乐结束后扬声器关闭
}
;程序名: MCS51U实验板配套程序-歌曲:兰花草 ;电路介绍:蜂鸣器接P20;实验前要连接J12 ; OUT BIT P20 ORG 0 AJMP START ORG 0BH AJMP TIM0 START: MOV TMOD,#1 MOV IE,#10000010B START0: MOV 30H,#0 NEXT: MOV A,30H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV R2,A JZ END0 ANL A,#0FH MOV R5,A MOV A,R2 SWAP A ANL A,#0FH JNZ SING CLR TR0 AJMP D1 SING: DEC A MOV 22H,A RL A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV TH0,A MOV 21H,A MOV A,22H RL A INC A MOVC A,@A+DPTR MOV TL0,A MOV 20H,A SETB TR0 D1: CALL DELAY INC 30H AJMP NEXT END0: CLR TR0 AJMP START0 TIM0: PUSH ACC PUSH PSW MOV TL0,20H MOV TH0,21H CPL OUT POP PSW POP ACC RETI DELAY: MOV R7,#2 D2: MOV R4,#125 D3: MOV R3,#248 DJNZ R3,$ DJNZ R4,D3 DJNZ R7,D2 DJNZ R5,DELAY RET ;==================================== TABLE1: DW 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030 DW 64934 TABLE: ;1 DB 42H,82H,82H,82H,84H,02H,72H DB 62H,72H,62H,52H,48H DB 0B2H,0B2H,0B2H,0B2H,0B4H,02H,0A2H ;2 DB 12H,0A2H,0D2H,92H,88H DB 82H,0B2H,0B2H,0A2H,84H,02H,72H DB 62H,72H,62H,52H,44H,02H,12H ;3 DB 12H,62H,62H,52H,44H,02H,82H DB 72H,62H,52H,32H,48H DB 00H END
以上就是关于怎么用c语言编写,使蜂鸣器发出不同频率的声音(51单片机).全部的内容,包括:怎么用c语言编写,使蜂鸣器发出不同频率的声音(51单片机).、单片机C程序问题 蜂鸣器、单片机驱动无源蜂鸣器的C程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)