⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 例程5驱动单线ds18b20.txt

📁 430各模块例程包
💻 TXT
字号:
MC430F14例程:驱动单线DS18B20 
 
                   这是国内卖得最为火热的MSP430单片机实验板之一!

【作  者】: 微控设计网DC版主 原创

【例程简介】: 利用MC430F14开发板上MSP430与DS18B20进行读操作实验。MCU读出来的温度数据后做数据处理,并在LCD12232中显示所测量到温度值。
   
 
 

【例  程】:
//基于MC430F14开发板实验例程
#include <msp430x14x.h>
//定义一个位设置,这样可以简化程序编写
#define DQ1 P5OUT|=BIT7
#define DQ0 P5OUT&=~BIT7
#define DQIO_OUT P5DIR|=BIT7
#define DQIO_IN P5DIR &= ~BIT7 
#define positive 0x0f 

//定义
unsigned char Error = 0;
float Temper=0.0;
int temperature=0;
unsigned char symbol = 1 ;

//----------------------------------
//功能:us 级别延时
//----------------------------------
void DelayNus(unsigned int n)
{
 while(n--){};
}

//-----------------------------------
//功能:写18B20
//-----------------------------------
void Write_18B20(unsigned char n)
{
 unsigned char i;
for(i=0;i<8;i++)
{
 DQ0;
 _NOP();_NOP(); 
 _NOP();_NOP();_NOP();
if((n&0X01)==0X01) 
 DQ1;
else 
 DQ0;
 n=n>>1; //下一位
 DelayNus(6); 
 DQ1;
 }
}

//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=temp>>1; //移向下一位
DQ0; 
_NOP();
DQ1;
_NOP();_NOP(); 
_NOP(); 

DQIO_IN; 

if((P5IN&BIT7)==0) 
 {
 temp=temp&0x7F; 
 }
else
 {
 temp=temp|0x80;
 }
DelayNus(5);
DQIO_OUT;
DQ1;
}
return temp;
}
//-----------------------------------

//初始化DS18B20
void Init (void)
{
 DQ0;  
 DelayNus(50);
 DQ1;
 DelayNus(10);
DQIO_IN; //设DQ为输入
if((P5IN&BIT7)==BIT7) 
 {
 Error =1;
 DQIO_OUT; 
 }
else
 {
 Error = 0;
 DQIO_OUT;
 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(); //读高位 
if((temp_high|positive)==positive)
 symbol=1; 
else
 symbol=0;
temperature=(temp_high&0x0f);
temperature<<=8; 
temperature|=temp_low;

if(symbol==0) //是否为负温度
{ temperature = (~temperature)+1;
 }
 Temper=temperature*0.0625; 
}

//----------------------------------
// 以上系列动作是根据DS18B20的通讯协议所得.
//读取温度
void GetTemp(void)
{
 Init(); //DS1820初始化
 Skip(); 
 Convert();
 DelayNus(60000); 
 DelayNus(60000); 
 DelayNus(60000);
 Init(); 
 Skip(); 
 ReadDo(); 
 ReadTemp(); 
}
//---------------------------------- 
  
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -