于这里要介绍两种驱动方式的方法,所以在设计模块系统中将两种驱动方式做到一块,即程序里边不仅介绍了PWM 输出口驱动蜂鸣器的方法,还要介绍I/O 口驱动蜂鸣器的方法。所以,我们将设计如下的一个系统来说明单片机对蜂鸣器的驱动:系统有两个他激蜂鸣器,频率都为2000Hz,一个由I/O 口进行控制,另一个由PWM 输出口进行控制;系统还有两个按键,一个按键为PORT 按键,I/O 口控制的蜂鸣器不鸣叫时按一次按键I/O 口控制的蜂鸣器鸣叫,再按一次停止鸣叫,另一个按键为PWM 按键,PWM 口控制的蜂鸣器不鸣叫时按一次按键PWM输出口控制的蜂鸣器鸣叫,再按一次停止鸣叫。
首先根据SH69P43 的PWM 输出的周期宽度是10 位数据来选择PWM 时钟。系统使用4MHz 的晶振作为主振荡器,一个tosc 的时间就是0.25μs,若是将PWM 的时钟设置为tosc 的话, 则蜂鸣器要求的波形周期500μs 的计数值为500μs/0.25μs=(2000)10=(7D0)16,7D0H 为11 位的数据,而SH69P43 的PWM
输出周期宽度只是10 位数据,所以选择PWM 的时钟为tosc 是不能实现蜂鸣器所要的驱动波形的。
这里我们将PWM 的时钟设置为4tosc,这样一个PWM 的时钟周期就是1μs 了,由此可以算出500μs 对应的计数值为500μs/1μs=(500)10=(1F4)16,即分别在周期寄存器的高2 位、中4 位和低4 位三个寄存器中填入1、F 和4,就完成了对输出周期的设置。再来设置占空比寄存器,在PWM 输出中占空比的实现是
而利用I/O 定时翻转电平来产生驱动波形的方式会比较麻烦一点,必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为2500Hz 的蜂鸣器的驱动,可以知道周期为400μs,这样只需要驱动蜂鸣器的I/O 口每200μs 翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了。折叠编辑本段驱动电路由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的*(但AVR可以驱动小功率蜂鸣器),所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。