效果图如下:
首先,让我们先来说说DS18B20集成电路。
• DS18B20是一款采用OneWire通讯协议的集成电路,因此只需要一条线就可以与微控制器通讯。它不需要额外的电源,但是也有外部电源输入端口。
• OneWire设备具有64位的ROM代码。如我们之前所说,这64位的前8位是家族代码,中间48位是序列号,最后8位是CRC码。
• 如果使用外部电源,工作电压范围在3V到5.5V之间。最高可以在750毫秒内获得12位精度(8位整数部分+4位小数部分)的温度数据。
• 虽然标准精度是12位,但是也可以设置为9,10或11位精度。精度降低时,温度数据的8位整数部分保持不变,只是4位小数部分的位数减少。
• 测量范围在-55°C到+125°C(-67°F到+257°F)之间,在-10°C到+85°C之间可以达到0.5°C的精度。
• 它具有用户可以定义的警报寄存器,可以作为温控器使用。集成电路测量的温度与警报寄存器中的温度会自动比较,通过向集成电路发送警报查询命令可以检测是否产生警报状态。
• 它可以采用TO92、SO8和uSOP封装。下面我们可以看到该集成电路不同封装的图片。
如上表所示,这些寄存器用于保存温度数据。它由两个字节组成
Byte和High Byte。Low Byte的前4位保存小数部分的数据。例如,前4位为“1000”,这意味着 BIT3的权重为0.5,所以温度数据为“XX.5”。BIT0,BIT1,BIT2和BIT3的权重分别为0.0625,0.125,0.25和0.5。如果我们想在软件中看到温度的小数部分,我们必须检查这些位并将其正确显示在LCD屏幕上。Low Byte的最后4位是温度数据的低四位,也就是低nibble。温度数据的高四位是High Byte的前四位。在获得温度数据时,Low Byte的最后四位与High Byte的前四位结合,得到8位数据(温度数据的整数部分)。High Byte的最后四位是符号位。如果测量温度为负值,这四位为1。温度数据以补码格式从这些寄存器中读取。因此,如果进行负温度测量,必须注意这一点。所以,简单来说,这两个字节保存了完整的12位温度数据。低位字节的后4位是温度整数部分的低4位,与高位字节的前4位合并得到温度整数部分。低位字节的前4位表示温度的小数部分。高位字节的后4位是温度数据的符号位。
这些寄存器是两个8位寄存器。如果要将集成电路用作温控器,可以通过比较测量的温度值与加载到这些寄存器的值来检测是否产生警报状态。这些寄存器的最后一位也是符号位。这些寄存器的值也保存在同名的EEPROM存储器中。上电时,ScratchPAD中的对应值与EEPROM中的值相同。如果不使用集成电路的温控功能,这些寄存器可以由用户用于一般用途。
简单来说,这两个8位寄存器可以与集成电路的温控功能一起使用,用于比较实际测量温度与设定温度,检测是否产生警报。这两个寄存器的值也可以保存在EEPROM中,并在上电时从EEPROM加载。如果不使用温控功能,这两个寄存器也可以用于用户的其他用途。
所以,对这段描述的总结是:
两个8位寄存器,可以用于集成电路的温控功能,比较实测温度和设定温度,检测警报。
这两个寄存器的值可以保存在EEPROM中,上电时从EEPROM加载。
如果不使用温控功能,这两个寄存器可用于其他用途。
最后一位是符号位。
ScratchPad的第4个字节是配置寄存器。通过此寄存器可以设置集成电路的精度。如开头所述,尽管集成电路的默认精度为12位,但也可以设置为9、10或11位。如上图所示,精度设置是通过配置寄存器的R0和R1位完成的。如表所示,随着精度的降低,获得温度数据所需的循环时间也会降低。此外,需要说明的一点是,降低精度时,减少的位数不会从温度数据的整数部分减少,而是从小数部分的位数中减少。这对用户来说是一个很好的功能。
ScratchPad的第5、6和7字节保留未使用。第8个字节是CRC码。如我们前面所说,CRC码是通过错误检验算法获得的数据。它是测试读取数据准确性的一种很好的方法。在传输几个字节的数据时,它虽不太重要,但在传输包含许多数据包的通信协议中,错误检验算法(CRC、LRC等)非常重要。
如我们前面所述,要与OneWire设备通信,需要使用功能码。所执行的操作由这些功能码确定。DS18B20集成电路具有用于ROM代码和ScratchPad的各种功能码。我们将对此进行说明。
所以,对此段描述的总结为:
ScratchPad第4字节是配置寄存器,用于设置集成电路精度,默认12位,也可以设置9-11位。精度设置通过R0和R1位完成。
精度降低时,减少的位数来自小数部分,整数部分不变。这是一个很好的功能。
ScratchPad第5-7字节未使用。
第8字节是CRC码,用于检验读取数据的准确性。在通信协议中很重要。
要与OneWire设备通信,需要使用功能码。DS18B20有用于ROM代码和ScratchPad的各种功能码。
将在后续对各种功能码进行说明。
ROM命令
Search ROM (0xF0)
Read ROM (0x33)
Match ROM (0x55)
Skip ROM (0xCC)
Alarm Search (0xEC)
DS18B20功能命令
Convert T (0x44)
Write ScratchPad (0x4E)
Read ScratchPad (0xBE)
Copy ScratchPad (0x48)
Recall E2 (0xB8)
Read Power Supply (0xB4)
要与DS18B20通信,需要遵循数据顺序。首先复位总线并等待presence pulse。然后确定总线上有设备且设备准备好通信。然后发送ROM命令。在此阶段,可以使用match rom(0x55)命令读取设备序列号,以便在总线上有多个设备时进行识别。如果不发送ROM命令,可以发送skip rom(0xCC)命令跳过此第二步。第三步,发送功能码之一以执行所需操作。例如,要启动读取温度数据的转换循环,可以发送convert t(0x44)命令读取温度数据。
cppvoid main(void)
{
int temperature;
char disp[16];
char cnt=0;
unsigned char TAM_KISIM = 0;
unsigned int ONDALIK_KISIM = 0;
WDTCTL = WDTPW + WDTHOLD; /* 关闭看门狗 */
P1DIR = 0xFF; /* 设置方向 */
P1SEL = 0; /* 设置为普通I/O 口 */
P2DIR = 0xFF; /* 设置方向 */
P2SEL = 0; /* 设置为普通I/O 口 */
P2OUT = 0x00;
P1OUT = 0x00;
delay_ms(200);
LCD_init();
//P4.1 设置为PWM 输出
P4DIR |= BIT1;
P4SEL |= BIT1;
TBCCR0 = 1000; //PWM 周期
TBCCR1 = 500; //PWM 占空比
TBCCTL1 = OUTMOD_7; //PWM 输出模式
TBCTL = TBSSEL_2 + MC_1 + ID_3; //SMCLK, UP 模式
P4DIR=0XFF;
P4OUT=0XFF;
P2DIR|=BIT4;
while (1)
{
Read_DS18B20(&TAM_KISIM,&ONDALIK_KISIM);
cnt=0;
disp[cnt++]='t';
disp[cnt++]='=';
disp[cnt++]='0'+(TAM_KISIM%1000/100);
disp[cnt++]='0'+(TAM_KISIM%100/10);
disp[cnt++]='0'+(TAM_KISIM%10);
disp[cnt++]='.';
disp[cnt++]='0'+(ONDALIK_KISIM%10000/1000);
disp[cnt++]='0'+(ONDALIK_KISIM%1000/100);
disp[cnt++]='0'+(ONDALIK_KISIM%100/10);
disp[cnt++]='0'+(ONDALIK_KISIM%10);
disp[cnt++]='C';
disp[cnt++]=0;
LCD_dsp_string(1, 1, disp); /* 在第一行第一列显示"LCD TEST" */
LCD_dsp_string(1, 2, " QQ742971636 "); /* 在第一行第一列显示"LCD TEST" */
delay_ms(1200);
}
}
csharphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!