A28基于51单片机汇编语言蜂鸣器警报声Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-22 10:36:26    阅读:17 次   消耗积分:5 分

image.png

A28基于51单片机汇编语言蜂鸣器警报声Proteus设计

A21是"嘟嘟嘟"的间歇提示音,A28换成警报器:按住按键,蜂鸣器发出高低交替的连续警报声,低频档响约200毫秒、高频档响约100毫秒,循环不停,松手就停。整份程序没有一个定时器,全靠两个延时子程序凑音调,是最原始也最直观的方波发声写法。资料包含Proteus仿真文件和完整汇编源码。

一、设计实现功能

本设计功能简介:使用51单片机和汇编语言设计一个蜂鸣器警报声的proteus仿真,要求以下功能:

1、使用汇编语言编写程序。

2、按键接P3.7,按下时开始报警,松开停止。

3、P1.0驱动无源蜂鸣器,输出高低交替的两档方波,模拟警报声。

二、资源汇总

1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。

2、程序文件:main.asm汇编源码,以及编译好的cx.hex。

3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。

三、设计介绍

拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。

蜂鸣器接P1.0,按键接P3.7(低电平有效)。没有定时器、没有中断,程序结构就是一个大循环:按住键就在两段发声代码之间来回跑。

图1 Proteus仿真总览

仿真原理图

发声的骨架只有一句:CPL P1.0 + 延时。翻转一次引脚是半个周期,两次翻转是一个完整周期,周期决定频率:

`asm
DELY500:MOV R7,#250 ;基准延时
LOOP: NOP
DJNZ R7,LOOP
RET
`

NOP+DJNZ 在12MHz下大约3微秒一轮,250轮约750微秒,加上调用开销接近1毫秒——这就是"DELY500"这个名字的来历。调用一次是1毫秒,调用两次就是2毫秒,方波周期2毫秒,频率500Hz。

两段发声代码:

`asm
DV: MOV R2,#200 ;低频档
DV1: CPL P1.0
LCALL DELY500
LCALL DELY500 ;两个1ms=周期2ms=500Hz
DJNZ R2,DV1 ;200次×1ms=200ms
CPL FLAG

MOV R2,#200 ;高频档
DV2: CPL P1.0
LCALL DELY500 ;一个1ms=周期1ms=1kHz
DJNZ R2,DV2 ;200次×0.5ms=100ms
CPL FLAG
SJMP START
`

档位每半周期方波周期频率持续时间
低频2×1ms=2ms4ms约250Hz约200ms
高频1ms2ms约500Hz约100ms

FLAG这个标志位控制"这一轮走一段还是两段":JNB FLAG,NEXT 在FLAG=0时直接跳到高频段,FLAG=1时先走低频段再走高频段。所以实际听到的是"低—高—高—低—高—高"的循环,比单纯一个频率更像警报器。

想改成消防车那种"呜——呜——"的滑音,把两个档的频率差拉大(低频改成4毫秒半周期,高频改成1毫秒);想改成"滴——滴——"两声短促提示,把R2从200改成50,持续时间缩短到四分之一。

特别注意: 蜂鸣器不响,先看按键是不是接P3.7,程序里JB P3.7,START是"高电平就继续等",接错脚会一直等;声音是持续的"嘀"而不是交替,检查FLAG有没有在每段结束时CPL;音调明显偏高或偏低,是晶振频率和代码假设的12MHz不一致,延时循环的实际时长会跟着变;实物上声音很小,P1.0驱动能力只有几十微安,要加三极管或者用ULN2003;Proteus里必须选无源蜂鸣器(有源的只会按供电通断响,不吃方波)。

四、日期修改

资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。

五、资料下载

付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A27基于51单片机汇编语言6位数码管频率计Proteus设计
下一篇:A29基于51单片机汇编语言按键门铃Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}