#include<reg51h>
#include<intrinsh>
#define uchar unsigned char
uchar pwm,ctl=5;
sbit fmq=P1^0;
bit flag;
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
void t0isr() interrupt 1
{
pwm++;
if(pwm<=ctl)P0=0xff;
else P0=0x00;
if(pwm==100)
{
pwm=0;
ctl++;
}
if(ctl==100)flag=1;
}
main()
{
uchar i,led;
TMOD=0x02;
TH0=236;
TL0=236;
ET0=1;
EA=1;
while(1)
{
led=0xfe;
for(i=0;i<8;i++)
{
P0=led;
led=led<<1;
delay(200);
}
led=0xff;
delay(200);
led=0x7f;
for(i=0;i<8;i++)
{
P0=led;
led=led>>1;
delay(200);
}
TR0=1;
flag=1;
while(flag);
TR0=0;
}
}
这得看三极管的型号,不同的型号程序稍有不同。
主要是设置是“1”还是“0”驱动,这得看你的电路的连接。
1)如果连接PNP三极管驱动,设置P3_3=0,则蜂鸣器一直响;如果设置
P3_3=0;//响
delay_500ms();
P3_3=1;//不响
delay_500ms();//蜂鸣器每一秒响一次
2)如果连接NPN三极管驱动,设置P3_2=1,则蜂鸣器一直响;如果设置
P3_2=1;//响
delay_500ms();
P3_2=0;//不响
delay_500ms();//蜂鸣器每一秒响一次
如果是蜂鸣器的话,那么加一个电平信号就可以发声了。\x0d\FMQ EQU P10\x0d\ORG 0000H\x0d\LJMP MAIN\x0d\ORG 0030H\x0d\MAIN:\x0d\CPL FMQ\x0d\LCALL DELAY\x0d\SJMP MAIN\x0d\DELAY:\x0d\MOV R2,#200\x0d\DLY:\x0d\MOV R3,#250\x0d\DJNZ R3,$\x0d\DJNZ R2,DLY\x0d\RET\x0d\END
将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();
}
}
}
你考虑下是不是这样的,beep=0时蜂鸣器不发声的。
因为单片机一上电的时候为高电平,即beep=1,在没执行到beep=0;时蜂鸣器响了一声。
建议你分析下蜂鸣器驱动电路
通过中断的方式,使用定时器0来提供1KHz的方波,蜂鸣器引脚定义为P10。代码如下:
#include
<reg51h>
#define
u8
unsigned
char
sbit
BEEP=P1^0;
void
main
{
EA=1;//开总中断
IT0=1;//打开定时器0源中断允许开关
TMOD=0x01;//选择定时器0工作在方式0
TR0=1;//启动定时器0
TH1=(65536-1000)/256;//赋值,定时1ms
TL1=(65536-1000)%256;
while(1)
{;}
}
void
TIM()
interrupt
1
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
BEEP=~BEEP;//蜂鸣器引脚输出1KHz方波
}
以上就是关于51单片机蜂鸣器程序全部的内容,包括:51单片机蜂鸣器程序、C51单片机中有源蜂鸣器的程序怎么写啊,还有就是,有源蜂鸣器是高电平触发还是低电平触发、单片机用汇编语言怎么写一个蜂鸣器程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)