基于51单片机设计ADC0809温度采集器,proteus仿真加keil工程,模拟热敏电阻分压模拟温度变化、LCD1602实时显示、10次采样均值滤波稳定读数,附设计报告、流程图与视频讲解。

01 设计任务
功能介绍:
使用51单片机设计一个ADC0809温度采集器,采集模拟热敏电阻的电压并换算成温度,LCD1602 实时显示,要求如下:
1、模拟热敏电阻输入:电位器 RV4 接在 ADC0809 的 IN0 通道上,模拟热敏电阻分压——转动电位器,等效于温度变化;
2、LCD1602 实时显示:第一行显示 "Temperature:",第二行显示温度数值,末尾带 ℃ 符号(1602 字库里 0xDF 就是度符号 °,再加一个 'C' 拼成);
3、定时器方式 2 喂时钟:中断里翻转 IO 给 ADC0809 的 CLOCK 脚提供约 10kHz 时钟——0809 没有内部时钟,这招在 H32 讲过,这期直接当"熟客"用;
4、10 次采样均值滤波:连采 10 个 AD 值求平均再换算,读数稳定不跳变——这是这期的新内容,03 节细讲;
5、红色 LED 工作指示灯:主循环里每轮翻转一次,灯闪说明程序活着——调试时它是"心电图"。
特别注意:这期的 LCD1602 驱动里藏着一个仿真圈人尽皆知的坑:LCD_Wait() 里的忙检测 while(DBPort & 0x80),在 Proteus 里跑会直接死循环——源码里它被注释掉了,旁边留了一行注释"实际硬件时打开此语句"。为什么仿真要屏蔽、实机要打开?04 节把这个坑讲透。
02 ADC0809 三步时序:启动、等待、放行
先看 ADC 读取函数,整个采集就这一个函数:
先把 START 清零、再置高、再清零,打出一个上升沿,让 0809 开始这一次转换;然后轮询 EOC,等它由低变高,表示转换结束;最后把 OE 拉高放行,8 位结果从数据口读进变量。
三步走,和 H32 一模一样:START 打脉冲启动 → EOC 拉高报"转完了" → OE 放行读数据。8 位数据口 ADC_DATA 直连 P1,这就是并行 ADC 的好处——时序简单到一眼看完,代价是吃掉 8 根 IO。
时钟脚 ADC_CLK 接 P3.7,由定时器 0 中断持续翻转:
定时器 0 设为方式 2(8 位自动重装),初值 256-50 对应 50µs 重装一次;中断服务里只做一件事——把接在 P3.7 的 ADC_CLK 取反,于是每 50µs 翻转一次,输出 10kHz 方波。
方式 2 的妙处上次说过:TL0 溢出后 TH0 自动回填,中断服务里只管翻转 IO,连重装初值都省了。50µs 翻一次,输出正好 10kHz——落在 0809 时钟范围(10k~1280kHz)的最稳区间。
和 H32 的分工:H32 是四路电压轮着采、数码管显示;这期是单通道温度、液晶显示。骨架相同,血肉不同——03 节的滤波和 04 节的液晶驱动就是这期真正的肉。
03 均值滤波:10 次采样求平均
循环 10 次:每次调用采集函数取一个 AD 值存进数组,同时累加到临时变量,两次采样之间用 delay(10) 把时间拉开;10 次结束后把累加结果一次性除以 10,得到平均值。
为什么要采 10 次再平均?因为 AD 采样天然带噪声:电源纹波、热敏电阻自身的热噪声、布线干扰,都会让单次读数在真实值附近抖动。噪声是随机的、有正有负,累加起来正负抵消,平均之后无限逼近真实值——这就是最基础的均值滤波(算术平均滤波)。
三个工程细节值得品:
· 采一次隔 delay(10) 再采下一次:让相邻样本在时间上拉开,噪声才"不相关",抵消效果才好;连着猛采 10 次等于采了同一个值,白忙;
· 先累加再除,不是边采边除:整数除法会丢小数,采一次除一次误差累积,最后除一次只丢一回;
· 数组 temp_ad_tab[10] 其实存了每一路的原始值——想升级成"去掉最大最小再平均"的防脉冲干扰滤波,数据都在手边。
滤波这个意识比代码本身值钱:传感器读数不稳,先想滤波,再想硬件。以后遇到"数值乱跳"的项目,第一反应就该是这段循环。
04 LCD1602 驱动:忙检测在 Proteus 里的死循环坑
这期的液晶驱动是手写时序版(比 H20 那份多了忙检测),先看写函数:
先把使能脚 LcdEn 清零,用 RS 定性质(0 是命令、1 是数据)、R/W 定方向(这里固定为写),数据送到 DBPort;然后 E 拉高再拉低,用下降沿把数据锁存进液晶;最后调用忙检测,等液晶把这条指令执行完。
顺序就是 1602 手册上的标准动作:RS 定性质 → R/W 定方向 → 数据上线 → E 拉高再拉低锁存。
把 RS 设为 0、R/W 设为 1 切换到读方向,E 拉高后读回 DBPort 的最高位 DB7,用它判断液晶是否还在忙。源码里这一句判断被注释掉了,旁边留了一行注释:Proteus 仿真屏蔽,实机打开。
忙检测的原理:液晶执行指令需要时间(清屏要 1.5ms 以上),期间 DB7 会保持高电平,CPU 应该轮询它直到变低再发下一条指令。
为什么 Proteus 里必须屏蔽:Proteus 的 1602 模型对"读忙"这个操作支持得不完整——它在写某些控制字时不会正确回填忙标志,DBPort & 0x80 永远为真,程序卡死在这个 while 里,现象就是液晶永远不亮、仿真像没下载过程序。注释里写的"在调用 GotoXY() 时会进入死循环"就是这个意思。
为什么实机必须打开:真液晶没有忙检测就得靠延时硬等,延时短了指令没执行完,显示会丢字、乱码。屏蔽了忙检测的代码只能靠运气和足够的延时兜底。
所以这份源码是仿真、实机双版本兼容的模板:仿真屏蔽、实机打开,注释里写清楚——你们拿去改项目时,这一行的取舍就是第一个要检查的点。
05 温度换算与数值打印
取滤波后的 AD 平均值,先乘以 100,再除以 255,得到温度值。
AD 值 0~255 线性映射到 0~100℃,*100/255 纯整数运算躲开浮点。注意先乘后除——ad/255*100 恒等于 0,这是整数运算最容易犯的顺序错误。真实热敏电阻是非线性的,要查表或分段线性化;仿真里电位器转多少就是多少度,线性假设在仿真里天然成立,这也是"仿真测温"类设计的通用简化。
数值打印函数 LCD_Print_num 自己手写了一个七位十进制转换:
· 逐位取数:num/1000000%10 到 num%10,7 个位各加 0x30 变 ASCII;
· 负数处理:num<0 时先打印 '-' 再取绝对值——虽然测温用不上,但函数是通用的,配合负温传感器直接能用;
· 前导零抑制:找到第一个非 '0' 位开始打印,前面的一律跳过;全零(数值为 0)时单独打印一个 "0",不会输出空白;
· 显示完数值再补打一段空格,清掉上次残留的旧字符——数值从 100 掉到 99 时,末尾不会赖着一个旧 "0"。
这个"打印完补空格"的细节和 H22 清屏重刷、H30 补空格是一脉相承的:动态刷新的显示,永远要处理"位数变短"的残留问题。
06 设计报告与视频讲解


本设计配套资料齐全(H 系列标准四件套):
· Proteus 仿真:ADC0809 模块、51 单片机模块、LCD1602 显示模块、模拟热敏电阻、工作指示灯,分区标注清楚;
· Keil 程序:单文件工程,编译 0 Error 0 Warning(code=1454),关键处有中文注释;
· 设计报告:含系统框图、原理分析、程序流程与源码;
· 视频讲解:原理图讲解 + 程序讲解两段,跟着视频把时钟供给、均值滤波、忙检测坑过一遍。

07 排错清单
仿真跑不起来或读数不对,按这个顺序查:
1、液晶永远不亮、疑似死机 → 九成是忙检测没屏蔽。检查 LCD_Wait() 里的 while(DBPort & 0x80) 是否注释掉了(仿真必须屏蔽,实机必须打开);
2、AD 读数一直是 0 或 255 → 先查 CLOCK 脚有没有时钟(示波器看 P3.7 应有 10kHz 方波),再查 START/EOC/OE 接线是否与程序宏定义一致(这期是 START=P3.4、EOC=P3.5、OE=P3.6、CLK=P3.7,和 H32 的引脚排布不同,别照抄上期的接线);
3、读数在真实值附近小幅乱跳 → 滤波次数不够或采样间隔太短,把 10 次加大到 20 次、delay(10) 加长即可;
4、温度永远显示 0 → 检查是不是把 *100/255 写成了 /255*100——整数除法顺序错,结果恒为 0;
5、温度高位变化后末尾残留旧字符(如 100 掉到 99 显示"990")→ 显示数值后那段补空格的 Print(" ") 被删了,补回去;
6、转动电位器温度方向反了 → 分压方向问题,调 RV4 接法或把换算改成 (255-x)*100/255(和 H32 的反相修正同款操作);
7、源码小瑕疵:Display_data() 里 temp_tab 数组混着几个占位字符('+'、"122.0"),如果仿真时温度后面冒出多余字符,把它改成一串空格即可——这是源码里的模板残留,不影响主流程。
08 系列回顾
到这里,ADC0809 这个"老将"的两张面孔都见过了:
· H32 四路电压采集:多通道轮采 + 数码管 + 报警比较,练的是"分时复用";
· H33 ADC0809 温度采集:单通道 + 液晶 + 均值滤波,练的是"数据质量"。
加上 H22 的 ADC0832(串行 SPI 门派),模数转换的三大件凑齐了:串行接口、并行多通道、并行单通道 + 滤波。而均值滤波这一招,下次做数字万用表、电子秤、气体浓度检测时全用得上——传感器类项目的"数据质量"意识,从这篇开始建立。
需要本设计的仿真 + 程序 + 报告 + 视频全套资料,公众号回复 H33 免费领取。下期见!
09 文件日期修改
如果你想把文件修改为最新的日期,又不想新建工程,那么你可以参考下面的文章。
"如何不打开程序的情况下更改proteus和keil程序的日期?"
工具和仿真文件在一起,见下面的下载链接。
10 资料下载
全套资料包含 Keil 工程(C 语言源码 + hex 文件)、Proteus 仿真工程、设计报告、程序流程图、讲解视频,以及编译截图和仿真截图。下载后可直接打开运行,也可用于课程设计、毕业设计参考。
也可以关注公众号「单片机仿真」,回复 H33 获取下载入口。公众号内还有 A / T / H 全系列 400 多个单片机仿真实例,回复「目录」可查看完整清单。

