一、 实验要求
实验目的:
- 掌握数码管的使用方式
- 掌握DS18B20温度传感器的工作原理
- 掌握单总线通信方式实现MCU与DS18B20数据传输
实验内容:
学习DS18B20温度传感器的单总线传输机制,通过单片机MCU的I/O实现温度采集,并将数据显示在数码管上。
二、 实验设计
1.整体思路
程序首先在main函数中进入一个无限循环。在每次循环中,通过Ds18b20ReadTemp函数读取 DS18B20 温度传感器的温度值。
读取到的温度值经过datapros函数进行处理,将其转换为适合数码管显示的格式,并提取出百位数字(存放在f中,用于后续报警判断)。
然后通过DigDisplay函数将处理后的温度数据显示在数码管上。
最后,根据f的值判断温度是否超过设定阈值(30 度),如果超过则通过控制蜂鸣器引脚(beep)的电平翻转实现报警功能,否则关闭蜂鸣器。
2.流程图
3.主要模块设计思路及分析
(1)温度采集模块(Ds18b20ReadTemp等函数)
Ds18b20ReadTemp函数整合了与 DS18B20 传感器通信的多个步骤。首先通过Ds18b20ChangTemp函数发送温度转换命令,然后在转换完成后(通过Ds18b20ReadTempCom发送读取温度命令),依次读取温度数据的高字节和低字节,将它们组合成一个完整的温度值。
Ds18b20ChangTemp函数先初始化传感器(Ds18b20Init),然后发送跳过 ROM 操作命令和温度转换命令,并且在其中还包含了一个告警搜索功能(Ds18b20AlarmSearch),当搜索到告警时会控制蜂鸣器状态(虽然这种方式可能不太合理,因为告警搜索和温度转换命令同时进行可能导致问题,但从代码逻辑上是这样设计的)。
Ds18b20ReadByte和Ds18b20WriteByte函数实现了单总线数据的读写操作,严格按照 DS18B20 的通信协议,通过精确的时序控制(如总线拉低、延时等操作)来确保数据的正确传输。
(2) 数据处理模块(datapros函数)
根据温度值的正负情况进行不同处理。如果温度为负,先将其转换为原码形式,然后乘以一个系数(0.0625*100 + 0.5,用于将温度值转换为适合数码管显示的整数部分,保留两位小数的近似值)。如果温度为正,则直接进行相同的系数乘法操作。
最后将处理后的温度值分解为各个数位,分别存储在DisplayData数组中,用于数码管显示。同时提取出百位数字存放在f中,方便后续报警判断。
(3) 数码管显示模块(DigDisplay函数)
通过循环控制 6 个数码管的位选(使用LSA、LS B、LSC引脚),依次将DisplayData数组中的数据发送到数码管的段选引脚(P0口)进行显示。在每次显示一个数码管后,通过调用delay(100)函数进行短暂延时,以实现动态扫描效果,让人眼能够看到稳定的显示内容。最后将P0口设置为0x00,进行消隐操作,防止数码管余晖现象影响显示效果。
(4) 报警模块(main函数中的报警部分)
在main函数的循环中,每次获取温度数据并处理后,判断f(温度值的百位数字)是否大于等于 30。如果是,则进入报警模式,通过循环while (i--)控制蜂鸣器引脚(beep)的电平翻转(beep =!beep),并使用delay(10)函数控制翻转的频率,从而产生报警声音。如果温度正常(f < 30),则将蜂鸣器引脚设置为低电平(beep = 0)关闭蜂鸣器。
三、 实现效果
四、总结
1. 通过本次实验,深入了解了 DS18B20 温度传感器的工作原理和单总线通信方式。掌握了如何通过单片机与传感器进行数据交互,包括初始化传感器、发送命令、读取数据等一系列操作,这在嵌入式系统中对于获取外部环境数据是非常重要的技能。
2. 在实验过程中遇到了各种问题,如代码报错、传感器数据读取不准确、数码管显示异常等。通过仔细分析错误提示、查阅资料(如芯片手册文档)、检查硬件连接等方式,逐步排查问题并找到解决方案。这培养了在面对复杂系统问题时的分析和解决能力,学会从软件和硬件两个方面去寻找问题的根源。
3. 例如,在调试传感器通信部分时,可能会遇到初始化失败或数据读取错误的情况。需要仔细检查时序控制是否准确,如总线拉低和拉高的时间、延时函数的参数设置等,通过不断调整这些参数和逻辑来确保通信的稳定可靠。