在学习过程中遇到如下例题: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++);
}
void fengming() //蜂鸣函数,脉宽t = 1ms 周期T = 2ms 频率f = 0.5khz 实际发现延时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();
}
}
#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);
}
}
关键字:51单片机 无源蜂鸣器
引用地址:
51单片机驱动无源蜂鸣器
推荐阅读最新更新时间:2024-03-16 14:03
51单片机超声波测距仿真结果分析
制作51单片机超声波测距仪时,程序设计及试工作是一项重要内容,所设计的程序51单片机超声波测距程序只是在编译环境下通过编译,消除编程工作中产生的语法错误后,直接将程序写入单片机中与硬件一起进行联调,如果这时硬件设计制作是正确的还好说,只需要进行软件的调试修改,烧写到硬件环境中验证直到达到设计要求即可,但这个工作也是需要反复不停地修改程序并烧录到硬件单片机中进行调试,但如果说硬设计、制作及程序设计都存在问题,整个调试工作就显得无从下手,给软件调试、硬件故障排出带来非常大的困难,增加不少工作量,甚至造成整个超声波测距系统设计制作的失败。有好的解决办法吗?回答是肯定的,就是程序仿真,编译通过的程序,在Proteus环境下,按设计的硬件原
[单片机]
51单片机串口通信编程
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。 一、 pc机上的 串口通信编程过程如下: 1.建立项目 打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点);
[单片机]
基于51单片机控制的多路呼叫系统设计
随着信息技术的发展与医疗卫生事业的深化改革,国家金卫工程的实施使医院管理信息化的进程大大加快,医院的信息化建设取得了很大进展。医疗行业面对激烈竞争的市场,需要为病患者提供更人性化,更合理的服务,医疗资源的共享和信息化流程的简化,医疗部门办公网络化、自动化,实现全面信息共享已是大势所驱。越来约多的医院认识到,只有通过信息化建设,逐步建立信息化医院和医疗企业,才能支持医院的可持续发展,从而大力提高医院综合效益和运行效益。因此,设计一个支持医院病床呼叫,具有一条线缆传输多路呼叫信息的功能的系统,是非常必要的。 1 多路呼叫系统整体设计方案 该系统利用单片机的双机通信功能,设计出的具有呼叫、显示、应答等功能的多路呼叫系统,就是为满足中
[单片机]
51单片机定时器的原理与使用(二)
承接上一节 51单片机定时器的原理与使用 ,这节我们继续讲述怎么用定时器做一个电子钟,PWM脉冲和测电阻。先从实验三讲起吧! 实验三、定时器测电阻 测量如下图Rx的电阻并显示在数码管上。 测量思路为: 1、电容C1放电,P2.5与P2.6设置为输入模式,P2.7设置为推挽输出且为输出低电平0。这时候C1通过R1和P2.7放电。 2、切断C1的放电回路,将P2.7设为输入模式。 3、P2.5设为推挽输出,并且输出高电平5V,即P2.5的高电平通过Rk对C1充电。同时打开定时器Tx。 4、MCU不断读P2.7的状态,当P2.7为高,则关闭定时器。同时P2.5恢复输入模式。这个过程中定时器记录了P2.5通过Rk对C1充电直到P2.
[单片机]
51单片机(十五)—— 定时器模块介绍
STC89C516单片机内部有3个16位可编程的定时器/计数器,即定时器T0、T1和T2。它们既有定时又有计数功能。通过设置相关的特殊功能寄存器可以选择启动定时功能或计数功能。需要注意的是,这个定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部控制线连接并相互作用。CPU一旦开启定时功能后,定时器便在晶振的作用下自动开始计时,当定时器的计数器计满后,会产生中断,即通知CPU处理。 定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时器/计数器的工作方式寄存器,用来确定T0和T1的工作方式和功能;TCON是控制寄存器,控制T0和T1的启动和停止以及设置溢出标志。T
[单片机]
51单片机演示<世上只有妈妈好>音乐
//《世上只有妈妈好》51单片机C语言程序和音乐采灯程序 //此程序在硬件上调试通过 //本程序的单片机晶振采用11.0592MHZ //此程序的流水灯随音乐的节拍的快慢而动 #include reg51.h sbit speaker=P2^0; //接音频放大电路, //sbit speaker=P3^2; sbit sw=P3^0; //电后位后,sw合上后就开始放音乐,灯开始闪动,sw断开,音乐停止,灯也同时停止闪动 unsigned char timer0h,timer0l,time,led=1,j=0; unsigned char flagd=0; //世上只有妈妈好数据表 code
[单片机]
51单片机使用printf函数带参数打印不正常的解决办法
本人在调试STC8A8K64S4单片机时遇到一个很奇葩的问题,使用printf函数打印一个带参数的调试信息时出现异常,具体表现定义了8位的变量使用%X格式打印出的值却变成了16位,且赋值为0后任然打印出16位的随即数值。由于之前使用stm32单片机一直使用printf打印没有出现过类似情况,因此没有怀疑是函数问题而是怀疑是否为单片机某处寄存器设置错误。在看了很久手册之后没发现问题,最后自己写了一个带参数打印的函数发现数值没有错误。由于项目匆忙未继续深入探究原因,只能初步断定在51单片机使用printf函数带参数打印时数值不正常。 当然使用printf带参数打印调试是非常方便的,因此我尝试使用sprintf先将参数装到一个buf
[单片机]
基于51单片机的脑波治疗仪研制
O 引言 社会和科学技术的迅速发展给我们带来了高质量的生活,但在复杂而充满紧张的社会变革中,人们承受的压力也在增加,失眠、抑郁、狂躁、情绪不稳等许多身心问题日益严重。因此,研制一种有效的精神治疗仪具有重要的现实意义。研究发现,在某些频率下,尤其在α和θ范围内,以节奏性闪光去刺激人脑会减轻测试者的焦虑症状;同时,科学家们又对脑波的听觉驱动进行调查,即用特殊频率的声音(如节奏性滴答声、音调或漩涡声振动)来刺激大脑,然后再用EEG(electroencephalogram脑电图)设备来监视大脑,结果发现大脑的确在与声音相同频率下,以增加大脑活动来回应节奏性听觉刺激。研究发现,在声音和光的双重诱导作用下,大脑的两脑半球进入一种更结合或
[单片机]