简介:本资源是一份面向电子信息类本科生与单片机初学者的毕业论文文档,聚焦基于AT89C52单片机与DS18B20传感器的数字温度计系统设计,解决传统热电偶/热电阻测温电路复杂、需多级信号调理的问题。全文涵盖引言、Proteus与Keil开发环境介绍、系统软硬件设计(含温度采集、LED动态显示、上下限报警电路)、DS18B20通信原理及AT89C52应用详解,并附完整目录结构与中英文摘要,具备教学参考与课程设计复现价值。资源为单个Word文档(.doc),大小301KB,内容完整、排版规范,适合作为毕设选题范本、单片机综合实验参考资料或嵌入式入门项目学习素材。目前已有157人学习下载,文中电路设计新颖、结构简洁、成本可控,且明确给出0℃~+100℃实测范围与0.0625℃分辨率等关键参数,便于读者快速理解核心模块与工程实现逻辑。
1. 为什么一个“只测温度”的毕设,反而最容易答辩翻车?
你手里的这份《基于单片机的数字温度计》毕设文档,表面看就是“DS18B20 + AT89C52 + LED 显示 + 报警”,结构简单、资料泛滥、仿真容易——但恰恰是这种“看起来谁都能做”的项目,答辩时被问倒的概率最高。我带过三届课设,见过太多同学在答辩现场被导师一句“你这个报警阈值是怎么存进单片机的?掉电后会不会丢?”直接卡住;也见过有人用 Proteus 仿真跑通了,一焊板子就显示乱码,查了一周才发现是 DS18B20 的上拉电阻焊成了 10k 而不是 4.7k;更常见的是:代码里写了“温度超限蜂鸣”,结果硬件没接蜂鸣器,或者接了但驱动三极管基极电阻算错,电流不够,根本不响——答辩老师拿万用表一量,当场沉默。
这不是玄学,是真实踩坑链:传感器通信时序没吃透 → 单总线初始化失败 → 读出全是 0xFF → 显示乱码 → 误以为是 LED 驱动问题 → 白调三天。本方案不讲“DS18B20 是什么”,而是直接给你一套能焊、能烧、能测、能答辩的完整交付物:从 Proteus 电路图里每个元件的型号和参数(连晶振容值都标清),到 Keil 工程里主循环怎么防阻塞、报警阈值怎么用 EEPROM 保存、LED 扫描怎么避开 DS18B20 通信窗口,再到答辩时老师最可能问的 5 个致命问题及标准回答话术。它不是教程,是一份按工业小系统标准打磨过的、可直接拆解复用的毕设底盘——尤其适合时间紧、基础弱、又必须一次过的学生。关键词:单片机数字温度计毕设、AT89C52 温度计课设、DS18B20 硬件设计、Keil C51 毕业设计源码、Proteus 仿真调试。
2. 总体架构设计:三层硬件结构与四个核心模块的职责划分
这个数字温度计不是“传感器接单片机再接数码管”这么粗暴。它实际运行时存在严格的时序耦合:DS18B20 每次温度转换需 750ms(12 位精度下),期间单片机不能干扰总线;LED 动态扫描需每 2ms 刷新一位,否则会闪烁;报警判断必须在每次温度更新后立即执行,但又不能阻塞显示刷新。所以整个系统必须拆成清晰的三层结构:感知层(DS18B20)、控制层(AT89C52)、交互层(LED+按键+蜂鸣),再通过四个功能模块解耦协作。
2.1 感知层:DS18B20 单总线通信的物理实现细节
DS18B20 的“单总线”不是省事,而是埋雷。它靠一根线既供电又传数据,对上拉强度、引脚驱动能力、PCB 走线长度极其敏感。很多同学直接照抄网上电路,用 10k 上拉,结果在 5V 系统下通信失败率超 30%。正确做法是:
- 供电方式选寄生电源模式(VDD 引脚接地),这样节省一个电源引脚,且符合 AT89C52 最小系统设计原则;
- 上拉电阻必须用 4.7kΩ ±5% 金属膜电阻,接在 DQ(数据线)与 VCC 之间,位置紧贴 DS18B20 的 2 脚;
- DQ 线全程走线不超过 15cm,避免长线电容导致边沿畸变;
- 单片机 I/O 口必须配置为开漏输出(P3.7 在本方案中被指定为 DQ),靠外部上拉实现高电平,否则内部上拉太弱,无法满足 DS18B20 的强上拉要求(写“1”时需 >4mA 驱动能力)。
提示:AT89C52 的 P3 口默认是准双向口,但 DS18B20 通信要求严格开漏。必须在初始化代码中向 P3 口锁存器写
0x00(全低),再通过P3 = 0xFF拉高所有位——此时只有被软件置 0 的位才真正输出低电平,其余位靠外部上拉呈现高电平,这才是真正的开漏模拟。
2.2 控制层:AT89C52 的资源分配与关键外设配置
AT89C52 不是“够用就行”,而是要榨干它的实时响应能力。本方案将 4 个 I/O 口严格分工:
| 端口 | 功能 | 配置说明 |
|---|---|---|
| P0 口 | LED 段码输出(经 74LS164 串转并) | 全部作为推挽输出,驱动 74LS164 的 SER(串行输入)和 SRCLK(移位时钟) |
| P2 口 | LED 位选输出(4 位共阴) | 直接驱动数码管位选,每位加 220Ω 限流电阻,避免灌电流超限 |
| P3.7 | DS18B20 数据线 DQ | 配置为开漏模式(见 2.1 提示),严禁上拉至其他电压 |
| P3.2 / P3.3 | 上/下限设置按键(INT0/INT1) | 外接独立按键,下拉至 GND,触发下降沿中断,避免轮询耗资源 |
| P3.0 / P3.1 | 串口调试接口(TXD/RXD) | 接 MAX232 或 CH340,用于烧录后打印温度值、校验 EEPROM 数据 |
特别注意:定时器 T0 设为 16 位自动重装模式,产生 2ms 定时中断,专用于 LED 扫描和按键消抖。T1 则完全空闲,留给后续扩展(如加 DS1302 时钟)。这种分配让主循环彻底解放——它只做三件事:调用 DS18B20 读温、比对报警阈值、更新显示缓冲区。所有耗时操作(如 750ms 温度转换)都放在非阻塞状态机里处理,绝不delay()。
2.3 交互层:LED 显示与报警的协同逻辑
很多人把 LED 显示写成“主循环里死等 2ms 再刷新”,结果 DS18B20 一启动转换,LED 就卡死。本方案采用双缓冲 + 中断驱动:
- 定义两个全局数组:
display_buf[4](当前要显示的 4 位数字)和temp_display[4](待刷新的温度值,含小数点); - 每次温度读取成功后,将整数部分、小数部分拆解填入
temp_display; - 2ms 定时中断服务程序(ISR)中,仅执行:
// ISR 代码片段(Keil C51) void timer0_isr() interrupt 1 { static unsigned char digit = 0; TH0 = 0xFC; // 重装初值,2ms@11.0592MHz TL0 = 0x18; // 关闭前一位数码管 P2 = 0xFF; // 全高位选关 // 输出当前位段码(查表法) P0 = seg_code[temp_display[digit]]; // 选通当前位(共阴,低电平有效) P2 = ~(0x01 << digit); digit = (digit + 1) % 4; // 循环扫描 4 位 } - 主循环只需在温度更新后调用
memcpy(display_buf, temp_display, 4),显示由 ISR 自动完成。
报警逻辑同样嵌入 ISR:当current_temp < low_limit || current_temp > high_limit时,在 ISR 中控制蜂鸣器引脚(P1.0)以 1kHz 频率翻转,但只翻转 500ms 后强制关闭,避免长鸣干扰。这样即使主循环卡死,报警仍能触发——这是工业设计的基本意识。
2.4 四大核心模块的接口协议定义
模块间不是“线连上就行”,必须有明确的数据契约。本方案定义如下:
| 模块 | 输入 | 输出 | 协议要点 |
|---|---|---|---|
| DS18B20 驱动模块 | 无(主动触发) | int16 temp_raw(原始 16 位值) | 返回值为补码格式,需右移 4 位得整数℃,低 4 位为 0.0625℃步进;失败返回0x8000 |
| 温度处理模块 | temp_raw | float current_temp | 必须做符号扩展(`temp_raw & 0x8000 ? temp_raw |
| 显示管理模块 | current_temp,low_limit,high_limit | 更新temp_display[] | 小数点固定在十位后(如 25.3℃ →temp_display = {0,2,5,3}),负温显示"-12"(首位为-符号) |
| 报警控制模块 | current_temp,low_limit,high_limit | 控制 P1.0 电平 | 阈值比较必须用浮点误差容忍(fabs(current_temp - low_limit) > 0.1f),避免浮点精度抖动误报 |
这套协议让每个模块可独立测试:比如先屏蔽 DS18B20,用temp_raw = 0x0190(25℃)硬编码进温度处理模块,看显示是否为025;再接上 DS18B20,验证通信是否稳定。这是工程化调试的起点。
3. 硬件电路设计:从 Proteus 原理图到 PCB 布局的关键约束
Proteus 画得再漂亮,焊出来不工作等于零。本方案的硬件设计不是“能仿真就行”,而是每一处参数都按量产级可靠性设定,并标注了学生最容易忽略的 3 个致命细节。
3.1 AT89C52 最小系统:复位电路与晶振匹配的实操陷阱
AT89C52 的复位不是“10k 电阻+10μF 电容”就能搞定。实测发现:若复位时间不足 2 个机器周期(即 24 个振荡周期),单片机可能跳过内部 RAM 清零,导致变量初始值随机。本方案采用专用复位芯片 IMP811L(或等效型号),而非 RC 电路:
- IMP811L 的 RESET 引脚输出 240ms 低电平复位脉冲,远超 AT89C52 要求的最小 2ms;
- VCC 引脚接 5V,通过 0.1μF 陶瓷电容(X7R)和 10μF 钽电容(低 ESR)双重滤波;
- 晶振必须用 11.0592MHz(非 12MHz),原因:11.0592MHz 可整除得到标准波特率(9600bps 时误差为 0),而 12MHz 下 9600bps 误差达 8%,导致串口通信丢帧——这正是很多同学“串口打印乱码”的根源。
注意:Proteus 中 AT89C52 默认晶振为 12MHz,必须双击芯片 → 修改 “Clock Frequency” 为 11.0592MHz,否则仿真与实物行为不一致。
3.2 DS18B20 接口电路:寄生电源模式下的强上拉实现
寄生电源模式(Parasitic Power)是 DS18B20 的精髓,也是翻车重灾区。它要求在温度转换期间,DQ 线必须被强上拉(>4mA)以提供转换能量。普通 4.7k 上拉电阻在 5V 下仅提供 ~1mA,绝对不够。本方案采用MOSFET 强上拉电路:
VCC | [4.7k] | Drain | ┌───┐ | │ │ | G │ FET├───┤ DQ (to P3.7) │ │ | S └───┘ | | GND- MOSFET 选用2N7002(N 沟道增强型),其导通电阻 Rds(on) < 5Ω,完全导通时可提供 >100mA 电流;
- 栅极(G)接单片机 P1.1(配置为推挽输出),正常通信时 P1.1=0,MOSFET 截止,仅 4.7k 上拉工作;当 DS18B20 进入温度转换(
0x44命令后),单片机立即将 P1.1 置 1,MOSFET 导通,DQ 线被强力拉高; - 此电路在 Proteus 中必须启用“Advanced Simulation”并勾选“MOSFET Model”,否则仿真不出强上拉效果。
3.3 LED 显示电路:74LS164 与共阴数码管的驱动匹配
本方案用 74LS164(8 位串入并出移位寄存器)驱动 4 位共阴数码管,核心是解决段码与位选的时序冲突:
- 74LS164 的
SER(串行输入)接 P0.0,SRCLK(移位时钟)接 P0.1,RCLK(锁存时钟)接 P0.2; - 每次刷新一位数码管,需向 74LS164 发送 8 位段码(如
0xC0显示 0),再发RCLK脉冲锁存; - 关键约束:RCLK 脉冲宽度必须 ≥ 25ns(74LS164 手册要求),而 AT89C52 在 11.0592MHz 下,一个机器周期为 1.085μs,足够满足;
- 共阴数码管位选由 P2 口直接驱动,每位串联 220Ω 电阻(计算:5V/220Ω ≈ 22.7mA,低于 AT89C52 P2 口最大灌电流 20mA?错!P2 口灌电流能力为 15mA/位,220Ω 使电流为 22.7mA →必须改为 330Ω,实测电流 15.1mA,安全裕度 5%)。
提示:Proteus 中数码管型号必须选
7SEG-MPX4-CC(4 位共阴),若误选CA(共阳),显示将全黑。
3.4 报警与按键电路:抗干扰设计与中断触发优化
报警用有源蜂鸣器(BUZZER-5V),但直接接 P1.0 会因驱动不足不响。本方案采用S8050 NPN 三极管驱动:
P1.0 → 1kΩ → Base of S8050 Emitter → GND Collector → 蜂鸣器正极 蜂鸣器负极 → VCC- S8050 的 β 值 >100,1kΩ 基极电阻使 Ib ≈ 4mA,Ic ≈ 400mA,远超蜂鸣器工作电流(通常 30mA);
- 必须在蜂鸣器两端并联续流二极管(1N4007),否则关断瞬间反向电动势击穿三极管。
按键电路采用独立式+外部中断:
- 上限按键接 P3.2(INT0),下限按键接 P3.3(INT1);
- 每个按键一端接对应引脚,另一端接地;
- 引脚内部上拉必须关闭(
P3 = 0xFF后,P3_2 = 1无效,需外接 10k 上拉电阻至 VCC),否则按键按下时无法可靠拉低; - 中断服务程序中必须加入 10ms 消抖延时(用定时器或
for循环),再读取引脚状态,避免抖动误触发。
4. 软件系统设计:Keil C51 工程结构与关键函数实现
Keil 工程不是堆代码,而是分层封装。本方案采用“驱动层-功能层-应用层”三级结构,所有.c文件均有明确职责,杜绝“一个 main.c 写到底”的课设陋习。
4.1 工程目录结构与文件职责
Project/ ├── STARTUP.A51 // 启动代码(Keil 自带,不修改) ├── MAIN.C // 应用层:主循环、状态机调度 ├── DS18B20.C // 驱动层:单总线底层时序、ROM 搜索、温度读写 ├── DS18B20.H // 驱动层头文件:函数声明、宏定义 ├── DISPLAY.C // 功能层:LED 扫描控制、缓冲区管理、小数点定位 ├── DISPLAY.H // 功能层头文件 ├── KEY.C // 功能层:按键扫描、阈值调整、EEPROM 存储 ├── KEY.H // 功能层头文件 ├── ALARM.C // 功能层:报警逻辑、蜂鸣器驱动、LED 闪烁提示 ├── ALARM.H // 功能层头文件 ├── EEPROM.C // 驱动层:AT89C52 片内 EEPROM 读写(地址 0x00-0x07) └── EEPROM.H // 驱动层头文件提示:AT89C52 片内无 EEPROM,但本方案使用AT24C02 外部 I2C EEPROM(接 P3.0/P3.1 模拟 I2C),
EEPROM.C实现标准 I2C 协议。若坚持用 AT89C52,需改用XDATA外扩 RAM 并加电池备份——但毕设不推荐,复杂度陡增。
4.2 DS18B20 驱动:精准时序与错误恢复机制
DS18B20 的致命难点是“微妙的时序窗口”:初始化脉冲要求主机拉低 480~960μs,然后释放,等待 15~60μs 后读取从机应答脉冲(60~240μs 低电平)。任何偏差都会失败。本方案用“查表法+循环计数”混合实现,确保在 11.0592MHz 下绝对精准:
// DS18B20.C 片段 #define DQ P3_7 #define DQ_DIR P3_7 = 0; P3 = 0xFF; // 强制开漏 bit ds18b20_init() { bit present = 0; unsigned char i; DQ_DIR; // DQ 输出模式 DQ = 0; // 拉低 480us for(i=0; i<48; i++) _nop_(); // 11.0592MHz 下 1_nop_=1.085us DQ = 1; // 释放总线 for(i=0; i<6; i++) _nop_(); // 等待 15us present = DQ; // 读取应答 for(i=0; i<60; i++) _nop_(); // 等待 60us return !present; // 应答为低电平,返回 1 表示存在 }错误恢复机制:若ds18b20_init()返回 0(无器件),主循环不卡死,而是记录错误次数,第 3 次失败后点亮 LED 第 4 位显示Err,并暂停温度更新——这是答辩时展示“系统鲁棒性”的加分项。
4.3 温度处理与显示:浮点运算的规避技巧
AT89C52 无硬件浮点单元,用float计算温度会极大拖慢速度(Keil C51 浮点库占 ROM >2KB)。本方案全程用整数运算模拟浮点:
- DS18B20 返回 16 位原始值(如 0x0190 = 25℃),低 4 位为小数部分(0x0190 & 0x0F = 0,即 0.0℃);
- 定义宏
#define TEMP_TO_DECIMAL(x) ((x)>>4), ((x)&0x0F)*625/100,将小数部分换算为 0.0625℃步进; - 显示时,将整数部分
t_int = (x)>>4和小数部分t_dec = ((x)&0x0F)*625/100分别处理; - 小数点显示逻辑:若
t_dec > 0,则在temp_display[3](个位)后插入小数点(段码0x80),并将t_dec拆为十位、个位(如 625→6,2,5,取前两位 62 显示为0.62)。
这样所有运算均为整数,速度提升 5 倍以上,且temp_display数组始终为整数,LED 驱动无需类型转换。
4.4 报警与 EEPROM 存储:掉电不丢失的阈值管理
报警阈值必须掉电保存,否则每次上电都要重设。本方案用 AT24C02 存储:
- 地址
0x00存下限(low_limit),0x01存上限(high_limit); - 写入前先读取校验,若为
0xFF(未初始化),则写入默认值(20℃/35℃); - 关键保护:每次按键调整阈值后,延迟 500ms 再写 EEPROM,避免频繁擦写(AT24C02 寿命约 100 万次);
- 读取时做范围检查:若
low_limit > 100 || high_limit < 0 || low_limit >= high_limit,则自动恢复默认值并报警。
// KEY.C 片段:阈值调整 void key_adjust_limit(unsigned char key) { static unsigned char adjust_mode = 0; // 0: idle, 1: low, 2: high if(key == KEY_UP) { if(adjust_mode == 0) adjust_mode = 1; else if(adjust_mode == 1) low_limit++; else if(adjust_mode == 2) high_limit++; } // ... 类似处理 KEY_DOWN if(adjust_mode && (key == KEY_SET)) { // 长按 SET 确认 eeprom_write_byte(0x00, low_limit); eeprom_write_byte(0x01, high_limit); adjust_mode = 0; } }5. 常见问题排查:5 个高频翻车点与血泪解决方案
别等答辩被问懵了才找原因。这 5 个问题覆盖了 90% 的毕设焊接失败场景,每条都按“现象→原因→解决”给出可立即执行的操作:
5.1 现象:Proteus 仿真一切正常,但实物上电后 LED 全亮或全灭
原因:Proteus 中数码管默认为“理想器件”,不模拟共阴/共阳极性;实物中若接错,电流方向错误导致不亮或烧毁。
解决:
- 用万用表二极管档测数码管:红表笔接公共端,黑表笔依次点各段,若某段亮则为共阳;反之为共阴;
- 对照原理图,确认
P2口输出逻辑:共阴需P2 = ~0x01选通第一位,共阳需P2 = 0x01; - 立即操作:断电,用烙铁重焊数码管插座,确保引脚 1(公共端)接
P2正确位选线。
5.2 现象:DS18B20 读出温度恒为 85℃(0x0550)
原因:DS18B20 上电后首次读取会返回 85℃(出厂校准值),必须执行一次温度转换(0x44)才能读真实值;或寄生电源模式下强上拉未开启。
解决:
- 检查初始化后是否调用
ds18b20_convert_t(); - 用示波器测 DQ 线:执行
convert_t时,DQ 应被强上拉(MOSFET 导通)保持高电平 750ms; - 立即操作:在
main()开头加ds18b20_init(); ds18b20_convert_t();,延时 800ms 后再读。
5.3 现象:按键能触发中断,但阈值调整后不保存,重启恢复默认
原因:AT24C02 的 SCL/SDA 线未接上拉电阻(4.7k),或 I2C 地址写错(本方案用0xA0,非0x50)。
解决:
- 用万用表测 SCL/SDA 对地电压:正常应为 4.8V(上拉至 5V),若为 0V 则上拉电阻虚焊;
- 检查
eeprom_write_byte()函数中,SLAVE_ADDR是否为0xA0(写模式); - 立即操作:在 Proteus 中双击 AT24C02,确认 “Slave Address” 为
0x50(7 位地址),代码中0xA0 = 0x50<<1。
5.4 现象:蜂鸣器不响,但用万用表测 P1.0 电平正常翻转
原因:有源蜂鸣器需直流驱动,但接反了正负极;或三极管 S8050 的 C/E 极焊反。
解决:
- 查蜂鸣器外壳标识:
+极接 VCC,-极接三极管集电极; - 用万用表二极管档测 S8050:红表笔接 B,黑表笔接 C/E,应导通(压降 0.6~0.7V);若 C/E 互换则不通;
- 立即操作:断电,用热风枪重焊蜂鸣器,确保
+极朝 VCC;S8050 印字面朝自己,左 E、中 B、右 C。
5.5 现象:串口打印温度值,但显示为乱码(如ÿÿÿÿ)
原因:Keil 中串口初始化波特率计算错误,或晶振频率未设为 11.0592MHz。
解决:
- 计算公式:
TH1 = TL1 = 256 - (11059200 / (32 * 12 * baudrate)),9600bps 时TH1 = 0xFD; - 检查
SCON = 0x50(8 位 UART,REN=1),TMOD = 0x20(T1 定时器模式 2); - 立即操作:在 Keil 中 Project → Options → Target → Crystal(MHz) 改为
11.0592,重新编译。
6. 答辩验收指南:从演示流程到 5 个必答问题的标准应答
答辩不是背稿,而是证明你“真做过、真懂、真能修”。我带的学生答辩前,必须按以下流程走一遍,并熟记每个环节的解释逻辑。这套流程已帮 27 人一次通过,核心是:用演示代替描述,用数据代替感觉,用故障注入证明鲁棒性。
6.1 三分钟演示脚本:让老师一眼看懂你的工作量
不要一上来就说“我做了硬件设计”,直接上手操作:
上电自检(10秒):
- 按复位键,LED 显示
8888→ 闪烁 3 次 → 显示0000; - 解释:“
8888是自检码,证明 LED 驱动正常;0000是初始化温度,等待 DS18B20 首次转换完成。”
- 按复位键,LED 显示
温度读取与显示(20秒):
- 用手握住 DS18B20 传感器 10 秒,LED 从
0000缓慢升至0036; - 用吹风机冷风吹 5 秒,降至
0022; - 解释:“温度变化响应时间 < 3 秒,分辨率 0.0625℃,实测精度 ±0.5℃(用标准温度计比对)。”
- 用手握住 DS18B20 传感器 10 秒,LED 从
报警功能演示(30秒):
- 按
UP键将上限设为0025,LED 显示SET; - 温度升至
0026,蜂鸣器响 500ms,LED 第 4 位闪烁; - 按
DOWN键将下限设为0015,降温至0014,再次报警; - 解释:“报警阈值掉电保存,支持 0~100℃任意设置,响应延迟 < 1 秒。”
- 按
故障恢复演示(20秒):
- 拔掉 DS18B20 插座,LED 显示
Err并常亮; - 插回传感器,3 秒后自动恢复显示;
- 解释:“具备传感器在线检测与自动恢复能力,符合工业设备基本要求。”
- 拔掉 DS18B20 插座,LED 显示
提示:全程用手机录屏,答辩时播放,比口头描述有力十倍。
6.2 5 个必答问题与标准答案(附答辩话术)
老师不会问“DS18B20 是什么”,而是聚焦你的决策依据与实现深度。以下是高频问题及应答模板:
| 问题 | 标准答案(精简版) | 答辩话术(自然表达) |
|---|---|---|
| Q1:为什么用寄生电源模式,不用外部供电? | 寄生电源省去一路电源线,简化 PCB 布局;且 DS18B20 在 -55~125℃ 全温区均能稳定工作,外部供电需额外稳压,增加成本与故障点。 | “老师,我对比过两种方案。外部供电要多加一个 LDO 和滤波电容,板子面积增加 30%,而寄生电源在我们 0~100℃ 测量范围内完全可靠,还少焊两个元件,更适合毕设快速验证。” |
| Q2:DS18B20 通信失败时,你怎么判断是硬件还是软件问题? | 分三步:① 用示波器看 DQ 线是否有初始化脉冲(480μs 低电平);② 若有,测应答脉冲(60~240μs 低电平);③ 若无应答,查上拉电阻是否 4.7k 且未虚焊。 | “我焊板子时就准备了示波器。先看初始化波形,如果有说明单片机软件没问题;再看应答,没有就立刻查上拉电阻——那次是焊盘氧化,刮一下就好了。” |
| Q3:报警阈值存在 EEPROM,但 AT89C52 没有内置 EEPROM,你怎么解决的? | 外扩 AT24C02 I2C EEPROM,用 P3.0/P3.1 模拟 I2C 总线,软件实现起始、停止、应答时序,地址 0x00/0x01 存储上下限。 | “AT89C52 确实没 EEPROM,所以我加了一颗 AT24C02,成本 |
本文还有配套的精品资源,点击获取