//希望对您有帮助,您的支持,是我的动力~
#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();
}
文章评论(0条评论)
登录后参与讨论