⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 温度测量ds18b20.rar
💻 C
字号:
/*
我自己写的ds18b20的驱动,暂时固定PORTC0口当总线口好了
*/
#include <iom8v.h>
#include <macros.h>
#include "mydelay.h"
#include "ds18b20.h"
//一。单点测量只要有presense应答就可以了,多点测量以后再搞
//1.reset
void reset(void)
{
  DDRC=DDRC|0x01;//输出
  PORTC=PORTC&0xfe;//置0
  delay0ms500us();
}
//2.读取presense应答信号
void ReadPresense(void)
{
  DDRC=DDRC&0xfe;//输入
  delay0ms60us();
  while((PINC&0x01)==0x00) ;//检测到了应答信号
  //delay0ms60us();
}
unsigned char rdbit(void)
{
  unsigned char data;
  DDRC=DDRC|0x01;//输出
  PORTC=PORTC&0xfe;//置0
  delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
  //PORTC=PORTC|0x01;//置1
  DDRC=DDRC&0xfe;//输入
  data=PINC&0x01;
  delay0ms15us();
  delay0ms60us();//读时隙不少于60us
 return (data);
}
unsigned char rdbyte(void)
{
  unsigned char data;
  unsigned char i,j;
  for(i=8;i>0;i--)
  {
    j=rdbit();
    data=(data>>1)|(j<<7);
  }
  return (data);
}
void wtbit(unsigned char data)
{
  DDRC=DDRC|0x01;//输出
  PORTC=PORTC&0xfe;//置0
  delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
  if (data==0x01) PORTC=PORTC|0x01;//置1
  delay0ms60us();
  PORTC=PORTC|0x01;//拉高回来
  delay0ms60us();//时隙不少于60us
}
void wtbyte(unsigned char data)
{
  unsigned char i,j;
  for (i=8;i>0;i--)
  {
    j=(data>>i)&0x01;
	wtbit(j);
  }
}
//启动温度转换
void convert(void)
{
 reset();
 ReadPresense();
 wtbyte(0xcc);
 wtbyte(0x44);
}
//读温度值
unsigned int rdtemp(void)
{
 unsigned int temp,tmp;
 reset();
 ReadPresense();
 wtbyte(0xcc);
 wtbyte(0xbe);
 //temp=rdbyte();
 //tmp=temp;
 //temp=rdbyte();
 //temp=(temp<<8)|tmp;
 PORTB=rdbyte();
 PORTD=rdbyte();
 return temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -