📄 18b20.c
字号:
#include "iom128v.h"
#include "macros.h"
#include "gprs.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
signed char Temp_H;
signed char Temp_L;
//float f_TEMP;
/**********************************************************************************/
void Reset (void) // 复位和初始化
{
unsigned char error = 0;
delay (3); // 延时
DQ_0;
DQ_OUT;
delay(900);//480-960us 600us
DQ_IN;
delay(30);//15-60us
if(DQ_READ)
{
error = 1;
}
else
{
error = 0;
}
delay(750);//60-240us
}
/**********************************************************************************/
unsigned char Read_one_bit (void) //读取数据的一位
{
unsigned char i;
DQ_OUT;
DQ_1;
DQ_0;
DQ_IN;
delay(15);//15us
if(DQ_READ)
i = 1;
else
i = 0;
delay(50);//45us
return i;
}
/**********************************************************************************/
unsigned char Read_one_byte2 (void) //读一个字节
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = Read_one_bit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
/**********************************************************************************/
void Write_one_byte (unsigned char data) //写一个字节
{
unsigned char i;
unsigned char j;
unsigned char testb;
for (j=1;j<=8;j++)
{
testb = data & 0x01;
data = data >> 1;
DQ_1;
DQ_OUT;
if (testb)
{
/*DQ = 0; // 写0
_nop_; _nop_;
DQ = 1;
i = 8;
while (i--);*/
DQ_0;
delay(15);//15us
// delay(15);//15us
DQ_IN;
delay(50);//45us
}
else
{
/*DQ = 0; // 写0
i = 8;
while (i--);
DQ = 1;
_nop_; _nop_;*/
DQ_0;
//DQ_OUT;
delay(70);//60us
DQ_IN;
}
}
}
/********************************************************************************/
void Temp_Change(void) // ds1820 开始转换
{
Reset (); // 复位
delay (3); // 延时
Write_one_byte (0xcc);// 跳过序列号命令
delay (3); // 延时
Write_one_byte (0x44); // 发转换命令 44H
delay (3); // 延时
}
/*********************************************************************************/
float Read_Temp (void) // 读取温度
{
unsigned int a,b,d;
float temperature = 0;
signed int temp = 0;
Reset (); // 复位
delay (3); // 延时
Write_one_byte (0xcc); // 跳过序列号命令
delay (3); // 延时
Write_one_byte (0xbe); // 发送读取命令
delay (3); // 延时
a = Read_one_byte2 ();// 读取低位温度
delay (3); // 延时
b = Read_one_byte2 (); //读取高位温度
delay (3); // 延时
b=b<<8;
d=a+b;
///////////////////////
if((0xf000&b)!=0)
{
// flag1=1; //若b为1则为负温
temp = -(~d+1); //如果为负温则去除其补码
}
///////////////////////
else
temp=d;
temperature = temp * 0.0625;
// temperature = -15.1;
return temperature;
}
/********************************************************************************/
void Measure(float *temperature)
{
DQ_OUT;
CLI();
Temp_Change();// 开始温度转换
// Delay_ms(1000);
*temperature = Read_Temp(); //读取温度
// *temperature = -5.0;
SEI();
Temp_H = (signed char)(*temperature);
if(Temp_H >= 100)
{
Temp_H = 99;
}
else if(Temp_H < -40)
{
Temp_H = -40;
}
if (*temperature < 0)
{
Temp_L = (int)(-*temperature * 100) % 100;
}
else
{
Temp_L = (int)(*temperature * 100) % 100;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -