关于DS18B20的应用相信大家都曾经看过或者实践过吧,这个小程序是原来大一时参考资料改的,当时用的是实验室发的开发板所以液晶程序我就省略了只留下了框架,感兴趣的朋友可以看看,程序的显示部分我省略了,根据自己需要往里面添加一些显示程序,就当做一个练习的小程序吧。
希望对您有帮助,您的支持,是我的动力~
#include"msp430x16x.h"
#include "lcd.h"
void init_port(void);
void Clock_Init();
void jiemian(void);
void menu();
颜色的宏定义 blue_green; red ; black ; green ; white ; blue ; yellow ; purple */
/=================变量定义======================*/
static unsigned int temp=0 ,wd=0;
static float wendu;
/*===============温度有关的函数声明及定义==============*/
uchar Init_18B20(void);
void Write_18B20(unsigned char wdata);
uchar Read_18B20(void);
void Skip(void);
void Convert(void);
void Read_SP(void);
uint ReadTemp(void);
uint Do1Convert(void);
#define DQ1 P6OUT |= BIT7 //高电平
#define DQ0 P6OUT &= ~BIT7 //低电平
#define DQ_in P6DIR &= ~BIT7 //设置为输入
#define DQ_out P6DIR |= BIT7 //设置为输出
#define DQ_val (P6IN & BIT7) //判断读取的值是否为低电平
/*=======主函数======*/
void main()
{
WDTCTL = WDTPW + WDTHOLD; //关看门狗
Clock_Init(); //单片机时钟初始化
init_port(); //单片机端口初始化
LCD_Init(); //液晶初始化
delay_ms(100);
menu();
_EINT(); //开总中断允许
while(1);
{
temp = Do1Convert(); // temp=temp/16; //温度值
wendu=temp*0.0625; //得到真实十进制温度值,因为DS18B20
//可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
wd=(int)(wendu*100);
Put_Char(11,6,0,67,green,black);
Put_Char(10,6,0,39,green,black);
Put_Char(9,6,1,wd%10,green,blue);
wd=wd/10;
Put_Char(8,6,1,wd%10,green,blue);
wd=wd/10;
Put_Char(7,6,0,46,green,red); //点
Put_Char(6,6,1,wd%10,green,blue);
wd=wd/10;
Put_Char(5,6,1,wd%10,green,blue);
}
}
/*=========================================
函数名称: init_port(void)
函数功能: 430单片机IO口初始化
函数参数:
==================================================*/
void init_port(void)
{
P4DIR=0XFF; //(P3/P4控制液晶的锁存器??)
P3DIR = 0XFF;
}
/*============时钟模块====================
函数功能: 初始化XT2时钟函数
===========================================*/
void Clock_Init()
{
uint iq0;
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); //延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); //判断XT2是否起振
BCSCTL2 = SELM_2 + SELS; //选择MCLK、SMCLK为XT2
//为高速时钟 不分频,均为8M
}
void jiemian(void)
{
;
}
void menu()
{
;
}
/*******************************************************************************
以下为DS18B20的预处理函数
********************************************************************************/
//以下是对18B20的操作
/**********************************************************
函数名称:Init_18B20
功 能 :对ds18b20进行复位操作
参 数:无
返回值:初始化状态标志:1--失败, 0--成功
*********************************************************/
uchar Init_18B20(void)
{
uchar Error;
_DINT(); //关中断
DQ0; //拉低
delay_us(500);
DQ1; //拉高
delay_us(55);
P6DIR &=~ BIT7; //方向设为输入,用于接收信号
_NOP(); //空指令,让CPU等待一个周期
if (P6IN & BIT7) // ? 有疑问 (如果不是低电平)
{
Error = 1; //初始化失败
P6DIR |= BIT7;
}
else
{
Error = 0; //初始化成功
P6DIR |= BIT7;
DQ1;
}
_EINT(); // 全局中断使能
delay_us(400);
return Error;
}
/****************************************************************
函数名称:Write_18B20
功 能:向DS18B20写一个字节的数据
参 数:wdata--写入的数据
返回值:无
***************************************************************/
void Write_18B20(uchar wdata)
{
uchar i;
_DINT();
for(i = 0; i < 8;i++)
{
DQ0;
delay_us(6); //延时6us
if(wdata & 0X01) DQ1;
else DQ0;
wdata >>= 1;
delay_us(50); //延时50us
DQ1;
delay_us(10); //延时10us
}
_EINT();
}
/***********************************************************
函数名称:Read_18B20
功 能:从DS18B20读取一个字节的数据
参数:无
返回值:读出的一个字节数据
**********************************************************/
uchar Read_18B20(void)
{
uchar i;
uchar temp = 0;
_DINT();
for (i = 0; i < 8; i++)
{
temp >>= 1;
DQ0;
delay_us(6);
DQ1;
delay_us(8);
P6DIR &= ~BIT7;
_NOP();
if (P6IN & BIT7) temp |= 0x80;
delay_us(45);
P6DIR |= BIT7;
DQ1;
delay_us(10);
}
_EINT();
return temp;
}
/**********************************************************
函数名称:Skip
功能:发送跳过读取ID号命令
参数:无
返回值:无
*********************************************************/
void Skip(void)
{
Write_18B20(0XCC);
}
/*********************************************************************
函数名称:Convert(void)
功能:发送温度转换命令
参数: 无
返回值:无;
*********************************************************************/
void Convert(void)
{
Write_18B20(0x44);
}
/***********************************************************************
函数名称:Read_SP
功能:发送读Scratchad命令
参数:无
返回值:无
************************************************************************/
void Read_SP(void)
{
Write_18B20(0xbe);
}
/***************************************************************************
函数名称:ReadTemp
功能:从DS18B20的ScratchPad读取温度转换结果
参数:无
返回值:读取的温度值
****************************************************************************/
uint ReadTemp(void)
{
uchar temp_low;
uint temp;
temp_low = Read_18B20(); //读低位
temp = Read_18B20(); //读高位
temp = (temp<<8) | temp_low;
return temp;
}
/**********************************************************************
函数名称:ReadTemp
功能:控制DS18B20完成一次温度转换
参数: 无
返回值:测量的温度
**********************************************************************/
uint Do1Convert(void)
{
uchar i;
do
{
i = Init_18B20();
}
while(i);
Skip();
Convert();
for(i = 20;i > 0;i--)
delay_ms(45); //延时800ms以上 //GAIDONG
do
{
i = Init_18B20();
}
while(i);
Skip();
Read_SP();
return ReadTemp();
}
用户377235 2014-4-4 12:55
用户447311 2013-5-14 18:10
用户377235 2012-10-30 18:06
用户377235 2012-10-18 18:31
用户377235 2012-10-18 13:46
13510179723_912348475 2012-8-12 22:10
Alwin 2012-8-7 13:05
wxg1988 2012-8-7 09:02