
//8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
#include <reg52h> //52系列单片机头文件
#include <intrinsh>
#define uint unsigned int //宏定义
#define uchar unsigned char
void delayms(uint); //声明子函数
sbit beep=P2^3;
uchar aa;
void main() //主函数
{
aa=0xfe; //赋初值11111110
while(1) //大循环
{
P1=aa;
beep=0;
delayms(500); //延时500毫秒
P1=0xff; //灭灯
beep=1;
delayms(500); //延时500毫秒
aa=_crol_(aa,1); //将aa循环左移1位后再赋给aa
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=115;j>0;j--);
}
//假设你是 按开关时为0电平
//具体IO口 自己配置
//简单的就可以这么写 如果要求消抖 我们再讨论
while(1)
{
if(k1==0)beep=1;
if(k2==0)beep=0;
}
你说的应该是无源蜂鸣器,需要外部提供脉冲信号才会发声,且声音会随脉冲频率变化而变化。而有源蜂鸣器内部有振荡器,所以只需要提供电压(高电平)就能发声,它们的原理不同,你提到的应该是前者。
举例说明吧,你定义 一个IO连接蜂鸣器。比如,sbit fmq=P1^0; 再来个500US延时函数。
void beep() //所以会产生1KHZ频率声音
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。我们开发板上常用的蜂鸣器就是常常说的交流蜂鸣器或直流蜂鸣器(自激式蜂鸣器)。 直流蜂鸣器是给一定的驱动直流电压就会响。而交流蜂鸣器是需要给蜂鸣器一个脉冲才会响。常见的有PWM波控制蜂鸣器的频率。脉冲就是高低电平的切换,如下图:一个方波脉冲
我们用单片机的IO口实现一种这样高低电平的方波,驱动蜂鸣器发音。我们板子上配的就是交流蜂鸣器。
接下来我们看一下蜂鸣器的硬件电路:
蜂鸣器通过三极管驱动。我们利用杜邦线将蜂鸣器的一端J8连接到板子上P15管脚上。
示例程序:
#include "reg52h"
#include "intrinsh"
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit beep = P1^5;
void delay(uint16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep = ~beep;
delay(10);
}
}
该程序实现蜂鸣器的响和停,程序较为简单,可以在此基础上进行扩展。
#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;
}
}
每隔一秒响一次, 响多久没有说
一般都是响一秒 停一秒。 这样就是20秒后关闭了。
可以写作
int cnt=0;while(cnt++<10)
{
BEEP=1;
delay_ms(1000);
BEEP=0;
delay_ms(1000);
}
unsigned char a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82,0xff};
//定时初值计算方法:以5ms为例,5ms=5000us,0xffff-5000/1085即为TH和TL的值
void int1() interrupt 3 //T1中断,时间是5ms
{
unsigned char d1,d2,d3,d4;
TR1=0; //关中断
TH1=0xed; //装定时器初值实现5ms定时
TL1=0xff;
ET1=1; //开中断
TR1=1;
d4=(d%60)%10; //分秒分开显示
d3=(d%60)/10;
d2=(d/60)%10;
d1=(d/60)/10;
if(d==0)//倒计时到0
{
d4=16;//清除显示
d3=16;
d2=16;
d1=16;
}
display(d1,d2,d3,d4);//显示函数
n++;
if((d<30)&&(d>0))//小于30秒 大于0秒
{
if(n<100)//05秒
{
Beep=Beep_ON;
led=Led_ON;
}
else
{
Beep=Beep_OFF;
led=Led_OFF;
}
}
if(n>=200)//d每隔1秒减1,实现倒记时,到时即报警
{
n=0;
if(d)
d--;
}
}
Alarm1为一个报警触发点,Status1和Hron1为相对应的报警状态和蜂鸣器输出,
Reset为复位按钮,Hron为总的蜂鸣器输出。
以上就是关于单片机,8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,全部的内容,包括:单片机,8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,、51单片机 使用两个独立按键k1,k2,实现按下一个蜂鸣器响,按下另一个蜂鸣器停止程序、蜂鸣器程序修改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)