/********************************************************************************************
* 功 能:利用P1.3输出高低电平来控制蜂鸣器蜂鸣。
* 硬件条件:1.CPU型号:AT89S52
* 2.晶振:12.000MHz
* 3.短接BEEP_P1.3
* 日 期:20xx年04月24号
*********************************************************************************************/
#include "reg52.h" // 包含头文件
/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char uint8; // 无符号8位整型变量
typedef signed char int8; // 有符号8位整型变量
typedef unsigned short uint16; // 无符号16位整型变量
typedef signed short int16; // 有符号16位整型变量
typedef unsigned int uint32; // 无符号32位整型变量
typedef signed int int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度)
typedef double fp64; // 双精度浮点数(64位长度)
/********************************************************************************************/
sbit P1_3 = P1 ^ 3; // 定义位变量
#define BEEP_ON() (P1_3=0) // 定义"BEEP_ON()"为P1.3输出低电平,控制蜂鸣器蜂鸣
#define BEEP_OFF() (P1_3=1) // 定义"BEEP_OFF()"为P1.3输出高电平,控制蜂鸣器不蜂鸣
/********************************************************************************************
* 函数名称:Delay()
* 功 能:软件延时
* 入口参数:count 延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count != 0)
{
for(i = 0; i < 125; i++); // ";" 表示空语句,CPU空转。
} // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}
/********************************************************************************************
* 函数名称:main()
* 功 能:利用P1.3输出高低电平来控制蜂鸣器蜂鸣。
*********************************************************************************************/
void main (void)
{
while(1) // 死循环
{
BEEP_ON(); // 蜂鸣器蜂鸣
Delay(200); // 延时
BEEP_OFF(); // 蜂鸣器不蜂鸣 Delay(200);
}
}
第二篇:实验二蜂鸣器控制实验
实验二蜂鸣器控制实验
实验材料(试用,仅供内部使用,有问题请及时联系)
电子科学与技术系童超
实验目的
1了解ARM处理器PWM接口的处理机制
2掌握在S3C2440A平台下进行PWM接口应用编程
实验设备
1硬件:SinoSys-EA2440a实验平台,PC机
2软件:ADS1.2开发工具,DNW工具
实验任务
实现功能:
1点击键盘的“+”号提高蜂鸣器频率,点击“-”号则降低频率。
2通过ADS1.2建立工程,编译。程序通过ICE仿真器调试。调试完成后通过DNW直接下载到实验板上运行。
实验原理
3.1概述
脉冲宽度调制(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,其广泛应用在从测量、通信到功率控制与变换的许多领域中,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是一种模拟控制方式,从物理意义上说,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,从实际使用上说,其通过高分辨率计数器,将方波的占空比来编码一个具体的模拟信号。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振软开关技术将会成为PWM控制技术发展的主要方向之一。
3.2S3C2440的PWM
由于PWM的实际应用和相关寄存器非常之多,因此本文仅仅介绍和使用本系统所使用的相关概念和使用方法。PWM控制器主要有4个特征:1、由5个16位定时器、2个8位预分频器以及2个4位分割器组成;2、拥有自动重载模式或者单击脉冲模式;3、可编程控制输出波形;4、死区发生器。其中除了定时器4以外,其余三个均具有脉宽调制(PWM)功能,定时器4仅仅是一个内部定时器,没有输出引脚。开发板定时器结构框图如下:
3.3PWM相关寄存器介绍
PWM的寄存器共有17个,相应的寄存器分为5组,分别为配置和模式选择寄存器(TCFG0~TCFG1),定时器计数缓存寄存器(TCNTB0~TCNTB4),定时器比较缓存寄存器(TCMPB0~TCMPB3),定时器控制寄存器(TCON),定时器计数观测寄存器(TCNTO0~TCNTO4)。
由于PWM寄存器相对较多,不需要全部使用,只需要使用系统需要的即可。本系统中最为重要的是TCNTB0和TCMPB0,TCNTB0决定着PWM的脉冲频率,而PWM的宽度则由TCMPB0决定。一般来说,如果要得到一个较高的PWM的输出值,就需要增加TCMPB0的值,如果说输出反转器被时能,那么增加和减少的结果也是反转的。基于双缓冲器的特性,下一个PWM周期的TCMPB0的值可以通过中断或者其他手段在当前PWM周期中任何一点写入。
3.4设置占空比和输出频率
报警器采用TOUT0作为其脉冲输入信号,通过修改TCFG0和TCFG1设置预分频值和计时器分割器的选择(可查询表3.2),占空比(rate)由TCNTB0和TCMPB0决定其值的计算公式如下:
div=PCLK/{prevalue+1}/{divvalue}/freq
{prevalue+1}=0~255由TCFG0决定
{divvalue}=2,4,6,8,16,32由TCFG1决定
rate={cmpvalue}/{tcnvalue}
最终的value由div和rate生成,即
value=div*rate//rate<1;
实验流程图(简化)分析如下,设置TCNTB0为180(70+110),设置TCMPB0为110,设置人工加载位、配置极性转换位。同时设置下一次TCNTB0为80(40+40),设置TCMPB0为40作为下一次定时的参数。定时器延迟一定时间后定时器下降计数器开始计数,当TCNTB0和TCMPB0数值一致时,TOUT0的逻辑将由低变高。当TCNTB0计数为0时,定时器中断打开,同时将寄存器数据更新,从而继续上一次操作。从而形成了下图的波形图,
此时报警器会根据所设置的频率发出不同大小的声音,已基本实现所要功能。
3.5蜂鸣器接口电路
系统的报警器电路就是由平台将S3C2440的定时器0的脉冲输出端口(TOUT0)GPB0与报警器的脉冲输入端口相连。在系统初始化时,就要进行I/O端口初始化,设置端口控制寄存器(将再下面讲到),将GPB0设置为工作方式1,并设置为输出状态。控制电路如图所示,
3.6实现过程和结果
参考\SourceCode\Interface\beep_test的程序。其中大部分的代码已经给出,请参考上面的原理和s3c2440的手册,写出实验代码并完成实验。