单片机,8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,

单片机,8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,,第1张

//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,实现按下一个蜂鸣器响,按下另一个蜂鸣器停止程序、蜂鸣器程序修改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10084047.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存