历史上的今天
返回首页

历史上的今天

今天是: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


推荐阅读

史海拾趣

Advanced Linear Devices公司的发展小趣事

非常抱歉,我无法提供关于Advanced Linear Devices公司(ADI)在电子行业里发展起来的5个具体故事,因为每个故事都需要详细的事实支撑和背景研究。但我可以为你概述ADI公司的发展历程,并给出一些可能的发展故事框架,你可以基于这些框架进一步深入研究,以形成完整的故事。

首先,让我们回顾一下ADI公司的发展历程。ADI成立于1965年,由Ray Stata和他的合伙人共同创立,当时他们只是希望在模拟器件时代掌握自己的命运。经过几十年的发展,ADI已经从一家初创公司成长为半导体业的跨国巨头,其在模拟和数字信号处理领域的技术实力得到了全球认可。

基于这个概述,我可以给出以下几个可能的发展故事框架:

  1. 创业之初的艰辛与坚持:描述ADI创始人如何在地下室开始创业,面对资金短缺、技术难题和市场不确定性的挑战,他们如何凭借坚定的信念和不懈的努力,逐步建立起自己的公司。

  2. 技术创新的突破:讲述ADI如何在某个关键时期,通过研发出具有创新性的产品或技术,成功突破了行业瓶颈,实现了公司的快速发展。这可以涉及具体的技术细节和市场反响。

  3. 全球扩张与市场布局:描述ADI如何逐步拓展国际市场,通过设立海外研发中心、建立销售网络等方式,将公司的产品和服务推向全球,实现了从地区性公司到跨国巨头的转变。

  4. 应对行业变革的挑战:随着电子行业的不断发展,ADI也面临着来自竞争对手、市场变化和技术更新等多方面的挑战。可以讲述ADI如何灵活应对这些变革,通过调整战略、优化产品和提升服务质量等方式,保持了公司的竞争力。

  5. 与中国市场的深入合作:近年来,中国电子行业发展迅速,成为ADI等跨国企业的重要市场。可以讲述ADI如何与中国企业开展合作,共同推动技术创新和市场发展,实现了互利共赢的局面。

请注意,这些只是故事框架,具体的内容需要你根据ADI公司的历史资料、行业报告和新闻报道等进行深入研究和补充。在编写故事时,请确保只描述事实,避免加入个人主观评价或情感色彩。

Greenlee公司的发展小趣事

GREEGOO公司深知品牌建设对于企业发展的重要性。因此,公司投入大量资源用于品牌宣传和推广,通过赞助行业活动、举办产品发布会、开展公益活动等方式,不断提升品牌知名度和美誉度。同时,GREEGOO还注重产品质量的提升和售后服务的完善,以优质的产品和服务赢得消费者的信任和忠诚。这些努力使得GREEGOO在电子行业中树立了良好的品牌形象,品牌价值不断提升。

A1 PROS公司的发展小趣事

在2006年至2007年期间,A1 PROS的技术实力得到了业界的广泛认可。韩国技术信用保证基金将A1 PROS评选为杰出技术公司,这是对A1 PROS在技术研发和创新方面所取得成就的肯定。同时,A1 PROS还被韩国工业银行选定为家族企业,获得了更多的资金支持和发展机会。

Free2Move公司的发展小趣事

在2006年至2007年期间,A1 PROS的技术实力得到了业界的广泛认可。韩国技术信用保证基金将A1 PROS评选为杰出技术公司,这是对A1 PROS在技术研发和创新方面所取得成就的肯定。同时,A1 PROS还被韩国工业银行选定为家族企业,获得了更多的资金支持和发展机会。

ETA-USA公司的发展小趣事

随着业务的发展和市场的扩大,ETA-USA开始在全球范围内布局。公司先后在中国、欧洲等地设立了分公司或办事处,以更好地服务当地客户。这一全球扩张策略不仅增强了公司的市场竞争力,也为其带来了更多的商业机会和合作伙伴。

Aptiv公司的发展小趣事

随着自动驾驶技术的日益成熟,Aptiv开始加快全球布局的步伐。公司不仅在多个国家和地区设立了生产基地和研发中心,还与众多知名汽车厂商建立了紧密的合作关系。通过提供先进的自动驾驶解决方案和技术支持,Aptiv成功赢得了众多客户的信赖和认可,进一步扩大了在全球市场的份额。

问答坊 | AI 解惑

直流伺服电机闭环模块实例——电子设计大赛298驱动器

转载:ouravr 在2007年全国电子设计大赛的F题中,我们考虑到直流电机负载情况,认为所选电机在设计的工作模式下不会产生大于3安的电流,因此,放弃MOS管搭建H桥的常见方法,转而使用298直接驱动电机。我们采用了Ouravr邮购部购买的伺服电机,并对编 ...…

查看全部问答>

EasyARM2103教材

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 EasyARM2103教材~~~~~~~~~~~~  …

查看全部问答>

【藏书阁】电子线路实验 方建中

目录: 第一篇 模拟电路 实验一 常用电子仪器的使用 实验二 单级低频放大器的设计、安装与调试 实验三 集成运算放大器及其应用 实验四 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

    谁知道嵌入式精简TCP/IP协议有多大要用多大的flash/ram来存储,是不是单片机上有这个协议就可以实现网络通信了啊? 如果不行还需要什么啊?…

查看全部问答>

也谈家电产品之模糊控制技术(上)

本帖最后由 jameswangsynnex 于 2015-3-3 20:04 编辑 当今绚丽多彩的家电市场,产品最受关注的卖点莫过于“智能”、“人性化”、“全自动”等。从用户的角度来看,能配上如此美名的产品,应该是用户只需按触一个“START”开关,不论具体应用的对象 ...…

查看全部问答>

跪求一个电源设计

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 最好能够基于51单片机的。  …

查看全部问答>

求解430中断程序处理方法!!急啊

芯片MSP430F47197 SD16_A进行7路采样,32768晶振,OSR256,采样频率fs=32768*32/256=4096/s 采样的交流电压频率为50HZ,我的理解是每秒可采集4096个数据,而交流电每秒有50个周期, 理论上我每个周期的交流电可采集到4096/50=82个数据左右。 &n ...…

查看全部问答>

峰值检测

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 本人刚做的一个峰值检测电路模块,在小频率是还算准确,然而频率跳到1MHZ以上就误差太大,求高人指点·····  …

查看全部问答>