📄 ds18b20.c
字号:
#include "main.h"
#include "reg52.h"
//#include "ds18b20intrins.h"
#include "absacc.h"
#include "stdio.h"
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
extern unsigned char Temperature_Lsm;
extern unsigned char Temperature_Msm;
sbit P3_5=P3^5;
uchar TEMP; // 温度值的变量;
uchar flag1; // 结果为负和正的标志位。
void Delay (unsigned int count)
{
unsigned int i;
while (count)
{
i =200;
while (i>0) i--;
count--;
}
}
void Temperature_Reset(void) // 发送复位和初始化
{
unsigned int i;
P3_5 = 0;
i = 103;
while (i>0) i--; // 延时
P3_5 = 1;
i = 4;
while (i>0) i--;
}
bit Temperature_Readbit(void) // 读取数据的一位
{
unsigned int i;
bit dat;
P3_5 = 0; i++;
P3_5 = 1; i++; i++; //延时
dat = P3_5;
i = 8; while (i>0) i--; // 延时
return (dat);
}
unsigned char Temperature_Readchar(void) //读一个字节
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j =Temperature_Readbit();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
void Temperature_Write(unsigned char dat) //写一个字节
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
P3_5 = 0; // 写0
i++; i++;
P3_5 = 1;
i = 8; while (i>0) i--;
}
else
{
P3_5 = 0; // 写0
i = 8; while (i>0) i--;
P3_5 = 1;
i++; i++;
}
}
}
void Temperature_Change(void) // ds1820 开始转换
{
Temperature_Reset(); // 复位
//tmpre (); // 等待存在脉冲
Delay (1); // 延时
Temperature_Write(0xcc); // 跳过序列号命令
Temperature_Write(0x44); // 发转换命令 44H,
}
void Read_Temperature(void) // 读取温度
{
//unsigned char a,b;
Temperature_Reset(); // 复位
Delay (1); // 延时
Temperature_Write(0xcc); // 跳过序列号命令
Temperature_Write(0xbe); // 发送读取命令
Temperature_Lsm= Temperature_Readchar(); // 读取低位温度
Temperature_Msm= Temperature_Readchar(); //读取高位温度
flag1=Temperature_Msm; //若b为1则为负温
if(flag1)
{
TEMP=~Temperature_Lsm+1; //如果为负温则去除其补码
}
else
{
TEMP=Temperature_Lsm;
}
}
/*
main()
{
do{
Tmperature_Change(); // 开始温度转换
Delay(200); // 读取延时
Read_Tmperature(); //读取温度
}while(1);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -