历史上的今天
今天是:2024年10月15日(星期二)
2021年10月15日 | STM8与汇编语言(17)--蜂鸣器
2021-10-15 来源:eefocus
蜂鸣器是现在单片机应用系统中很常见的,常用于实现报警功能。为此STM8特别集成了蜂鸣器模块,应用起来非常方便。
在应用蜂鸣器模块时,首先要打开片内的低速RC振荡器(应该也能使用外部的高速时钟,不过本人没实验过),其频率为128KHZ。然后通过设置蜂鸣器控制寄存器BEEP_CSR中的BEEPDIV[4:0]来获取8KHZ的时钟,再通过BEEPSEL最终产生1KHZ或2KHZ或4KHZ的蜂鸣器时钟,最后使能该寄存器中的BEEPEN位,产生蜂鸣器的输出。
下面的实验程序首先初始化低速振荡器,然后启动蜂鸣器,再延时2.5秒,然后关闭蜂鸣器。
同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。
stm8/
#include "mapping.inc"
#include "STM8S207C_S.INC"
; 定义堆栈空间的起始位置和结束位置
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
segment 'rom' ; 下面开始定义一个段,该段位于ROM中
main.l ; 定义复位后的第一条指令的标号(即入口地址)
;
; 首先要初始化堆栈指针
LDW X,#stack_end
LDW SP,X
LD A,CLK_ICKR
OR A,#$08
LD CLK_ICKR,A ; 打开芯片内部的低速振荡器LSI
WAIT_LSI_READY.L
LD A,CLK_ICKR
AND A,#$10
JREQ WAIT_LSI_READY ; 等待振荡器稳定
LD A,#$2e ; BEEPDIV[1:0] = 00
; BEEPDIV[4:0] = 0e
; BEEPEN = 1
; 输出频率 = Fls / ( 8 * (BEEPDIV + 2) )= 128K / (8 * 16) = 1K
LD BEEP_CSR,A ; 打开蜂鸣器
LD A,#10 ; 延时250MS*10
DELAY_1.L
PUSH A
LD A,#250 ; 延时250MS
CALL DELAY_MS
POP A
DEC A
JRNE DELAY_1
LD A,#$1E ; 关闭蜂鸣器
LD BEEP_CSR,A
MAIN_LOOP.L
JRA MAIN_LOOP
; 函数功能:延时
; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ
; 输出参数:无
; 返 回 值:无
; 备 注:无
DELAY_MS.L
PUSH A ; 将入口参数保存到堆栈中
LD A,#250 ; 寄存器A<-250,作为下面的循环数
DELAY_MS_1.L
NOP ; 用空操作指令进行延时4T
NOP
NOP
NOP
NOP
DEC A ; 寄存器A<-A-1,本条指令执行之间为1T
JRNE DELAY_MS_1 ; 若不等于0,则循环,
; 本条指令执行时间为2T(跳时)或1T(不跳时)
POP A ; 从堆栈中恢复入口参数
DEC A ; 将要延时的MS数-1
JRNE DELAY_MS ; 若不等于0,则循环
RET ; 函数返回
interrupt NonHandledInterrupt
NonHandledInterrupt.l
iret
; 下面定义中断向量表
segment 'vectit'
dc.l {$82000000+main} ; reset
dc.l {$82000000+NonHandledInterrupt} ; trap
dc.l {$82000000+NonHandledInterrupt} ; irq0
dc.l {$82000000+NonHandledInterrupt} ; irq1
dc.l {$82000000+NonHandledInterrupt} ; irq2
dc.l {$82000000+NonHandledInterrupt} ; irq3
dc.l {$82000000+NonHandledInterrupt} ; irq4
dc.l {$82000000+NonHandledInterrupt} ; irq5
dc.l {$82000000+NonHandledInterrupt} ; irq6
dc.l {$82000000+NonHandledInterrupt} ; irq7
dc.l {$82000000+NonHandledInterrupt} ; irq8
dc.l {$82000000+NonHandledInterrupt} ; irq9
dc.l {$82000000+NonHandledInterrupt} ; irq10
dc.l {$82000000+NonHandledInterrupt} ; irq11
dc.l {$82000000+NonHandledInterrupt} ; irq12
dc.l {$82000000+NonHandledInterrupt} ; irq13
dc.l {$82000000+NonHandledInterrupt} ; irq14
dc.l {$82000000+NonHandledInterrupt} ; irq15
dc.l {$82000000+NonHandledInterrupt} ; irq16
dc.l {$82000000+NonHandledInterrupt} ; irq17
dc.l {$82000000+NonHandledInterrupt} ; irq18
dc.l {$82000000+NonHandledInterrupt} ; irq19
dc.l {$82000000+NonHandledInterrupt} ; irq20
dc.l {$82000000+NonHandledInterrupt} ; irq21
dc.l {$82000000+NonHandledInterrupt} ; irq22
dc.l {$82000000+NonHandledInterrupt} ; irq23
dc.l {$82000000+NonHandledInterrupt} ; irq24
dc.l {$82000000+NonHandledInterrupt} ; irq25
dc.l {$82000000+NonHandledInterrupt} ; irq26
dc.l {$82000000+NonHandledInterrupt} ; irq27
dc.l {$82000000+NonHandledInterrupt} ; irq28
dc.l {$82000000+NonHandledInterrupt} ; irq29
end
下一篇:STM8 时钟寄存器
史海拾趣
|
转载:ouravr 在2007年全国电子设计大赛的F题中,我们考虑到直流电机负载情况,认为所选电机在设计的工作模式下不会产生大于3安的电流,因此,放弃MOS管搭建H桥的常见方法,转而使用298直接驱动电机。我们采用了Ouravr邮购部购买的伺服电机,并对编 ...… 查看全部问答> |
|
目录: 第一篇 模拟电路 实验一 常用电子仪器的使用 实验二 单级低频放大器的设计、安装与调试 实验三 集成运算放大器及其应用 实验四 OTL低频功率放大器 实验五 音频功率放大器的设计、安装与调试 实验六 集成稳压电源 实验七 LC振荡器 ...… 查看全部问答> |
|
电阻是有功率限制的,假若一个50R的电阻是1/8W,那么加在他两端的电压最大不能超过2.5V,此时流过的电流为0.05A,即50mA。那么一个电路要求的输入电阻必须是50R,输入电压却超过了2.5V。而你只能选1/8W电阻,那么可以像下面这样办! ...… 查看全部问答> |
|
mini2440 ov9650 wince6.0 应用程序 采集图像花屏!!~~~~求高手解答 int rc = 0; HANDLE hCam = CreateFile (TEXT(\"CIS1:\"), GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); //打开设备句柄 if (hCam == IN ...… 查看全部问答> |
|
谁知道嵌入式精简TCP/IP协议有多大要用多大的flash/ram来存储,是不是单片机上有这个协议就可以实现网络通信了啊? 如果不行还需要什么啊?… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:04 编辑 当今绚丽多彩的家电市场,产品最受关注的卖点莫过于“智能”、“人性化”、“全自动”等。从用户的角度来看,能配上如此美名的产品,应该是用户只需按触一个“START”开关,不论具体应用的对象 ...… 查看全部问答> |
|
芯片MSP430F47197 SD16_A进行7路采样,32768晶振,OSR256,采样频率fs=32768*32/256=4096/s 采样的交流电压频率为50HZ,我的理解是每秒可采集4096个数据,而交流电每秒有50个周期, 理论上我每个周期的交流电可采集到4096/50=82个数据左右。 &n ...… 查看全部问答> |




