Advertisement

51单片机仿真——蜂鸣器

阅读量:
  • Proteus 原理图即解读

本次实验采用了新型无源蜂鸣器(500Hz~4.5KHz)。此设备的振荡源并非固定,在设计中可以通过软件进行参数配置。在选择设备时需注意区分有源与无源两种类型,在实际应用中尤其需要注意其工作原理间的区别在于是否具备振荡电路。简单来说就是频率可以调节。

蜂鸣器的运行机制基于接通和断开后,在特定引脚生成磁场并吸引铁片完成动作;当磁场消退后会恢复原状从而发出声音。原理图通过PNP型三极管在放大区发挥开关作用,并采用共发射极放大电路来控制磁场的变化过程。Ri在此电路中起输入电阻的作用,在此电路中输入电阻值越大,则放大电路所获取的有效输入电压越高。R1作为限流电阻,在这种情况下其主要功能是限制电流强度以保护蜂鸣器。另外因为蜂鸣器内部采用了电磁线圈结构,在断开电源时电流并不会立即消失因此为了消耗该残留电流我们会在输出端接上二极管进行处理

  • keil编程

为确保能够更精确地产生所需频率的声音,可以通过在烧录器软件中配置延时计时器模块来实现。该程序不会直接显示所输入的目标频率是因为执行每条指令都需要一定的时间消耗。由于我们设定的时间值相对较小,在实际应用中可能会带来较大的延迟影响。当延迟时间较大时(例如1ms),这种影响会变得不那么显著。

复制代码
 #include<reg51.h>

    
 #include<intrins.h>
    
 sbit BUZZ=P2^1;
    
 void Delay100us(unsigned int j);
    
 void HZ(unsigned int k)
    
 {
    
      int j;
    
 	j=10000/k/2; //由于计算时间是1/f,1的单位是s,在此取10000是换成有几个100us
    
 	Delay100us(j);
    
 }
    
  
    
 /*计算该频率下有多少个100us*/
    
 void Delay100us(unsigned int j)		//晶振@11.0592MHz
    
 {
    
 	unsigned char i;
    
      while(j--)
    
      {	_nop_();
    
 	     i = 43;
    
      	while (--i);
    
 	}
    
 }
    
 void main()
    
 {	while(1)
    
 	{
    
     	BUZZ=1;
    
 	    HZ(2500);
    
 	    BUZZ=0;
    
 	    HZ(2500);
    
 	}
    
 }
    
    
    
    
    代码解读
  • 个人程序和仿真调试过程中的错误点

未对自定义函数进行声明,在程序运行时会触发向上搜索机制;如果某个自定义函数未被提前声明,则应在前面部分进行声明,并附带分号。此外, 其格式与标准的函数头部相似.

2.while(--j)和while(j--)的差别。前者比后者少运行以此。

3.nop()是在intrins.h头文件中的,故应该定义。

4.示波器产生的疑问

疑点1:为什么呈现低电平时,电压是<0的?

全部评论 (0)

还没有任何评论哟~