📄 18b20_1.c
字号:
//========================================= 头文件 ==========================================
#include <msp430x22x4.h>
//========================================== 宏定义 =========================================
//=== DS18B20 使用说明 ===
// P3.0 ------ DS18B20-DQ 数据输入输出端
#define DQ1 P3OUT|=BIT0 //DS18B20接口为P3.0口
#define DQ0 P3OUT&=~BIT0
#define Set_clk P4OUT|=BIT1
#define Clr_clk P4OUT&=~BIT1
//======================================== 函数声明 ====
//==== DS18B20 ====
void DelayNus(unsigned int n);
void Write_18B20(unsigned char n);
unsigned char Read_18B20(void);
void Init (void);
void Skip(void);
void Convert (void);
void ReadDo (void);
void ReadTemp (void);
void GetTemp(void);
float Temper=0.0;
int temperature=0;
unsigned char Error=0;
unsigned int temp[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};
//=======================================================================================
//============功能:us 级别延时 n=10,则延时10*5+6=56uS================================
//=============08========================================================================
void DelayNus(unsigned int n)
{
while(n--){};
}
//=======================================================================================
//============功能:写18B20 =============================================================
//=======================================================================================
void Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ0;
DelayNus(1); //==延时5us===
if((n&0X01)==0X01)
DQ1;
else DQ0;
n=n>>1;
DelayNus(9); //==延时50us 以上===
DQ1;
}
}
//=======================================================================================
//============功能:读取18B20 ===========================================================
//=======================================================================================
unsigned char Read_18B20(void)
{
unsigned char i;
unsigned char temp_1;
for(i=0;i<8;i++)
{
temp_1=temp_1>>1;
DQ0;
_NOP(); //==延时1us===
DQ1;
_NOP();_NOP(); //==延时5us===
_NOP();_NOP();_NOP();
P3DIR&=~BIT0;
if((P3IN&BIT0)==0)
{
temp_1=temp_1&0x7F;
}else
{
temp_1=temp_1|0x80;
}
DelayNus(7); //==延时40us===
P3DIR|=BIT0;
DQ1;
}
return temp_1;
}
//=======================================================================================
//============DS18B20的初始化 ==========================================================
//=======================================================================================
void Init (void)
{
DQ0;
DelayNus(50); //==延时500us=================
DQ1;
DelayNus(17); //==延时16~60us==============
P3DIR&=~BIT0;
if((P3IN&BIT0)==BIT0) //==0001 1111b=1f ===========
{
Error =1; //==失败1=====================
P3DIR|=BIT0;
}else
{
Error = 0; //==初始化成功================
P3DIR|=BIT0;
DQ1;
}
}
//=======================================================================================
//======指令描述:跳过ROM命令,指定代码为CCH,忽略64位ROM地址,直接向DS1820发温度变换命令,===
// 适用于单片机工作.
//=======================================================================================
void Skip(void)
{
Write_18B20(0xcc);
}
//=======================================================================================
//========== 指令描述:温度转换命令,指定代码为44H.启动DS1820进行温度转换,12位转换时最长===
// 为750ms(9位为93.75ms).结果存入内部9字节RAM中.
//=======================================================================================
void Convert (void)
{
Write_18B20(0x44);
}
//=======================================================================================
//================指令描述:读暂存器,指定代码为BEH.读内部RAM中9字节的内容.================
//=======================================================================================
void ReadDo (void)
{
Write_18B20(0xbe);
}
//=======================================================================================
void ReadTemp (void)
{
char temp_low,temp_high; //== 温度值 =====
temp_low=Read_18B20(); //== 读低位 =====
temp_high=Read_18B20(); //== 读高位 =====
temperature=(temp_high&0x0f); //=== 屏蔽高4位==
temperature<<=8; //=== 将temp_high部分数据移到temperature高8位===
temperature|=temp_low; //=== 将高低两字节内部合并成一个16位数据===
Temper=temperature*0.0625; //=== 计算真实温度值===
}
void GetTemp(void)
{
Init();
Skip();
Convert();
DelayNus(60000);
DelayNus(60000);
DelayNus(60000);//延时1s以上
Init();
Skip();
ReadDo();
ReadTemp();
}
void Display(int value)
{
int i,j,s[8],flag=0;
int m;
Set_clk;
m=value;
for(i=0;i<8;i++) s[i]=0;
for(i=0;i<8;i++)
{ s[i]=m%10;
m/=10;
}
for(i=7;i>=0;i--)
{
if(s[i]!=0) break;
if(s[0]==0) flag=1;}
if(flag==1)
for(j=1;j<8;j++) s[j]=10;
else for(j=7;j>i;j--) s[j]=10;
Set_clk;
for(i=7;i>=0;i--)
{
m=temp[s[i]];
for(j=0;j<8;j++)
{
Clr_clk;
DelayNus(1);
if((m&0x01)==1) P4OUT|=BIT0;
else P4OUT&=~BIT0;
m>>=1;
Set_clk;
DelayNus(1);
}
Clr_clk;
}
}
//=======================================================================================
//============获取DS18B20的温度值========================================================
//=======================================================================================
//=== MCU对DS18B20进行温度转换时,其操作必须满足以下过程:
//=== 1- 每一次读写之前都要对DS18B20进行复位.
//=== 2- 完成复位后发送一条ROM命令到DS18B20.
//=== 3- 最后发送一条RAM命令到DS18B20.
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P4DIR=0x03;
DQ1;
while(1)
{
GetTemp();
Display(Temper);
DelayNus(1000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -