DS18B20的编程
在使用DS18B20中,需要经过几个步骤:复位、向1 - WIRE 总线上写1字节、从总线上读取1个字节、读出温度、温度数据处理。在这之后就配合自己的板子的外设以及自己的相关要求编写主函数。
不同的人在编程时有着自己的编程习惯,要一一说明是不太可能的了!我就我自己这段时间的编程来说明下把!
我使用的是51系列单片机、4位共阴数码管、74LS138,程序是根据别人的修改了的,支持负温度,里面的注释比较详细。
https://static.assets-stash.eet-china.com/album/old-resources/2008/10/16/8f7b49d7-fa5a-4ef0-88c1-dd85d037453c.rar
总之就那么句话,上面的几个步骤在使用DS18b20时都要添加在里面,并且各个不同编程的实质是一样的!
下面给自己写个实习笔记把!
DS18B20有3个引脚,分别为VCC、DQ、GND;DQ为1 - WIRE 总线。
在这里定义其引脚:sbit DQ = P1^0;
首先是复位:
Init_DS18B20(void)
{
unsigned char x="0";
DQ = 1; //DQ复位
delay(4); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(100); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(40);
}
写一个字节:
write_byte(unsigned char dat)
{
unsigned char i="0";
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(10);
DQ = 1;
dat>>=1;
}
}
读一个字节:
read_byte(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(10);
}
return(dat);
}
读出温度:
read_temp()
{
ow_reset(); //总线复位
write_byte(0xCC); //发skip ROM 命令(ccH、beH、44H见PDF的22页)
write_byte(0xBE); //发读命令
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
ow_reset();
write_byte(0xCC); //发skip ROM命令
write_byte(0x44); //发转换命令
}
温度数据处理:
在读出温度时,我们读出了temp_data[0]、temp_data[1]
在这里,temp_data[1]的低半字节和temp_data[0]的高半字节组成一字节,这个字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩下的temp_data[0]的低半字节转化成十进制后,就是温度值的小数部分
work_temp()
{
uchar n="0";
if(temp_data[1]>0x7f) //正负数判断
{
temp_data[0]=~temp_data[0]+1; //补码转换,取反加一
temp_data[1]=~temp_data[1];
n=1;
} //温度求负,补码
display[4]=temp_data[0]&0x0f; //取低字节的低4位-小数部分
display[0]=ditab[display[4]]; //存放小数部分
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //取整数部分
display[3]=display[4]/100; //取百位数
display[1]=display[4]%100;
display[2]=display[1]/10; //取十位数
display[1]=display[1]%10; //取个位数
/******************符号位显示判断**************************/
if(! display[3])
{
display[3]=0x0A; //最高位为0时不显示
if(! display[2])
{display[2]=0x0A;} //次高位为0时不显示
}
if(n){display[3]=0x0B;} //负温度时最高位显示"-"
}
文章评论(0条评论)
登录后参与讨论