wuzhengmin 发表于 2025-9-10 10:36:29

相应的读取参数,为了配合2位数码管,也做了对应限制:void Parm_Read(void)
{
        EEPROM_read_n(EE_ADDRESS,tmp,2);      //读出2字节
    Test_cnt = ((u16)tmp << 8) + tmp; //秒计数
    if(Test_cnt > 100)    Test_cnt = 0;   //秒计数范围为0~10000,数码管显示2位的话,最大数值是100
        EEPROM_SectorErase(EE_ADDRESS); //擦除扇区
}       
好像一起都对,但是实验就是不成功,感觉就是不执行写入函数:

EEPROM_write_n(EE_ADDRESS,tmp,2);
搞了10几天,还没有反应过来是哪里的问题?

wuzhengmin 发表于 2025-10-9 08:53:15

在STC梁工的耐心指导下,终于把掉电实验成功完成了


不过,我们实验环境先换成stc32g12k128 试验箱:

先把程序上传:


wuzhengmin 发表于 2025-10-9 08:58:17

马上就发现一个问题:


先看这段程序:

while(1)
                        {
                                        if((B_1ms) && (LowVolFlag == 0))   //1ms到,低电压时不工作
                                        {
                                                B_1ms = 0;
                                                                if(++TimCount_z >= 100U)   //1秒到这里不是应该1000么?
                                                                {
                                                                        TimCount_z = 0;      //清1000ms计数
                                                                        Test_cnt++;         //秒计数+1
                                                                        if(Test_cnt > 65530U)    Test_cnt = 0;   //秒计数范围为0~10000
                                                                        
                                                                        Test_cntSet();
                                                                }
                                                                        
                                        }
                        }if(++TimCount_z >= 100U)   //1秒到这里不是应该1000么?
如果写成1000,就发现好像在以10倍的速度慢动作

仔细观察: if(Test_cnt > 65530U)    Test_cnt = 0;   //秒计数范围为0~65530
也有这个问题:
我发现Test_cnt = 6553 的时候就执行Test_cnt = 0 了

好像都减小了10倍 ???

哪里出问题了???


wuzhengmin 发表于 2025-10-9 09:11:11

if(++TimCount_z >= 100U)   //1秒到这里不是应该1000么?

其实这里还行,因为我们在定时器0中断里还要扫描SEG和LED,需要时间....所以1ms就加1的逻辑有漏洞

但是 if(Test_cnt > 65530U)    Test_cnt = 0;   //秒计数范围为0~65530

这个问题:

Test_cnt = 6553 的时候就执行Test_cnt = 0 了,叫人无法理解,感觉困在这里

这个问题无法忽略...........

wuzhengmin 发表于 2025-10-12 09:31:21

上个问题,其实是显示函数我搞错了,各位不能除以10,应该是取余(%)

我当时脑子不清醒,取余后随手又除了10

导致显示的是10秒,自然是到了6553 就复位为0

好了 今天我们继续学习冲哥的18B20温度采集






wuzhengmin 发表于 2025-10-12 09:37:06

db18b20 的硬件连接,是相当的简单:


零下的温度,用补码表示

是单总线器件


3主要功能简介3.2温度报警说明-温度报警
当 18B20 完成一次温度转换后,该温度转换值将会与用户定义的温度报警 TH 和 TL寄存器(详见图3)中的值进行比较。符号标志位(S)温度的正负极性:正数则 S=0,负数则 S=1。过温和低温(TH和TL)温度报警寄存器是非易失性的(EEPROM),所以其可以在设备断电的情况下保存。过温和低温(TH和TL)温度报警寄存器在“寄存器”章节中可以解释为暂存寄存器的第2、3个字节。
图3、过温和低温(TH和TL)温度报警寄存器


wuzhengmin 发表于 2025-10-12 09:44:34

因为过温和低温(TH和TL)温度报警寄存器是一个8位的寄存器,所以在与其比较时温度寄存器的4位至11位才是有效的数据。如果温度转换数据小于或等于TL及大于或等于TH,18B2内部的报警标志位将会被置位。该标志位在每次温度转换之后都会更新,因此,如报警控制消失,该标志位在温度转换之后将会关闭。
主设备可以通过报警查询命令查询该总线上的 18B20 设备的报警标志位。任何一个报警标志位已经置位的 18B20设备都会响应该命令,因此,主设备可以确定到底哪个18B20设备存在温度报警。如果温度报警存在,并且过温和低温(TH和TL)温度报警寄存器已经被改变,则下一个温度转换值必须验证其温度报警标志位。

3.3 ROM编码(独一无二)

64 位光刻 ROM 编码
每片 18B20 的片内ROM 中都存有一个独一无二的 64 位的编码。在该内ROM 编码的低 8 位保存有 18B20 的分类编码:28h。中间的 48 位保存有独一无二的序列号。最高 8 位保存片内ROM 中前56位的循环冗余校验(CRC)值。更加详细的在"1-wire总线系统”章节该64位ROM编码及相关的ROM 功能控制逻辑允许 18B20 作为 1-wire 总线协议上的设备。

如果担心自己的产品被人复刻了或者被人恶意拆装复制,可以再单片机里加一段程序读取到13c20的编码正确才可以开始运行!

1-wire总线系统
1-wire 总线系统即一个总线主设备控制一个或多个从设备。18B20 始终是一个从设备。当总线上只有一个从设备时,此系统被称为“单节点”系统;当总线上有多个从设备连接时,此系统被称之为
“多节点”系统。
1-wire总线上所有的命令或者数据的发送都是遵循低位先发送的原则。接下来关于1-wire 总线系统的描述将会分成三个部分:硬件配置,事件序列和 1-wire 总线信号(信号定义和时序)。

下面是重点:
事件序列
访问 18B20 的事件序列如下所示:
第一步:初始化
第二步:ROM 命令(紧跟任何数据交换请求)第三步:18B20功能命令(紧跟任何数据交换请求)
每次对 18B20的访问都必须遵循这样的步骤来进行,如果这些步骤中的任何一个丢失或者没有执行,则 18B20将不会响应。除了ROM搜索命令和报警搜索命令之外。1当执行完这些ROM 命令之后,主设备必须回到上述步骤中的第一步。





wuzhengmin 发表于 2025-10-12 09:45:59

4.2.1.初始化
初始化程序—复位和存在脉冲
与 18B20 所有的通信都是由初始化序列开始的,该序列包括从主设备发出的复位脉冲及从18B20响应的存在脉冲组成。如图 13所示。当 18B20响应复位信号的存在脉冲后,则其向主设备表明其在该总线上,并且已经做好操作命令。
在初始化序列期间,总线上的主设备通过拉低1-wire总线超过480us来发送(TX)复位脉冲。
之后主设备释放总线而进入接收模式(RX)。当总线释放后,5kΩ 左右的上拉电阻将 1-wire 总线拉至高电平。当18B20检测到该上升边沿信号后,其等待15us至60us后通过将1-wire总线拉低60us至240us 来实现发送一个存在脉冲。



wuzhengmin 发表于 2025-10-12 09:48:57

接着:



小结一下:


5.代码编写
5.1 底层驱动
复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)写0(输出0保持60us+,输出1保持1us+).
写1(输出0保持1us+,输出1保持60us+)读0/1(输出0保持1us+,,输出1保持Tus+,读取当前电平,延时60us)
5.2 接口函数
写1字节读1字节
5.3 用户功能函数
温度读取换算函数
(复位-CCH-44H-等待-复位-CCH-BEH-读取2字节温度数据-换算)


wuzhengmin 发表于 2025-10-12 09:50:15

总结
1,学会看芯片手册,尤其是时序图
2.回顾18b20的工作原理
3.思考下生活里什么应用要用到这个。
课后练习:
1,将之前那节课的温度计实验改成18b20驱动的2.学习代码包“42-一线制温度传感器 DS18B20 测温”
的实验,分析下他的代码和我们的代码有什么区别。
3.尝试着读取一下内部的64位编码,以及显示更高精度的温度。



页: 8 9 10 11 12 13 14 15 16 17 [18] 19 20 21 22 23 24 25 26 27
查看完整版本: 第一次:环境的创立 | 送实验箱