相应的读取参数,为了配合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几天,还没有反应过来是哪里的问题?
在STC梁工的耐心指导下,终于把掉电实验成功完成了
不过,我们实验环境先换成stc32g12k128 试验箱:
先把程序上传:
马上就发现一个问题:
先看这段程序:
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倍 ???
哪里出问题了???
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 了,叫人无法理解,感觉困在这里
这个问题无法忽略...........
上个问题,其实是显示函数我搞错了,各位不能除以10,应该是取余(%)
我当时脑子不清醒,取余后随手又除了10
导致显示的是10秒,自然是到了6553 就复位为0
好了 今天我们继续学习冲哥的18B20温度采集
db18b20 的硬件连接,是相当的简单:
零下的温度,用补码表示
是单总线器件
3主要功能简介3.2温度报警说明-温度报警
当 18B20 完成一次温度转换后,该温度转换值将会与用户定义的温度报警 TH 和 TL寄存器(详见图3)中的值进行比较。符号标志位(S)温度的正负极性:正数则 S=0,负数则 S=1。过温和低温(TH和TL)温度报警寄存器是非易失性的(EEPROM),所以其可以在设备断电的情况下保存。过温和低温(TH和TL)温度报警寄存器在“寄存器”章节中可以解释为暂存寄存器的第2、3个字节。
图3、过温和低温(TH和TL)温度报警寄存器
因为过温和低温(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 命令之后,主设备必须回到上述步骤中的第一步。
4.2.1.初始化
初始化程序—复位和存在脉冲
与 18B20 所有的通信都是由初始化序列开始的,该序列包括从主设备发出的复位脉冲及从18B20响应的存在脉冲组成。如图 13所示。当 18B20响应复位信号的存在脉冲后,则其向主设备表明其在该总线上,并且已经做好操作命令。
在初始化序列期间,总线上的主设备通过拉低1-wire总线超过480us来发送(TX)复位脉冲。
之后主设备释放总线而进入接收模式(RX)。当总线释放后,5kΩ 左右的上拉电阻将 1-wire 总线拉至高电平。当18B20检测到该上升边沿信号后,其等待15us至60us后通过将1-wire总线拉低60us至240us 来实现发送一个存在脉冲。
接着:
小结一下:
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字节温度数据-换算)
总结
1,学会看芯片手册,尤其是时序图
2.回顾18b20的工作原理
3.思考下生活里什么应用要用到这个。
课后练习:
1,将之前那节课的温度计实验改成18b20驱动的2.学习代码包“42-一线制温度传感器 DS18B20 测温”
的实验,分析下他的代码和我们的代码有什么区别。
3.尝试着读取一下内部的64位编码,以及显示更高精度的温度。