||
经过两天的努力,今天终于将DS18B20的程序给调出来了,通过对DS18B20的调试,觉得应该注意的几点:
1。一定要将该芯片的时序图看懂,反复的看,直到看懂为止。
2。看清楚DS18B20的驱动顺序,初始化->跳过读寄存器->开始转换->初始化->跳过读寄存区->读温度寄存器。(采用的是外部电源,且只有一个DS18B20)。
3。看清楚读时间片和写时间片的时序图,因为在对DS18B20的驱动以及数据的读取,都是通过时间片来实现的,如果不将时间片给看懂的话,就无法对其驱动和数据的读取了。
其基本的程序如下:
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef float fp32;
typedef unsigned int uint32;
typedef signed int int32;
sbit P2_6= P2^6;
sbit P2_5=P2^5;
sbit P2_7=P2^7;
sbit date=P1^4;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
#define rck_l (P2_6=0) // (P1_1=0)
#define rck_h (P2_6=1) // (P1_1=1)
#define sck_l (P2_5=0) //(P1_2=0)
#define sck_h (P2_5=1) //(P1_2=1)
#define dat_l (P2_7=0) // (P1_0=0)
#define dat_h (P2_7=1) // (P1_0=1)
uint8 number[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
// 0 1 2 3 4 5 6 7 8 9 A b C d E FF
/*********************************
温度延时小程序。
*********************************/
void delay(uint16 dat)
{
while(dat--);
}
void delays(uint16 time)
{
uint8 i;
while(--time)
for(i=0;i<125;i++);
}
/**********************************
初始化DS18B20。
**********************************/
void DS18B20_START(void)
{
uint8 i;
date=1;
delay(8);
date=0;
delay(80);
date=1;
delay(8);
i=date;
delay(20);
}
/*********************************
写数据。
*********************************/
void DS18B20_WRITE(uint8 shu)
{
uint8 i;
for(i=0;i<8;i++)
{
date=0;
date=(shu&0x01);
delay(20);
date=1;
shu>>=1;
}
}
/*********************************
读数据。
*********************************/
uint8 DS18B20_READ(void)
{
uint8 i;
uint8 dat;
for(i=0;i<8;i++)
{
date=0;
dat>>=1;
date=1;
if(date)
dat|=0x80;
delay(4);
}
return(dat);
}
/************************************
送数据到数码管。
************************************/
void dat_to_595(uint8 dat)
{
uint8 i;
rck_l;
for(i=0;i<8;i++)
{
sck_l;
if((dat & 0x80)!=0)
dat_h;
else
dat_l;
dat<<=1;
sck_h;
}
rck_h;
}
/*******************************
运算数据。
********************************/
void yunsuan(uint32 t,uint32 tt)
{
uint32 a,b,c;
fp32 d;
tt<<=8;
t=tt|t;
d=t*0.0625;
d=d*10+0.5;
a=d/100;
b=d/10-a*10;
c=d-a*100-b*10;
P0=0xff;
dat_to_595(number[a]);
P0=0xf7;
delays(3);
P0=0xff;
P0=0xff;
dat_to_595(number);
P0=0xfb;
delays(3);
P0=0xff;
P0=0xff;
dat_to_595(number[10]);
P0=0xfd;
delays(3);
P0=0xff;
//P0=0xff;
dat_to_595(number[c]);
P0=0xfe;
delays(3);
P0=0xff;
}
/********************************
主函数。
*********************************/
void main(void)
{
uint32 a=0,b=0,c=0,tt=0,t=0;
while(1)
{
DS18B20_START(); //初始化
DS18B20_WRITE(0xcc); //跳过读寄存器
DS18B20_WRITE(0x44); //开始转换。
DS18B20_START(); //初始化。
DS18B20_WRITE(0xcc); //跳过读寄存区。
DS18B20_WRITE(0xbe); //读温度寄存器。
a=DS18B20_READ(); //数据采集。
b=DS18B20_READ(); //数据采集。
yunsuan(a,b); //运算。数据处理。
}
}
其硬件接线图如下:
其中的DS18B20的引脚接P1^4.
其中的SI1,RCK1,SCK1,SQH1分别接P2^7,P2^6,P2^5,P2^4.P0口接数码管的片选端,595的输出端接数码管的数据显示端。