lml198694的笔记 https://passport2.21ic.com/?522233 [收藏] [复制] [RSS] 本博客主要记录学习感悟与经验。欢迎各位的指点与交流啊!!!!!!!!

日志

根据自己新开的51板子所写的系列程序(7)-DS18B20

已有 916 次阅读2008-7-28 08:44 |个人分类:51单片机|系统分类:单片机

经过两天的努力,今天终于将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的输出端接数码管的数据显示端。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)