在学习过程中遇到如下例题:8个发光管由上至下距离1s活动,其间每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时封闭蜂鸣器,一向重复下去。
流水灯的程序相对我个人来说比较简略,可是蜂鸣器有些难度,正常给I/0口一个信号,蜂鸣器已然不响,后经查验是无源蜂鸣器;
无源的蜂鸣器,就要经过IO口输出振动信号来驱动蜂鸣器
蜂鸣器简介:蜂鸣器依据结构不同分为压电式蜂鸣器和电磁式蜂鸣器;而两种蜂鸣器又分为有源蜂鸣器和无源蜂鸣器,这儿的源特指振动源;有源蜂鸣器直接加电就能够响起,无源蜂鸣器需求咱们给供给振动源。抱负的振动源为必定频率的方波。
因为体系选用了无源蜂鸣器,所以需求咱们经过编程来操控I/0口的翻转来发生必定频率的方波信号。本文选用默许频率0.5KHZ的规范方波。能够算出周期T = 2ms脉宽t = 1ms,因而咱们能够经过简略的延时函数延时1ms。然后操控P3.7口的电平凹凸发生0.5KHZ的方波信号;
本程序仅仅经过简略延时抵达驱动蜂鸣器的作用。
#include
sbit buzzer = P1^5;
void delayms(unsigned int xms)//延时函数,延时xms
{
unsigned int i , j;
for(i = 0; i < xms; i++)
for(j = 0; j < 110; j++);
}
{
unsigned int i , j;
for(i = 0; i < xms; i++)
for(j = 0; j < 110; j++);
}
void fengming()//蜂鸣函数,脉宽t = 1ms周期T = 2ms频率f = 0.5khz实践发现延时1ms的时分作用最好
{
buzzer = 0; //给P1.5口送低电平
delayms(1);//延时1ms
buzzer = 1;//给P1.5口送高电平
delayms(1);//延时1ms
}
{
buzzer = 0; //给P1.5口送低电平
delayms(1);//延时1ms
buzzer = 1;//给P1.5口送高电平
delayms(1);//延时1ms
}
假如去掉delay(1);那么你的蜂鸣器操控端状况大约在2us左右翻转一次(晶振12M,12T单片机),这个时刻关于驱动电路和蜂鸣器来讲都是很短的,能够浅显的了解成他们没反应过来,还没到最响的时分就被关掉了,加上延时之后明显能够让它抵达峰值,所以就能听到更响。
void main()
{
while(1)
{
fengming();
}
}
{
while(1)
{
fengming();
}
}
#include
#define uint unsigned int
#define uchar unsigned char
sbit buzzer=P1^5;
sbit D1=P1^0;
void delay(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x–)
{
for(y=0;y<114;y++)
{
}
}
}
fasheng() //发声子程序
{
unsigned int a,x;
for (a=0;a<456;a++)
{
buzzer=!buzzer;
for (x=0;x<45;x++); //45为蜂鸣器发声频率
}
}
void main()
{
while (1)
{
D1=0;
fasheng();
D1=1;
delay(200);
}
}