怎么用c语言编写,使蜂鸣器发出不同频率的声音(51单片机).

怎么用c语言编写,使蜂鸣器发出不同频率的声音(51单片机).,第1张

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程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9279982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存