
如果是有源蜂鸣器的话很简单,只需要按照对应的电路给出电平(比如PNP驱动的只要给出低电平即可),无源的麻烦一点,需要给一定频率的方波才能发声,增强型51可以直接使用PWM,普通51可以使用定时器模拟PWM进行驱动,网上的例子很多,多看看就行了
P2是端口啊,所以P2=_crol_(P2,1);这句中等号左边的P2表示的读取P2端口,这时的值取决于外围电路,而不是原来的赋值。所以需要一个变量来解决这个问题。
由你的代码看,是直流蜂鸣器,它的声音频率是无法改变的。而你也只是要改变鸣叫和不鸣叫的间隔频率(只是纠正一下名词),但这个程序不行。修改如下:
void sp()
{
speak=1;
Delay_ms(5);
speak=0;
Delay_ms(5);
}
void main(void)
{
uchar j,k,a;
a=0xfe;
P2=0xfe;
Delay_ms(500);
while(1)
{
for(j=0;j<7;j++)
{
a=_crol_(a,1);
P2=a;
sp();
Delay_ms(500);
}
for(k=0;k<7;k++)
{
a=_cror_(a,1);
P2=a;
sp();
Delay_ms(500);
}
}
}
6. 报警产生器
1. 实验任务
用P10输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P17接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。
2. 电路原理图
图461
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P10端口用导线连接到“音频放大模块”区域中的SPK IN端口上;
(2. 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧的或者是16欧的喇叭;
(3. 把“单片机系统”区域中的P17/RD端口用导线连接到“四路拨动开关”区域中的K1端口上;
4. 程序设计内容
(1. 信号产生的方法
500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号电平每500us变反1次;
5. 程序框图
图462
6. 汇编源程序
FLAG BIT 00H
ORG 00H
START: JB P17,START
JNB FLAG,NEXT
MOV R2,#200
DV: CPL P10
LCALL DELY500
LCALL DELY500
DJNZ R2,DV
CPL FLAG
NEXT: MOV R2,#200
DV1: CPL P10
LCALL DELY500
DJNZ R2,DV1
CPL FLAG
SJMP START
DELY500: MOV R7,#250
LOOP: NOP
DJNZ R7,LOOP
RET
END
7. C语言源程序
#include <AT89X51H>
#include <INTRINSH>
bit flag;
unsigned char count;
void dely500(void)
{
unsigned char i;
for(i=250;i>0;i--)
{
_nop_();
}
}
void main(void)
{
while(1)
{
if(P1_7==0)
{
for(count=200;count>0;count--)
{
P1_0=~P1_0;
dely500();
}
for(count=200;count>0;count--)
{
P1_0=~P1_0;
dely500();
dely500();
}
}
}
}
//假设晶振12MHZ,P17控制蜂鸣器
#include "reg51h"
sbit FMQ=P1^7;
void main(void)
{
TMOD |= 0X10; //定时器1工作于方式1,16位定时器
TH1 = 0XFE; //定时器1定时时间=500uS
TL1 = 0X0C;
ET1 = 1; //使能定时器1中断
EA =1; //开总中断
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFE; //定时器1定时时间=500us
TL1 = 0X0C;
FMQ=!FMQ;
}
以上就是关于51单片机蜂鸣器响程序怎么写最简单的。全部的内容,包括:51单片机蜂鸣器响程序怎么写最简单的。、C51单片机流水灯蜂鸣器程序、求一个关于单片机的蜂鸣器的C语言程序,如果好,可行的话有追加分~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)