📄 ds18b20.c
字号:
#include "msp430x22x4.h"
//---------------------------------------------------------
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//---------------------------------------------------------
unsigned char Dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
void delay(unsigned int i); //delay
int Init_DS18B20(); // 初始化DS18B20子函数
unsigned char ReadOneChar(); // 读字节子函数
void WriteOneChar(unsigned char dat); //写字节子函数
void tmpchange(void); // DS18B20 开始
void tem_deal(unsigned int tem) ; //温度显示处理函数
unsigned int tmp(); //读取温度
unsigned int qqq;
unsigned int temp=0; // 定义一个变量,存储温度值
unsigned char temp_data[2]={0x00,0x00};//读出温度暂放
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
P3DIR|=BIT0; //设P3.0为DS18B20数据脚
P3OUT|=BIT0;
do
{
tmpchange(); //温度转换
delay_ms(1000); //延时1秒让它转换
tem_deal(tmp());
delay_ms(10); //延时
}
while(1);
}
//-------------------------------------------------------------
void delay(unsigned int i) //延迟函数
{
while(i--) {};
}
int Init_DS18B20()
{
unsigned char x=0;
x=0;
P3DIR|=BIT0; //P3.0 output
P3OUT&=~BIT0; //单片机将数据脚P3.0拉低
delay_us(500); //精确延时 大于 480us
P3OUT|=BIT0; //拉高总线
delay_us(30); //15 us ~~60 us
P3DIR&=0xfe; //设数据脚P3.0为输入
x=P3IN&BIT0; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
P3DIR|=BIT0; //保证P3.0 output
P3OUT|=BIT0;
delay_ms(10); //这里必须延迟一段时间
return x;
}
unsigned char ReadOneChar()
{
unsigned char i = 0,j;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
dat>>=1; //数据右移一位
P3DIR|=BIT0;
P3OUT&=~BIT0; //给脉冲信号 0
P3OUT|=BIT0; //OUTPUT 1
delay_us(1);
P3DIR&=~BIT0; //设数据脚P3.0为输入
j=P3IN&BIT0;
if(j==0) //DQ为1
dat&=0x7f; //读出数据
else
dat|=0x80;
delay_us(40); //延时40 us
}
P3DIR|=BIT0; //保证P3.0 output
P3OUT|=BIT0;
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i = 0;
P3DIR|=BIT0;
for (i=8; i>0; i--)
{
P3OUT&=~BIT0; //给脉冲信号 0
delay_us(3); delay_us(3); delay_us(3); delay_us(3); delay_us(1); //延时13 us
P3OUT= dat&0x01; //写入一位数据
delay_us(50); //延时 50us
P3OUT|=BIT0; //给脉冲信号 1
dat>>=1; //右移一位数据
}
P3DIR|=BIT0; //保证P3.0 output 1
P3OUT|=BIT0;
}
void tmpchange(void) // DS18B20 开始
{
Init_DS18B20(); // 初始化DS18B20
WriteOneChar(0xcc); // 跳过序列号命令
WriteOneChar(0x44); // 发送温度转换命令
}
unsigned int tmp() //读取温度
{
// float tt=0;
Init_DS18B20(); // 初始化ds18b2子函数
WriteOneChar(0xcc); // 跳过ROM命令
WriteOneChar(0xbe); // 发送读取数据命令
temp_data[0]=ReadOneChar(); // 连续读两个字节数据
temp_data[1]=ReadOneChar();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
// tt=temp*0.0625; // 得到真实十进制温度值,因为DS18B20
// 可以精确到0.0625度,所以读回数据的最低位代表的是
// 0.0625度。
return temp; // 返回温度值
}
void tem_deal(unsigned int tem)
{
/*************温度数据处理*****************/
if(tem>6348) // 温度值正负判断
{
tem=65536-tem;
tem = tem*6.25;
Dis_play[0]=tem/10000; //百位
Dis_play[1]=tem%10000/1000; //十位
Dis_play[2]=tem%1000/100; //个位
Dis_play[3]=tem%100/10;
Dis_play[4]=tem%10;
Dis_play[0]+=0x30; //百位
Dis_play[1]+=0x30; //十位
Dis_play[2]+=0x30; //个位
Dis_play[3]+=0x30;
Dis_play[4]+=0x30;
}
else
{
tem = tem*6.25;
Dis_play[0]=tem/10000; //百位
Dis_play[1]=tem%10000/1000; //十位
Dis_play[2]=tem%1000/100; //个位
Dis_play[3]=tem%100/10;
Dis_play[4]=tem%10;
Dis_play[0]+=0x30; //百位
Dis_play[1]+=0x30; //十位
Dis_play[2]+=0x30; //个位
Dis_play[3]+=0x30;
Dis_play[4]+=0x30;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -