H32基于51单片机四路电压采集报警器proteus设计,keil程序,c语言,AT89C51,课题设计,设计报告
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-31 12:41:12    阅读:25 次   消耗积分:0 分

基于51单片机设计四路电压采集与超限报警装置,proteus仿真加keil工程,ADC0809分时采集四路直流电压、数码管循环显示通道号与电压值、按键设定上下限、超限声光报警,附设计报告、程序流程说明与视频讲解。

H32基于51单片机四路 图1

01 设计任务

功能介绍:

使用51单片机设计一个四路电压采集报警器,ADC0809 并行采集、数码管显示、超限报警,要求如下:

1、四路电压输入(四个电位器 RV1~RV4,0~5V),ADC0809 的四个模拟输入通道 IN0~IN3 分时采集;

2、2×2 矩阵按键 K1~K4 选通道:按哪个键就采集哪一路,数码管第一位的通道号跟着变;

3、数码管显示"通道 _ 电压":如"0 _ 2.5"表示第 0 路电压 2.5V——中间一位显示下划线分隔,电压个位自带小数点,一位不浪费;

4、超限报警:当前通道电压超过 4.0V,报警 LED 点亮;降回来自动熄灭;

5、采集持续循环进行,按键切换通道立即生效,电压一变显示跟着变——一个简化版的"多路数据采集器"。

 特别注意:ADC0809 和 H22 用过的 ADC0832 是模数转换器的两大门派:0832 是 SPI 三线接口的串行 ADC,0809 是并行总线 ADC——8 位数据口直连单片机,START 启动、EOC 报完成、OE 放行读数,时序全在引脚上看得见。还有个更关键的坑:ADC0809 没有内部时钟,必须外部喂 CLOCK!51 自己怎么匀出一个时钟信号?答案是用定时器中断翻转 IO,02 节细讲——这个"芯片没时钟我来供"的套路,遇到老芯片经常用得上。

02 定时器方式 2:专门"喂时钟"的用法

先看这期定时器的配置,和之前所有项目都不一样:

定时器 0 被配置成方式 2(8 位自动重装):TMOD 低四位写 0x02,TH0 和 TL0 都装 256 减 50,溢出周期就是 50μs;同时打开总中断 EA、定时器 0 中断 ET0,并启动 TR0。中断服务函数里只做一件事——翻转 ADC_CLK 引脚,不判断标志位、不掺业务逻辑。TH0 的值在每次溢出后由硬件自动装回 TL0,中断里不用再手写重装初值,这是方式 2 相对方式 1 最省事的地方。

三个要点:

① 方式 2 是自动重装——溢出后 TH0 的值自动装载进 TL0,中断里一行重装初值都不用写(对比前面 H24/H26 每次中断都手写 TH0=...;TL0=... 的方式 1)。要产生"非常规律、永不间断"的信号,方式 2 就是为它准备的。

② 初值 256-50 → 50μs 溢出一次,中断里翻转 IO,一个完整的时钟周期就是 100μs——10kHz,正好落在 ADC0809 要求的 10~128kHz 时钟区间内。

③ 中断函数里只有一句 ADC_CLK = ~ADC_CLK——没有标志位、没有业务逻辑,这个定时器别无他职,就是给 ADC 当节拍器。

这个"单片机自己造时钟"的思路很通用:ADC0809/0808、部分 LED 驱动芯片、步进电机拍频……凡是需要稳定慢时钟的老器件,都可以让一个定时器中断专职翻转 IO 来喂。代价是每 50μs 进一次中断占点 CPU,但换来的是不外加晶振/振荡器的简洁。

03 ADC0809 的并行时序:START、EOC、OE 三步走

采集一个通道的完整流程封装在 ADC_GET() 里:

函数进来先按通道号设置两根地址线:ADD A、ADD B 取 00、01、10、11 时分别选中 IN0 到 IN3,四路通道就用这四种组合穷举完。选好通道后先给 START 一个正脉冲(拉低、拉高、再拉低)通知芯片开始转换;转换期间 EOC 保持低电平,程序用一个 while 循环原地等它变高;确认转换结束后把 OE 置 1,转换结果才被放上 8 位数据总线,这时直接读数据口就拿到 0 到 255 的原始值。整个流程就是「选通道、启动、等 EOC、开 OE、读数据」五步。

对照 ADC0809 的时序图看三步:START 打一个正脉冲(高→低)通知芯片开始转换;转换期间 EOC 保持低电平,完成后拉高——while(ADC_EOC==0) 就是原地等它(阻塞式读取,简单可靠,本设计采集节奏慢,够用);OE 置 1 后转换结果才放上 8 位数据总线,单片机直读。

通道选择就是 ADD A、ADD B 两根地址线的电平组合(00/01/10/11 → IN0~IN3)。0809 其实有三位地址(ADD C)可以选 8 路,本设计只用 4 路,ADD C 接地不接——用几路接几位,剩下的固定电平,这是按需裁剪的接线思路。

04 电压换算:一行整数运算的讲究

从 ADC 读回的是 0~255 的原始值,换算成"放大十倍的电压"只用一行:

先把当前通道的原始读数取回来,再按 (255 减原始值) 乘 50 除 255 算成放大十倍的电压值。这里有两个讲究:一是要先用 255 去减,因为这个电路里电压越高、读数反而越小;二是全程用整数运算、把结果放大十倍,显示时再点小数点,避免在 51 上跑浮点——8 位机的浮点库又慢又占空间,能用整数解决就别碰它。

拆开看三个细节:

① (255-x) 为什么倒过来? 仿真里电位器的分压方向与 ADC 采样极性相反——电位器拧到头读出 0,拧到另一头读出 255,所以先取反再换算。实物接线方向一致时直接用 x*50/255。拿到陌生的 ADC 电路,先转一圈电位器看读数方向,再决定要不要取反,这比背公式管用。

② *50/255 是"放大十倍"的整数换算:5V 量程对应满码 255,电压 = x/255*5V,放大 10 倍就是 x/255*50。全程 unsigned int 整数运算,不碰浮点——51 没有浮点硬件,一次 float 乘除要拉进几百个周期的库函数。

③ 显示端"借位不借屏":电压个位那一位的段码 &0x7f 强行点亮小数点(共阳低电平点亮),2.5V 就显示成"2."和"5"两位——放大十倍的整数 25,配上手点的小数点,浮点数的效果就出来了。中间那位显示 0xf7(只亮 d 段)当下划线分隔符,把"通道号"和"电压值"分开。

05 选通道与报警:2×2 矩阵 + 一行比较

通道切换用一个 2×2 矩阵键盘(行 H1/H2、列 L1/L2,先扫第一行再扫第二行、10ms 消抖),键值 1~4 减一变通道号 0~3——按键值就是通道号,一行赋值完成切换。

报警同样干脆:if(ADC_voltage>40) LED=0; else LED=1;——电压放大十倍后和 40(即 4.0V)比较,超限亮灯、回降自灭。没有锁存、没有滞回,作为演示足够;实际工程要防"电压在 4.0V 附近抖动导致灯闪",加一个回差(超过 4.0 报警、低于 3.8 才解除)即可,改进思路放在 08 节。

06 资料清单

H32基于51单片机四路 图2H32基于51单片机四路 图3


四路电压采集报警器proteus仿真整机图这份 H 系列资料是全套的:

· Proteus 仿真:整机图含 ADC0808/0809、四路电位器、2×2 键盘、四位数码管,两个版本(7.8 / 8.6);

· Keil 程序:C 语言,单文件 main.c,注释齐全,编译 0 错误 0 警告(code=807):

Keil编译结果0错误0警告

· 设计报告:Word 版设计报告一份,含原理分析和流程图;

· 视频讲解:原理图讲解 + 程序讲解两段 mp4。

需要的朋友公众号后台回复关键词获取,也可以到 51mcu.top 看更多设计。

07 常见问题排查

1、ADC 读数一直是 0 或 255:先查 CLOCK 有没有喂——P3.1 必须接定时器翻转的那个脚,0809 没时钟根本不转换;再看 START 脉冲有没有打出来;

2、读数方向反了(电位器拧大数值变小):仿真电路分压方向与采样极性相反,程序里 (255-x) 就是干这个的;实物接线一致的话把这层取反去掉;

3、显示电压永远偏一个固定比例:换算式的分母 255 对应 VREF=5V,参考电压变了分母要跟着改;*50 的"50"就是量程 5V 放大 10 倍,动量程先动它;

4、四路通道串扰:0809 是逐次逼近型,通道刚切换时内部采样保持需要时间——采集前加几十微秒延时,或连续采两次丢第一次;

5、按键按一次跳好几个通道:2×2 扫描里 10ms 消抖后没有"等待释放"逻辑,主循环又快,按住期间会反复返回键值——加上松手确认(或 key_up 标志)即可;

6、报警灯在 4V 附近闪个不停:没有回差的比较就是这个表现,加滞回:>40 报警、<38 解除。

08 总结

这一期把"并行 ADC"的门派补齐了:H22 的 ADC0832 走 SPI 三线串行(省 IO、慢),这一期的 ADC0809 走 8 位并行总线(费 IO、直观、快),两大流派各有地盘。真正要带走的是三件事:定时器方式 2 自动重装 + 中断翻转 IO = 单片机自造时钟(喂老芯片的万能招);START/EOC/OE 三步时序(并行 ADC 的通用读法,换 ADC0801、ADC0816 一样的套路);整数换算 + 手点小数点(51 上躲浮点的标准姿势)。四路采集 + 选通道 + 超限报警,这就是多路巡检仪的雏形——加 EEPROM 存上下限(H31 刚讲过)、加 RS232 上传(后面讲),就是真实的工业巡检产品了。


09 文件日期修改

如果你想把文件修改为最新的日期,又不想新建工程,那么你可以参考下面的文章。

"如何不打开程序的情况下更改proteus和keil程序的日期?"

工具和仿真文件在一起,见下面的下载链接。


10 资料下载

全套资料包含 Keil 工程(C 语言源码 + hex 文件)、Proteus 仿真工程、设计报告、程序流程图、讲解视频,以及编译截图和仿真截图。下载后可直接打开运行,也可用于课程设计、毕业设计参考。

点我下载全套资料 →

也可以关注公众号「单片机仿真」,回复 H32 获取下载入口。公众号内还有 A / T / H 全系列 400 多个单片机仿真实例,回复「目录」可查看完整清单。

同类设计合集:H 系列单片机仿真合集目录(含设计报告、视频讲解、流程图);全部系列合集总目录

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:H31基于51单片机带存储传送带计数器proteus设计,keil程序,c语言,AT89C51,课题设计,设计报告
下一篇:H33基于51单片机ADC0809采集温度proteus设计,keil程序,c语言,AT89C51
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}