/******************************DS18B20数字温度计**********************************************************/
/*作者:张立春
时 间:2009年6月18日~6月19日
单片机:MSP430 F168
版 本:V1.0
*/
//*********************************硬件连接*****************************************************************
//------------------------------- DS18B20 ------------------------------------
//| |
//| P17--->DQ |
//------------------------------- ----------------------------------
//当前演示程序功能描述:
//循环进行温度检测,将结果分别保存在
// ResultSignal 温度符号(0x01为负)
// ResultTemperatureH 温度整数
// ResultTemperatureLH 温度小数(高两位)
// ResultTemperatureLL 温度小数(低两位)
//**********************************************************************************************************
#include <msp430x16x.h>
//*******************************定义DS18B20端口************************************************************
#define DS18B20_DIR P1DIR
#define DS18B20_IN P1IN
#define DS18B20_OUT P1OUT
#define DS18B20_DQ BIT7 //定义DS18B20的接口
// *****************************DS18B20 ROM命令宏定义*******************************************************
#define ReadRom 0x33
#define MatchRom 0x55
#define SearchRom 0xf0
#define AlertSearch 0xec
#define CopyScratchpad 0x48
#define SkipRom 0xcc
#define ReadPower 0xb4
//***************************** DS18B20 功能命令宏定义*****************************************************
#define ConvertTemperature 0x44
#define ReadScratchpad 0xbe
#define WriteScratchpad 0x4e
#define RecallE 0xb8
//****************************微秒和毫秒的软件延迟子函数*************************************************
#define CPU_F ((double)8000000)
#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))
/*******************************************************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define MEM_OUT P1OUT
#define DA BIT2
#define DA_OUT P1OUT
#define CLK BIT0 //P3.6
#define CLK_OUT P1OUT
#define MEM BIT1 //数据发送端
// ***************************变量定义****************************************************************************
unsigned char GetScratchpad[9];
unsigned char ResultTemperatureH; //温度的整数部分
unsigned char ResultTemperatureL; //温度的小数部分(高位)
unsigned char ResultTemperatureLL; //温度的小数部分(低位)
uint t2;
const unsigned char bcd[16]={0x24,0x77,0x0e,0x46,0x55,0xc4,0x84,0x74,0x04,0x44,0x88,0x83,0xC6,0xa1,0x86,0x8e };
//*****************************函数说明***************************************************************************
unsigned int DS18B20_ReadTemp(void);
void DS18B20_Init(void);
unsigned char DS18B20_ReadB(void);
void DS18B20_WriteB(uchar wrd);
void initboard(void);
uchar* Num_BCD(uint num);
void outlcd(void);
//*****************************主函数*****************************************************************************************
void main(void)
{ volatile uint i,j;
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
BCSCTL1 &= ~XT2OFF; //XT2 = HF XTAL
do { IFG1 &= ~OFIFG; //Clear OSCFault flag
for (i=0xFF;i>0;i--); //Time for flag to set}
}
while((IFG1&OFIFG)); //OSCFault flag still set?启动8MHz精振
BCSCTL2 |= (SELM1 + SELS); //MCLK = SMCLK = XT2
initboard();
DS18B20_Init(); //初始化DS18B20
while(1) //大循环用于数码管实时显示温度
{ uint t;
uchar i,temp[3];
uchar *temppt;
t=DS18B20_ReadTemp();
t*=0.625; //转换成实际温度的10倍
temppt=Num_BCD(t); //将实际温度的10倍转换成BCD码
for(i=0;i<3;i++) //将转换后的BCD码存入显示数组
{
temp[i]=*(temppt+i);
}
t2=temp[2]; //最高位数值
t2=(int)bcd[t2]; //t2在outlcd()中
outlcd(); //将第一个数的8位串行输入到第一个SN54HC595
t2=temp[1]; //???修改,使其小数点亮
t2=t2|BIT7;
t2=(int)bcd[t2]; //t2在outlcd()中
outlcd(); //将第二个数的8位串行输入到第一个SN54HC595
t2=temp[0]; //最低位数值
t2=(int)bcd[t2]; //t2在outlcd()中
outlcd(); //将第三个数的8位串行输入到第一个SN54HC595
t2=0;
t2=(int)bcd[t2]; //t2在outlcd()中
outlcd(); //将第四个数的8位串行输入到第一个SN54HC595
t2=0;
t2=(int)bcd[t2]; //t2在outlcd()中
outlcd(); //将第五个数的8位串行输入到第一个SN54HC595
t2=0;
t2=(int)bcd[t2]; //t2在outlcd()中
outlcd(); //将第六个数的8位串行输入到第一个SN54HC595
MEM_OUT |= MEM ; //上升沿触发
MEM_OUT &=~ MEM ;
}
}
// ***************************功能函数定义*******************************************************************************
/*************************************************************************************************************************
函数名称:DS18B20_Init
功 能:复位DS18B20
参 数:无
返回值 :无
************************************************************************************************************************/
void DS18B20_Init(void)
{ DS18B20_DIR|=DS18B20_DQ ; //配置P17为输出
DS18B20_OUT&=~DS18B20_DQ; //拉低
delay_us(600); //最小为480us
DS18B20_OUT|=DS18B20_DQ; //释放总线
delay_us(60); //范围15~60us
DS18B20_DIR&=~DS18B20_DQ; //配置为输入
while((DS18B20_IN&DS18B20_DQ)); //等待DS18B20 拉低
while(!(DS18B20_IN&DS18B20_DQ)); //等待DS18B20释放总线
} //Intialization the 1-wire devices
/***************************************************************************************************************************
函数名称: DS18B20_ReadB
功 能:从DS18B20读取一个字节的数据
参 数:无
返回值 :retd——返回的一个字节的数据
*****************************************************************************************************************************/
unsigned char DS18B20_ReadB(void)
{ uchar i,retd=0;
for(i=0;i<8;i++) //位计数值
{retd>>=1; //右移,准备接收新的数据位
DS18B20_DIR|=DS18B20_DQ ; //配置P17为输出
DS18B20_OUT&=~DS18B20_DQ; //拉低,准备启动读数据位
DS18B20_OUT|=DS18B20_DQ ; //释放总线
delay_us(5); //等待5us
DS18B20_DIR&=~DS18B20_DQ ; //配置为输入,开始读数据位
if(DS18B20_IN&DS18B20_DQ) //判断该位是否为高
retd|=0x80; //若为高,则将此位置高
delay_us(50); //否则,等待>50us
}
return retd; //将读到的一个字节返回
} //Read a bit on the 1-wire bus;
/*****************************************************************************************************************************
函数名称: DS18B20_WriteB
功 能:给DS18B20写入一个字节的数据
参 数:wrd——要写入的数据
返回值 :无
*************