收藏 分享(赏)

蜂鸣器驱动模块.doc

上传人:kpmy5893 文档编号:9337979 上传时间:2019-08-02 格式:DOC 页数:8 大小:60KB
下载 相关 举报
蜂鸣器驱动模块.doc_第1页
第1页 / 共8页
蜂鸣器驱动模块.doc_第2页
第2页 / 共8页
蜂鸣器驱动模块.doc_第3页
第3页 / 共8页
蜂鸣器驱动模块.doc_第4页
第4页 / 共8页
蜂鸣器驱动模块.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、蜂鸣器驱动模块在单片机应用的设计上,很多方案都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下、开始工作、工作结束或是故障等等。这里对中颖电子的单片机在蜂鸣器驱动上的应用作一下描述。1. 驱动方式由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音,很简单,这里就不对自激蜂鸣器进行说明了。这里只对必须用1/2duty 的方波信号进行驱动的他激蜂鸣器进行说明。单片机驱动他激蜂鸣器的方式有两种:一种是PWM 输出口直接驱动,另一种是利用I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动。PWM 输出口直接驱动是

2、利用PWM 输出口本身可以输出一定的方波来直接驱动蜂鸣器。在单片机的软件设置中有几个系统寄存器是用来设置PWM 口的输出的,可以设置占空比、周期等等,通过设置这些寄存器产生符合蜂鸣器要求的频率的波形之后,只要打开PWM 输出,PWM 输出口就能输出该频率的方波,这个时候利用这个波形就可以驱动蜂鸣器了。比如频率为2000Hz 的蜂鸣器的驱动,可以知道周期为500s,这样只需要把PWM 的周期设置为500s,占空比电平设置为250s,就能产生一个频率为2000Hz 的方波,通过这个方波再利用三极管就可以去驱动这个蜂鸣器了。而利用I/O 定时翻转电平来产生驱动波形的方式会比较麻烦一点,必须利用定时器

3、来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为2500Hz 的蜂鸣器的驱动,可以知道周期为400s,这样只需要驱动蜂鸣器的I/O 口每200s 翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了。2. 蜂鸣器驱动电路由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。蜂鸣器的驱动电路有很多种,这里举两个常用的例子,也是建议使用的驱动电路:1.1. 无源压电式蜂鸣器、无源电磁式蜂鸣器(他激)图1-1

4、无源压电式蜂鸣器、无源电磁式蜂鸣器驱动电路1.2. 有源压电式蜂鸣器、有源电磁式蜂鸣器(自激)图1-2 有源压电式蜂鸣器、有源电磁式蜂鸣器驱动电路3. 蜂鸣器驱动设计由于这里要介绍两种驱动方式的方法,所以在设计模块系统中将两种驱动方式做到一块,即程序里边不仅介绍了PWM 输出口驱动蜂鸣器的方法,还要介绍I/O 口驱动蜂鸣器的方法。所以,我们将设计如下的一个系统来说明单片机对蜂鸣器的驱动:系统有两个他激蜂鸣器,频率都为2000Hz,一个由I/O 口进行控制,另一个由PWM 输出口进行控制;系统还有两个按键,一个按键为PORT 按键,I/O 口控制的蜂鸣器不鸣叫时按一次按键I/O 口控制的蜂鸣器鸣

5、叫,再按一次停止鸣叫,另一个按键为PWM 按键,PWM 口控制的蜂鸣器不鸣叫时按一次按键PWM输出口控制的蜂鸣器鸣叫,再按一次停止鸣叫。 电路原理图如图1-3 所示,使用SH69P43 为控制芯片,使用4MHz 晶振作为主振荡器。PORTC.3/T0 作为I/O 口通过三极管Q2 来驱动蜂鸣器LS1,而PORTC.2/PWM0 则作为PWM 输出口通过三极管Q1 来驱动蜂鸣器LS2。另外在PORTA.3 和PORTA.2 分别接了两个按键,一个是PWM 按键,是用来控制PWM 输出口驱动蜂鸣器使用的;另一个是PORT 按键,是用来控制I/O 口驱动蜂鸣器使用的。连接按键的I/O 口开内部上拉电

6、阻。图1-3 SH69P43 驱动蜂鸣器原理图 软件设计方法先分析一下蜂鸣器。所使用的蜂鸣器的工作频率是2000Hz,也就是说蜂鸣器的驱动信号波形周期是500s,由于是1/2duty 的信号,所以一个周期内的高电平和低电平的时间宽度都为250s。软件设计上,我们将根据两种驱动方式来进行说明。a) PWM 输出口直接驱动蜂鸣器方式由于PWM 只控制固定频率的蜂鸣器,所以可以在程序的系统初始化时就对PWM 的输出波形进行设置。首先根据SH69P43 的PWM 输出的周期宽度是10 位数据来选择PWM 时钟。系统使用4MHz 的晶振作为主振荡器,一个tosc 的时间就是0.25s,若是将PWM 的时

7、钟设置为tosc 的话, 则蜂鸣器要求的波形周期500s 的计数值为500s/0.25s=(2000)10=(7D0)16,7D0H 为11 位的数据,而SH69P43 的PWM输出周期宽度只是10 位数据,所以选择PWM 的时钟为tosc 是不能实现蜂鸣器所要的驱动波形的。这里我们将PWM 的时钟设置为4tosc,这样一个PWM 的时钟周期就是1s 了,由此可以算出500s 对应的计数值为500s/1s=(500)10=(1F4)16,即分别在周期寄存器的高2 位、中4 位和低4 位三个寄存器中填入1、F 和4,就完成了对输出周期的设置。再来设置占空比寄存器,在PWM 输出中占空比的实现是通

8、过设定一个周期内电平的宽度来实现的。当输出模式选择为普通模式时,占空比寄存器是用来设置高电平的宽度。250s 的宽度计数值为250s/1s=(250)10=(0FA)16。只需要在占空比寄存器的高2 位、中4 位和低4 位中分别填入0、F 和A 就可以完成对占空比的设置了,设置占空比为1/2duty。以后只需要打开PWM 输出,PWM 输出口自然就能输出频率为2000Hz、占空比为1/2duty 的方波。b) I/O 口定时翻转电平驱动蜂鸣器方式使用I/O 口定时翻转电平驱动蜂鸣器方式的设置比较简单,只需要对波形分析一下。由于驱动的信号刚好为周期500s,占空比为1/2duty 的方波,只需要

9、每250s 进行一次电平翻转,就可以得到驱动蜂鸣器的方波信号。在程序上,可以使用TIMER0 来定时,将TIMER0 的预分频设置为/1,选择TIMER0 的始终为系统时钟(主振荡器时钟/4),在TIMER0 的载入/计数寄存器的高4 位和低4 位分别写入00H 和06H,就能将TIMER0 的中断设置为250s。当需要I/O 口驱动的蜂鸣器鸣叫时,只需要在进入TIMER0 中断的时候对该I/O 口的电平进行翻转一次,直到蜂鸣器不需要鸣叫的时候,将I/O 口的电平设置为低电平即可。不鸣叫时将I/O 口的输出电平设置为低电平是为了防止漏电。 程序以下是带有两种驱动方式的蜂鸣器驱动模块程序,其中黄

10、色背景的内容是关于I/O 口定时翻转电平驱动方式的,绿色背景的内容则是关于PWM 输出口直接驱动方式的:例1-1LIST P=69P43ROMSIZE=3072;*; 系统寄存器;*IE EQU 00H ;中断使能标志IRQ EQU 01H ;中断请求标志TM0 EQU 02H ;Timer0 模式寄存器TL0 EQU 04H ;Timer0 装入/记数寄存器低四位TH0 EQU 05H ;Timer0 装入/记数寄存器高四位PORTA EQU 08H ;Port A 数据寄存器PORTC EQU 0AH ;Port C 数据寄存器TBR EQU 0EH ;查表寄存器INX EQU 0FH ;

11、间接寻址伪索引寄存器DPL EQU 10H ;INX 数据指针低四位DPM EQU 11H ;INX 数据指针中三位DPH EQU 12H ;INX 数据指针高三位PACR EQU 18H ;PortA 输入/输出控制寄存器PCCR EQU 1AH ;PortC 输入/输出控制寄存器PWM0 EQU 20H ;位0:选择PWM 输出, 位2-1:设置PWM0 时钟, 位3:设置PWM0 占空比输出模式PP0L EQU 22H ;PWM0 周期低四位PP0M EQU 23H ;PWM0 周期中四位PP0H EQU 24H ;PWM0 周期高二位PD0L EQU 25H ;PWM0 占空比低四位P

12、D0M EQU 26H ;PWM0 占空比中四位PD0H EQU 27H ;PWM0 占空比高二位;*; 用户定义寄存器(Bank0);*AC_BAK EQU 30H ;AC 值备份寄存器PA_BAK EQU 31H ;PortA 缓冲寄存器PC_BAK EQU 32H ;PortC 缓冲寄存器TMP_T0 EQU 33H ;临时寄存器用于TIMER0;-F_TIMER EQU 34H;位0=1, 5ms 到FLAG1 EQU 35H;位0=1, 按键未松开;位3=1, 需使用I/O 口驱动蜂鸣器;-KCODE_NEW EQU 36H ;旧的按键码KCODE_OLD EQU 37H ;新的按键

13、码KEYS_CT EQU 38H ;按键扫描次数;-T5MS_CT1 EQU 39H ;5ms 计数器低位T5MS_CT2 EQU 3AH ;5ms 计数器高位;*; 程序;*ORG 0000HJMP RESETRTNIJMP TIMER0_ISPRTNIRTNI;*; 子程序: TIMER0 中断服务程序(250us 中断);*TIMER0_ISP:STA AC_BAK,00H ;备份AC 值ANDIM IRQ,1011B ;清TIMER0 中断请求标志;*; 模块: I/O 口驱动蜂鸣器模块;*PORT_BUZ:ADI FLAG1,1000BBA3 PORT_BUZ_NO ;不需要I/O

14、口驱动蜂鸣器,跳转EORIM PC_BAK,1000BSTA PORTC,00H ;PORTC.3 翻转电平JMP PORT_BUZ_ENDPORT_BUZ_NO:ANDIM PC_BAK,0111BSTA PORTC,00H ;PORTC.3 口驱动的蜂鸣器未鸣叫时,输出低电平以保证不漏电PORT_BUZ_END:;*J5MS: ;判断5ms到SBIM T5MS_CT1,01HLDI TMP_T0,00HSBCM T5MS_CT2,00HOR T5MS_CT1,00HBNZ TIMER0_ISP_END ;5ms 未到,跳转LDI T5MS_CT1,04HLDI T5MS_CT2,01H ;

15、重新加载5ms 计数值ORIM F_TIMER,0001B ;设置“5ms 到“标志TIMER0_ISP_END:LDI IE,0100B ;开TIMER0 中断LDA AC_BAK,00H ;恢复AC 值RTNI ;返回;*; 上电程序;*RESET:NOP;-; 清用户寄存器POWER_RESET:LDI DPL,00HLDI DPM,02HLDI DPH,00HPOWER_RESET_1:LDI INX,00HADIM DPL,01HLDI TBR,00HADCM DPM,00HBA3 POWER_RESET_2JMP POWER_RESET_3POWER_RESET_2:ADIM DP

16、H,01HPOWER_RESET_3:SBI DPH,01HBNZ POWER_RESET_1SBI DPM,04HBNZ POWER_RESET_1;-; 初始化系统寄存器SYSTEM_INITIAL:;TIMER0 初始化LDI TM0,07H ;设置TIMER0 预分频为/1LDI TL0,06HLDI TH0,00H ;设置中断时间为250usLDI T5MS_CT1,04HLDI T5MS_CT2,01H;I/O 口初始化LDI PORTC,0011BLDI PCCR,1100B ;设置PORTC.2 和PORTC.3 为输出口LDI PORTA,0FH ;打开PORTA 上拉电阻;

17、PWM 初始化LDI PWM0,04H ;设置PWM0 时钟为4tosc,占空比输出模式为正常模式LDI PP0H,01HLDI PP0M,0FHLDI PP0L,04H ;设置周期为500usLDI PD0H,00HLDI PD0M,0FHLDI PD0L,0AH ;设置占空比电平为250us,得频率为2KHz,占空比为1/2duty 的;信号;-MAIN_PRE:LDI IRQ,00HLDI IE,0100B ;打开Timer0 中断;*MAIN:ADI F_TIMER,0001BBA0 HALTMODE ;未到5ms, 跳转ANDIM F_TIMER,1110B ;清“5ms 到“标志;

18、*; 按键扫描;*KEYSCAN:LDA PORTA,00HSTA TBR,00HSBI TBR,0FHBAZ NO_KEY ;没有扫描到按键按下,跳转LDA FLAG1,00HBA0 KEYSCAN_END ;之前的按键未松开,不再扫描按键,跳转SBI TBR,0111BBAZ KS_PORT ;PORT 键按下,跳转SBI TBR,1011BBAZ KS_PWM ;PWM 键按下,跳转JMP KEYSCAN_ENDKS_PORT:LDI KCODE_NEW,0001B ;设置PORT 键的键码为01HJMP KEYSCAN_1KS_PWM:LDI KCODE_NEW,0010B ;设置PW

19、M 键的键码为02HKEYSCAN_1:ADIM KEYS_CT,01H ;扫描次数加一SBI KEYS_CT,01HBAZ KEYSCAN_2 ;第一次扫描到该按键,无需与旧按键进行比较,跳转LDA KCODE_OLD,00HSUB KCODE_NEW,00H ;新扫描的按键码与上次扫描的按键码比较BAZ KEYSCAN_2 ;同一个按键,跳转LDI KEYS_CT,01H ;不是同一按键,将扫描次数置为1,为新按键KEYSCAN_2:LDA KCODE_NEW,00HSTA KCODE_OLD,00H ;将新的按键码赋值给旧的按键码SBI KEYS_CT,0AHBNC KEYSCAN_EN

20、D ;扫描未到10 次(50ms), 跳转;已扫描到该按键10 次LDI KEYS_CT,00H ;清按键扫描次数ORIM FLAG1,0001B ;设置“按键未松开“标志LDA KCODE_OLD,00HBA0 KEY_PORTKEY_PWM: ;PWM 键EORIM PWM0,0001B ;PWM 输出开启或关闭,PWM 口驱动的蜂鸣器鸣叫或停止JMP KEYSCAN_ENDKEY_PORT: ;PORT 键EORIM FLAG1,1000B ;I/O 定时翻转电平开启或停止翻转;I/O 口驱动的蜂鸣器鸣叫或停止JMP KEYSCAN_ENDNO_KEY:ANDIM FLAG1,1110B ;清“按键未松开“标志LDI KEYS_CT,00H ;清按键扫描次数KEYSCAN_END:;*HALTMODE:NOPHALT ;进入HALT 模式NOPNOPJMP MAINEND_

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报