#include <msp430x16x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
float Temper=0.0;
int temperature=0;
unsigned char Temp_18B20_high=0,Temp_18B20_low=0;
unsigned char Temp_18B20_flag=0;
unsigned char Error = 0;
#define DQ1 P1OUT |= BIT0
#define DQ0 P1OUT &= ~BIT0
#define DQ_in P1DIR &= ~BIT0
#define DQ_out P1DIR |= BIT0
#define DQ_val (P1IN & BIT0)
/*******************************************
函数名称:DelayNus
功 能:实现N个微秒的延时
参 数:n--延时长度
返回值 :无
说明 :定时器A的计数时钟是1MHz,CPU主频8MHz
所以通过定时器延时能够得到极为精确的
us级延时
********************************************/
void DelayNus(uint n)
{
CCR0 = n;
TACTL |= MC_1; //增计数到CCR0
while(!(TACTL & BIT0)); //等待
TACTL &= ~MC_1; //停止计数
TACTL &= ~BIT0; //清除中断标志
}
/****************************************************************************
* 名 称:uint Init_18B20(void)
* 功 能:对DS18B20进行复位操作
* 入口参数:无
* 出口参数:无
* 说 明:初始化状态标志:1--失败,0--成功
* 调用方法:Init_18B20();
****************************************************************************/
uchar Init_18B20(void)
{
uchar Error;
DQ_out;
DQ0;
DelayNus(500);//500us
DQ1;
DelayNus(55);//55us
DQ_in;
_NOP();
if(DQ_val)
{
Error = 1; //初始化失败
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;
DelayNus(400); //最小240us即可
return Error;
}
/****************************************************************************
* 名 称:uint Write_18B20(void)
* 功 能:向DS18B20写入一个字节的数据
* 入口参数:wdata--写入的数据
* 出口参数:无
* 说 明:
* 调用方法:Write_18B20();
****************************************************************************/
void Write_18B20(uchar wdata)
{
uchar i;
for(i = 0; i < 8;i++)
{
DQ0;
DelayNus(6); //延时6us
if(wdata & 0X01)
DQ1;
else
DQ0;
wdata >>= 1;
DelayNus(50); //延时50us
DQ1;
DelayNus(10); //延时10us
}
}
/****************************************************************************
* 名 称:uint Read_18B20(void)
* 功 能:从DS18B20读取一个字节的数据
* 入口参数:无
* 出口参数:读出的一个字节数据
* 说 明:
* 调用方法:Read_18B20();
****************************************************************************/
uchar Read_18B20(void)
{
uchar i;
uchar temp = 0;
//_DINT();
for(i = 0;i < 8;i++)
{
temp >>= 1;
DQ0;
DelayNus(6); //延时6us
DQ1;
DelayNus(8); //延时9us
DQ_in;
_NOP();
if(DQ_val) temp |= 0x80;
DelayNus(45); //延时45us
DQ_out;
DQ1;
DelayNus(10); //延时10us
}
//_EINT();
return temp;
}
/****************************************************************************
* 名 称:uint Skip(void)
* 功 能:发送跳过读取产品ID号命令
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:Skip();
****************************************************************************/
void Skip(void)
{
Write_18B20(0xcc);
}
/****************************************************************************
* 名 称:uint Convert(void)
* 功 能:发送温度转换命令
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:Convert();
****************************************************************************/
void Convert(void)
{
Write_18B20(0x44);
}
/****************************************************************************
* 名 称:uint Read_SP(void)
* 功 能:发送读ScratchPad命令
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:Read_SP();
****************************************************************************/
void Read_SP(void)
{
Write_18B20(0xbe);
}
/****************************************************************************
* 名 称:uint ReadTemp(void)
* 功 能:从DS18B20的ScratchPad读取温度转换结果
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:ReadTemp();
****************************************************************************/
uint ReadTemp(void)
{
uchar temp_low;
uint temp;
temp_low = Read_18B20(); //读低位
Temp_18B20_low=temp_low;
temp = Read_18B20(); //读高位
Temp_18B20_high=temp;
temp = (temp<<8) | temp_low;
return temp;
}
/****************************************************************************
* 名 称:uint Do1Convert(void)
* 功 能:控制DS18B20完成一次温度转换
* 入口参数:无
* 出口参数:测量的温度数值
* 说 明:
* 调用方法:Do1Convert();
****************************************************************************/
uint Do1Convert(void)
{
uchar i;
do
{
i = Init_18B20();
}
while(i);
Skip();
Convert();
for(i = 20;i > 0;i--)
DelayNus(60000); //延时800ms以上
do
{
i = Init_18B20();
}
while(i);
Skip();
Read_SP();
return ReadTemp();
}
/****************************************************************************
* 名 称:void init_USART0(void)
* 功 能:串口0初始化
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:init_USART0();
****************************************************************************/
void init_USART0(void)
{
P3SEL |= 0x30; // P3.4,5 作为串口0发送接收功能
ME1 |= UTXE0 + URXE0; // 允许串口0接收/发送
UCTL0 |= CHAR; // 该位为0字符长度7位,为1长度为8位
UTCTL0 |= SSEL0; // 波特率发发生器时钟源选择辅助时钟
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; // 波特率=BRCLK/(UBR+(M7+..+M0)/8)
UMCTL0 = 0x4A; // 调整波特率
UCTL0 &= ~SWRST; // 串口状态初始化
// 一次正确的串口初始化就在SWRST=1
// 情况下设置串口,然后SWRST=0,之后
// 如果需要中断则设置相应中断使能
IE1 |= URXIE0; // 使能串口0接收中断
_EINT(); // 使能总中断
}
/****************************************************************************
* 名 称:void Clk_init()
* 功 能:开启430高速晶振
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法: Clk_init();
****************************************************************************/
void Clk_init()
{
unsigned char i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡错误标志
for(i = 0; i < 100; i++)
_NOP(); //延时等待
}
while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
BCSCTL2 =SELM_2+SELS + DIVS_0; //选择MCLK、SMCLK为XT2,8M,子系统时钟不分频
//,给定时器时再8分频
TACTL = TASSEL_2+ID_3;
}
/****************************************************************************
* 名 称:void main(void)
* 功 能:主函数
* 入口参数:无
* 出口参数:无
* 说 明:通过串口向单片机发送一个数据,在串口中断程序中将DS18B20开启转换标志
* 置1.当转换标志为1时主函数开启转换并将读取温度值送回串口0
* 调用方法:
* 作 者:成都信息工程学院 电子爱好者协会 陈雪夫
****************************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
C
MSP430驱动DS18B20可用
4星 · 超过85%的资源 需积分: 10 63 浏览量
2011-08-04
15:18:02
上传
评论
收藏 26KB RAR 举报
cxfu1990
- 粉丝: 3
- 资源: 30