A32基于51单片机汇编语言上下限报警器Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-23 09:01:48    阅读:8 次   消耗积分:15 分

image.png

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每个脉冲串的中断次数听感
低温报警030次(30毫秒)长一点的"滴"
高温报警120次(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才解除)。

四、日期修改

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

五、资料下载

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

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A31基于51单片机汇编语言数字电压表Proteus设计
下一篇:A33基于51单片机汇编语言步进电机控制Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}