一、实验目的
- 学习定时器的工作原理及使用方法。
- 学习如何使用单片机驱动蜂鸣器发声并利用定时器控制蜂鸣器发出不同频率的声音。
二、实验说明
本实验1:通过开关控制蜂鸣器发出单一频率声音,频率自定,持续时间1秒。
本实验2:通过开关控制蜂鸣器发出“叮咚”声,单片机响应定时器中断产生两种不同频率的声音(例如500Hz和700Hz),从而实现门铃的设计。要求叮、咚声音各持续0.5秒。通过本实验学生可以掌握蜂鸣器和定时器的工作原理及使用方法以及定时器的初始化程序、应用程序的编写和调试。
三、实验内容
1、掌握蜂鸣器的控制方法;
2、开关K1控制蜂鸣器发声,模拟门铃的工作。(注意开关抖动处理)
蜂鸣器发声原理
这里不过多赘述,需要更深入了解可以自行搜索,有更多更好的文章详细说明。
本次实验中运用的是无源蜂鸣器,由压片陶瓷构成,就是打火机中的垫片,可以通过挤压产生电流。反过来,给它通电也可以让它变形,如果只是直流电源没有变化,那它就只会变形一次,因此接上一种变化的矩形波,或者正弦波,它就会根据波形频率不断的变形,振动,然后就发声。
PS
作者使用的是普中A2板子做实验,因此P3口接开关,P2.5口接蜂鸣器,可以通过代码开头的伪代码自己修改哪个I/O口接蜂鸣器
由于板子的局限性,实验不能很好的展现效果,蜂鸣器工作时,led会点亮一颗是正常现象。
实验1代码
SWITCH EQU P3
BEEP EQU 0A5H;P2.5
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIMER0
ORG 001BH
AJMP TIMER1
;本次实验用到了两个计时器,T0用于蜂鸣器的发声,T1用于计时
MAIN:
MOV TMOD, #11H;0000 0001
SETB EA
SETB ET0
SETB ET1
MOV TL0,#00H
MOV TH0,#4CH;50ms
MOV TL1,#3CH
MOV TH1,#0FEH
;以上为基本定时器配置,需要注意这里并没有开启定时器,需等待第一个按键按下才会开启。
WATING_SWITCH:
MOV A, SWITCH
CJNE A, #0FFH,GET_SWITCH_VALUE
SJMP WATING_SWITCH
GET_SWITCH_VALUE:
MOV A, SWITCH
CJNE A, #0FFH, GET_SWITCH_VALUE
SETB TR0
SETB TR1
;这里按键按下并松开,开始计时和让蜂鸣器发声
SJMP WATING_SWITCH
SJMP $
TIMER0:
MOV TL0,#00H
MOV TH0,#4CH;50ms
INC R6
CJNE R6, #15H, TIMER0LAST;21
MOV R6, #00H
CLR TR0
CLR TR1
;经过了1s后关闭T0和T1
TIMER0LAST:
RETI
TIMER1:
MOV TL1,#3CH
MOV TH1,#0FEH
CPL BEEP
RETI
END
实验2代码
SWITCH EQU P3
BEEP EQU 0A5H;P2.5
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIMER0
ORG 001BH
AJMP TIMER1
MAIN:
MOV TMOD, #11H;0000 0001
SETB EA
SETB ET0
SETB ET1
MOV TL0,#00H
MOV TH0,#4CH;50ms
MOV TL1,#0BH
MOV TH1,#0FCH
WATING_SWITCH:
MOV A, SWITCH
CJNE A, #0FFH,GET_SWITCH_VALUE
SJMP WATING_SWITCH
GET_SWITCH_VALUE:
MOV A, SWITCH
CJNE A, #0FFH, GET_SWITCH_VALUE
SETB TR0
SETB TR1
SJMP WATING_SWITCH
SJMP $
TIMER0:
MOV TL0,#00H
MOV TH0,#4CH;50ms
INC R6
CJNE R6, #0BH, TIMER0LAST;11
MOV R6, #00H
INC R7
CJNE R7, #02H, TIMER0LAST
;因为要发出不同频率的声音,则计时器T1要每0.5s触发一次
;用R7记录触发次数并根据R7,T0中会填装不同的初值达到改变发声频率的效果
CLR TR0
CLR TR1
MOV R7, #00H
;结束的时候要将R7清零
TIMER0LAST:
RETI
TIMER1:
;根据R7填装不同的初值
CJNE R7, #00H, HZ700
MOV TL1,#0BH
MOV TH1,#0FCH
SJMP TIMER1LAST
HZ700:
MOV TL1,#33H
MOV TH1,#0FDH
TIMER1LAST:
CPL BEEP
RETI
END