基于msp430F149系列单片机
DQ连接到PORT6.5引脚
释放总线:即 空闲状态 因为连接上拉电阻,所以单总线在空闲状态时,一直处于高电平!
#include "430IO.h"
//-----------I/O口定义------------------
#define DS_DIR P6DIR_bit.P6DIR_5
#define DS_OUT P6OUT_bit.P6OUT_5
#define DS_IN P6IN_bit.P6IN_5
#define DQ 1
// #define dyus(x) { \ // 延迟函数很重要,因为DS18B20对时序要求很严格,第一次写时,失败就是因为延迟函数写的不够精准,
// unsigned int dy_i; \ // 延迟与晶振有关,8MHZ的晶振,一周期为 1 / 8MHZ=0.125us,5us大约40个周期,即大约执行40次汇编指令的时间
// for(dy_i=(x*10/8);dy_i>0;dy_i--); \ // 所以在写延迟函数时一定要注意使用的时钟频率!
// }
//延迟函数
void Delay(unsigned int x)
{
while(x!=0)x--;
}
//DS18B20复位函数
void DS_Reset()
{
DS_DIR=1; //DQ输出状态
DS_OUT=0; //输出低电平
dyus(500);//延迟500us
DS_OUT=1; //输出高电平,拉高 释放总线
dyus(60); //延迟60us,接收存在脉冲
DS_DIR=0; //D Q输入状态 zmy
while(DS_IN); //等待从机18应答,低电平有效
while(!DS_IN); //等待从机释放总线
dyus(430);
}
//DS18B20写字节函数
void DS_Write(unsigned char Data)
{
unsigned char i;
DS_DIR=1;
for(i=0;i<8;i++)
{
DS_OUT=0; //拉低总线
dyus(10); //延迟10us ,最大15us
if(Data & 0x01) DS_OUT=1;
else DS_OUT=0;
dyus(40); //延迟40us 最大45
DS_OUT=1;
dyus(1); // 稍微延迟
Data>>=1;
}
}
//DS18b20 读字节函数
unsigned char DS_Read()
{
unsigned char i,Temp;
Temp=0;
for(i=0;i<8;i++)
{
Temp>>=1;
DS_DIR=1; //DQ输出状态
DS_OUT=0;
dyus(1); //延迟1us
DS_OUT=1; //释放总线 即 空闲状态 因为需要连接上拉电阻,所以单总线在空闲状态时,一直处于高电平!
DS_DIR=0; //shuru
if(DS_IN) Temp=Temp|0X80;
dyus(45); //延迟45us 最大45
}
return Temp;
}
//读取温度函数
unsigned int Read_Temperature()
{
unsigned int Temp1,Temp2; // 低八位 高八位
//第一周期
DS_Reset(); //复位
DS_Write(0xCC); //跳过ROM
DS_Write(0X44); //温度转换
//第二周期
DS_Reset();
DS_Write(0xCC);
DS_Write(0xBE);
Temp1=DS_Read(); // 读低八位
Temp2=DS_Read(); //读高八位
DS_Reset(); //复位,表示读取结束
return (((Temp2<<8) | Temp1)*0.0625); //DS18B20的温度操作是16为,也就是说分辨率是0.0625 。0.0625=XX ,0.625=XX.X , 6.25=XX.XX
}
部分main函数
while(1)
{
FeedDog();
//*****************************DS18B20********************************
temp=Read_Temperature();
// Display_Temp[0]=temp/1000+'0'; // 带小数部分的
// Display_Temp[1]=temp%1000/100+'0';
// Display_Temp[2]=temp%100/10+'0';
Display_Temp[0]=temp/10+'0'; // 不带小数,只是整数部分。
Display_Temp[1]=temp%10+'0';
lcd_clear(0,8);
DisString(3, 50, Display_Temp,0, FONTSIZE16);
dyus(10000);
//*********************************************************************
}