PIC16F877A DS18B20数字温度计实验
2019-04-15 12:01发布
生成海报
main.c
#include
#include
#include "def.h"
#include "ds18b20.h"
__CONFIG(0xFF32);
void Delay_ms(u16 xms)
{
int i,j;
for(i=0;i %d.%d℃
",RomCode[0],RomCode[1],temperature/10,temperature%10);
}
}
Delay_ms(3000);
}
}
ds18b20.h
#include
#include "def.h"
#ifndef __ds1820_h
#define __ds1820_h
extern u8 RomCode[2];
#define DQ1 RC1=1
#define DQ0 RC1=0
#define DQ_in TRISC1=1
#define DQ_out TRISC1=0
#define DQ_val RC1
#define _DINT() di()
#define _EINT() ei()
#define _NOP() asm("nop")
u8 Init_18B20(void);
short CalcTemp(short a);
void Skip(void);
void Convert(void);
void Read_SP(void);
u8 Read_18B20(void);
short ReadTemp(u8 *r);
#endif
ds18b20.c
/*********************************
PIC16F877A@4MHz
*********************************/
#include "ds18b20.h"
#include "def.h"
u8 RomCode[2];
#define DelayNus _delay
u8 Init_18B20(void)
{
u8 Error;
DQ_out;
_DINT();
DQ0;
DelayNus(500); //延迟至少480us
DQ1;
DelayNus(55); //释放DQ后延时120us(60~240)后再读数
DQ_in;
_NOP();
if(DQ_val)
Error = 1; //初始化失败
else
Error = 0; //初始化成功
DQ_out;
DQ1;
_EINT();
DelayNus(400);
return Error;
}
void Write_18B20(u8 wdata)
{
u8 i;
for(i = 0; i < 8;i++)
{
_DINT();
DQ0;
//DelayNus(6); //延时2us
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
if(wdata & 0X01)
DQ1;
else
DQ0;
wdata >>= 1;
DelayNus(70); //延时91us
DQ1;
_EINT();
_NOP();
}
}
u8 Read_18B20(void)
{
u8 i;
u8 temp = 0;
for(i = 0;i < 8;i++)
{
temp >>= 1;
_DINT();
DQ0;
_NOP();
_NOP();
_NOP();
_NOP();
DQ1;
//DelayNus(8); //延时9us
DQ_in;
//DelayNus(25); //延时45us
if(DQ_val)
temp |= 0x80;
DQ_out;
DQ1;
DelayNus(70); //延时10us
_EINT();
_NOP();
}
return temp;
}
void Skip(void)
{
Write_18B20(0xcc);
}
void Convert(void)
{
Write_18B20(0x44);
}
void Read_SP(void)
{
Write_18B20(0xbe);
}
short ReadTemp(u8 *r)
{
u8 temp_low;
short temp;
temp_low = r[0]; //读低位
temp = r[1]; //读高位
temp = (temp<<8) | temp_low;
return temp;
}
const u8 dottab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
//优化读数算法
short CalcTemp(short a)
{
u8 b;
if(a<0)
{
a=~a;
a++;
b=a;
a>>=4;
a*=-10;
a-=dottab[b&0x0f];
}
else
{
b=a;
a>>=4;
a*=10;
a+=dottab[b&0x0f];
}
return a;
}
def.h
#ifndef __DEF__H_
#define __DEF__H_
#define u8 unsigned char
#define u16 unsigned int
#endif
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮