×
单片机 > 单片机程序设计 > 详情

DS18B20的使用程序PIC单片机

发布时间:2020-08-25 发布时间:
|


#include

__CONFIG(0x1832);        

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡


#define  uch unsigned char                     //给unsigned char起别名 uch

# define DQ RA2                                //定义18B20数据端口 

# define DQ_DIR TRISA2                         //定义18B20D口方向寄存器 

# define DQ_HIGH() DQ_DIR =1                   //设置数据口为输入

# define DQ_LOW() DQ = 0; DQ_DIR = 0           //设置数据口为输出

unsigned char  TLV=0 ;                        //采集到的温度高8位

unsigned char  THV=0;                         //采集到的温度低8位

unsigned char TZ=0;                           //转换后的温度值整数部分

unsigned char TX=0;                           //转换后的温度值小数部分

unsigned int wd;                              //转换后的温度值BCD码形式

unsigned char shi;                             //整数十位

unsigned char ge;                              //整数个位

unsigned char shifen;                          //十分位

unsigned char baifen;                          //百分位

unsigned char qianfen;                         //千分位

unsigned char wanfen;                          //万分位

unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 

//0-9的显示代码

//------------------------------------------------

//延时函数

void delay(char x,char y) 

{

  char z;

  do{

      z=y;

      do{;}while(--z);

     }while(--x);

}

//其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。

//则是:14+(3*(Y-1)+7)*(X-1)。

//--------------------------------------------------

//结果显示函数

void display()

{

TRISA=0X00;                            //设置A口全为输出

PORTD=table[shi];                      //显示整数十位

PORTA=0x1f;

delay(10,70);

PORTD=table[ge]&0X7F;                  //显示整数个位,并点亮小数点

PORTA=0x2f;

delay(10,70);

PORTD=table[shifen];                   //显示小数十分位

PORTA=0x37;

delay(10,70);

PORTD=table[baifen];                   //显示小数百分位

PORTA=0x3b;

delay(10,70);

PORTD=table[qianfen];                  //显示小数千分位

PORTA=0x3d;

delay(10,70);

PORTD=table[wanfen];                   //显示小数万分位

PORTA=0x3e;

delay(10,70);

}

//------------------------------------------------

//系统初始化函数

void init()

{

  ADCON1=0X07;                                //设置A口为普通数字口

  TRISA=0X00;                                 //设置A口方向为输出

  TRISD=0X00;                                 //设置D口方向为输出

}

//-----------------------------------------------

//复位DS18B20函数

reset(void)

{

  char presence=1;

  while(presence)

  { 

    DQ_LOW() ;                                //主机拉至低电平

    delay(2,70);                              //延时503us

    DQ_HIGH();                                //释放总线等电阻拉高总线,并保持15~60us

    delay(2,8);                               //延时70us

    if(DQ==1) presence=1;                     //没有接收到应答信号,继续复位

    else presence=0;                          //接收到应答信号

    delay(2,60);                              //延时430us

   }

  }

//-----------------------------------------------

//写18b20写字节函数

void write_byte(uch val)

{

uch i;

uch temp;

for(i=8;i>0;i--)

{

   temp=val&0x01;                            //最低位移出

   DQ_LOW(); 

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();                                    //从高拉至低电平,产生写时间隙

   if(temp==1)  DQ_HIGH();                   //如果写1,拉高电平

   delay(2,7);                               //延时63us

   DQ_HIGH(); 

   NOP();

   NOP();

   val=val>>1;                               //右移一位

  }

}

//------------------------------------------------

//18b20读字节函数

uch read_byte(void)

{

uch i;

uch value=0;                                //读出温度

static bit j;

for(i=8;i>0;i--)

{

   value>>=1; 

   DQ_LOW();

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();                                   //6us

   DQ_HIGH();                               //拉至高电平

   NOP(); 

   NOP();

   NOP();  

   NOP(); 

   NOP();                                  //4us

   j=DQ;

   if(j) value|=0x80;

   delay(2,7);                             //63us

  }

  return(value);

}

//-------------------------------------------------

//启动温度转换函数

void get_temp()

int i;

DQ_HIGH();

reset();                                 //复位等待从机应答 

write_byte(0XCC);                        //忽略ROM匹配 

write_byte(0X44);                        //发送温度转化命令  

for(i=20;i>0;i--)

    {

        

        display();                       //调用多次显示函数,确保温度转换完成所需要的时间

    }

reset();                                 //再次复位,等待从机应答 

write_byte(0XCC);                        //忽略ROM匹配 

write_byte(0XBE);                        //发送读温度命令 

TLV=read_byte();                         //读出温度低8 

THV=read_byte();                         //读出温度高8位 

DQ_HIGH();                               //释放总线 

TZ=(TLV>>4)|(THV<<4)&0X3f;               //温度整数部分

TX=TLV<<4;                               //温度小数部分

if(TZ>100) TZ/100; //不显示百位


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容