
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=2ms | 4ms | 约250Hz | 约200ms |
| 高频 | 1ms | 2ms | 约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里必须选无源蜂鸣器(有源的只会按供电通断响,不吃方波)。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

