A21基于51单片机汇编语言蜂鸣器嘟嘟嘟Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-22 10:36:06    阅读:18 次   消耗积分:5 分

image.png

A21基于51单片机汇编语言蜂鸣器嘟嘟嘟Proteus设计

用51单片机汇编语言做一个蜂鸣器"嘟嘟嘟"报警声:定时器0每1毫秒中断一次,累计250次得到0.25秒,靠一个标志位在"响"和"停"之间切换,响的时候P1.0输出500Hz方波,停的时候拉低静音,于是形成0.25秒响、0.25秒停的间歇报警。资料包含Proteus仿真文件和完整汇编源码,适合练定时器中断和方波发声。

一、设计实现功能

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

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

2、定时器0工作在方式1,产生1毫秒的定时中断。

3、P1.0驱动蜂鸣器,输出约500Hz方波,响0.25秒、停0.25秒循环。

二、资源汇总

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

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

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

三、设计介绍

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

蜂鸣器接在P1.0,另一端接地(仿真里用SOUNDER或BUZZER都行)。程序只用了一个定时器,没有用任何延时子程序,节奏完全由中断决定,这是它和A28警报声最大的区别:A28靠循环延时凑音调,A21靠定时中断凑节奏,主程序是一条SJMP $原地等。

图1 Proteus仿真总览

仿真原理图

定时器0的初值按1毫秒算(12MHz晶振,机器周期1微秒):

参数值说明
工作方式TMOD=01H方式1,16位定时器
计数次数10001毫秒 ÷ 1微秒
计数初值65536-1000=64536即 0FC18H
初值拆分TH0=0FCH,TL0=18H64536=0xFC18
中断入口0BHLJMP INT_T0
中断允许IE=82HEA=1、ET0=1

中断服务程序干两件事:重装初值,然后把TCOUNT加到250判断一次:

`asm
INT_T0: MOV TH0,#(65536-1000)/256
MOV TL0,#(65536-1000)MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#250,I1 ;250×1ms=0.25秒
CPL FLAG ;0.25秒到,响/停状态翻转
MOV TCOUNT,#00H
I1: JB FLAG,I2 ;FLAG=1跳到静音分支
CPL P1.0 ;FLAG=0:每1ms翻转一次=500Hz方波
SJMP RETUNE
I2: CLR P1.0 ;FLAG=1:一直拉低,不响
RETUNE: RETI
`

发声原理就一句话:周期1毫秒的方波=频率500Hz。中断每进一次翻转一次引脚,引脚上就是一个高低各1毫秒的方波,蜂鸣器听到的是500Hz的单音。0.25秒后FLAG翻转,进入静音分支把引脚钉在低电平,再等0.25秒又翻回来,于是"嘟——嘟——嘟"。

时间片FLAGP1.0 动作效果
0~0.25秒0每1ms翻转500Hz 响
0.25~0.5秒1恒为低静音
0.5~0.75秒0每1ms翻转500Hz 响
0.75~1秒1恒为低静音

想改节奏只动一个数:CJNE A,#250 里的250改成500就是0.5秒响、0.5秒停;改成125就是一秒四响的急促报警。想改音调就改定时初值,1000改成500(0.5毫秒)频率变1kHz,改成2000(2毫秒)频率变250Hz。

特别注意: 蜂鸣器不响先看是不是接了上拉或者驱动三极管(P1.0直接驱动无源蜂鸣器电流不够);声音是"滴"一声长音不停,说明FLAG没有翻转,检查CJNE A,#250这句是不是被改成别的值;频率明显偏低,核对晶振是不是12MHz,11.0592MHz下1毫秒初值不一样;Proteus里蜂鸣器分有源和无源,本设计要选无源(需要方波驱动),有源的给方波只会一直响。

四、日期修改

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

五、资料下载

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

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A20基于51单片机汇编语言按键秒表Proteus设计
下一篇:A22基于51单片机汇编语言独立按键LED台灯Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}