
A32基于51单片机汇编语言上下限报警器Proteus设计
用51单片机汇编语言做一个上下限报警器:ADC0809采集IN0的模拟量(仿真里用电位器模拟温度传感器),数码管实时显示000~255的码值,低于下限只点亮低温指示灯、高于上限只点亮高温指示灯,同时蜂鸣器发出两种节奏不同的报警声。上下限都写在程序开头,改两个数就能改报警点。
一、设计实现功能
本设计功能简介:使用51单片机和汇编语言设计一个上下限报警器的proteus仿真,要求以下功能:
1、使用汇编语言编写程序。
2、ADC0809采集模拟量,三位数码管显示当前码值。
3、低于下限(默认77,约1.5V)时低温灯亮、蜂鸣器发低频节奏报警。
4、高于上限(默认153,约3.0V)时高温灯亮、蜂鸣器发急促节奏报警。
5、处于上下限之间时两灯全灭、蜂鸣器静音。
二、资源汇总
1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。
2、程序文件:main.asm汇编源码,以及编译好的cx.hex。
3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。
三、设计介绍
拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。
图1 Proteus仿真总览

这个设计一次用满了两个定时器,分工很清楚:
| 定时器 | 工作方式 | 用途 |
| T0 | 方式2(TMOD低4位=2) | 8位自动重装,TH0=245,溢出翻转P2.4给ADC0809当时钟 |
| T1 | 方式1(16位) | 1毫秒中断一次,翻转P3.7驱动蜂鸣器,同时数报警节奏 |
TMOD写成12H就是"T1方式1 + T0方式2"的组合,一个字节把两个定时器都配好。T1的初值65536-1000即0FC18H,1毫秒进一次中断。
上下限判断在ADC读完立刻做,用的是带借位减法:
`asm
WAIT: SETB H_ALM ;先熄灭两个报警灯
SETB L_ALM
CLR ST
SETB ST
CLR ST ;启动转换
JNB EOC,$
SETB OE
MOV ADC,P1
CLR OE
MOV A,ADC
SUBB A,#77 ;A-77,借位=低于下限
JC LALM
MOV A,H_TEMP
MOV R0,ADC
SUBB A,R0 ;153-ADC,借位=高于上限
JC HALM
CLR TR1 ;区间内,停报警
LJMP PROC`
两个报警点的码值换算:参考电压5V、8位分辨率,一个码值19.5毫伏,所以77≈1.5V、153≈3.0V。程序里上限用变量H_TEMP存放,下限是直接写在指令里的立即数77——想改下限得改SUBB A,#77这一句,改上限只要动MOV H_TEMP,#153。
报警声靠T1中断里的计数器分频,同一个500Hz方波,用不同的"响多久"区分高温和低温:
| 状态 | FLAG | 每个脉冲串的中断次数 | 听感 |
| 低温报警 | 0 | 30次(30毫秒) | 长一点的"滴" |
| 高温报警 | 1 | 20次(20毫秒) | 短促的"滴" |
| 正常 | — | TR1=0,定时器停 | 静音 |
中断里还有一层TCNTB计数,攒够25个脉冲串之后调一次DELAY2做停顿,于是变成"滴滴滴——停——滴滴滴"的循环。两个报警灯P3.0、P3.1是低电平点亮,进循环先SETB熄灭,判断成立再CLR点亮。
特别注意: 上下限判断前必须保证CY干净,本程序只在初始化时CLR C一次,正常流程里没有指令动CY所以能跑,但如果你在中间插了ADD、SUBB之类的运算,判断就会错——严谨写法是每次SUBB前都补一句CLR C;灯亮但没声音,先看SETB TR1有没有执行,再看P3.7上接的是不是无源蜂鸣器(有源蜂鸣器只会在电平变化时"咔"一声);读数始终是000,检查电位器抽头是不是接到了IN0、VREF+有没有接5V;报警点在临界值附近反复跳,是AD末位抖动,实际产品要加回差(比如低于77报警、高于82才解除)。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

