#define uchar unsigned char #define uint unsigned int #define ulong unsigned long //DS18B20控制脚,单脚控制
#define DQ_IN P1DIR &= ~BIT6 // DS18B20接单片机P17口 #define DQ_OUT P1DIR |= BIT6 //设置输出
#define DQ_CLR P1OUT &= ~BIT6 //置低电平 #define DQ_SET P1OUT |= BIT6 //置高电平 #define DQ_R P1IN & BIT6 //读电平
#define wei_h P5OUT |=BIT5 //置高电平 #define wei_l P5OUT &=~BIT5 //置低电平 #define duan_h P6OUT |=BIT6 //置高电平 #define duan_l P6OUT &=~BIT6 //置低电平 int temp_value;
int temp; //定义的变量,显示数据处理 int A1,A2,A3;
//***********************************************************************
// 系统时钟初始化,外部8M晶振
//***********************************************************************
void Clock_Init() {
uchar i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{
IFG1&=~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); }
while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1&=~OFIFG; }
//***********************************************************************
// MSP430内部看门狗初始化
//***********************************************************************
void WDT_Init()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 }
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_Init() {
P5DIR = 0xFF; //设置IO口方向为输出 P4DIR = 0xFF; //P4口初始设置为FF P6DIR = 0xFF; }
//*************************************************************************
// DS18B20初始化
//*************************************************************************
unsigned char DS18B20_Reset(void) //初始化和复位 {
unsigned char i; DQ_OUT; DQ_CLR;
delay_us(500); //延时500uS(480-960) DQ_SET; DQ_IN;
delay_us(80); //延时80uS i = DQ_R;
delay_us(500); //延时500uS(保持>480uS)
if (i) {
return 0x00; }
else {
return 0x01; } }
//*******************************************************************
******
// DS18B20读一个字节函数
//*************************************************************************
unsigned char ds1820_read_byte(void) {
unsigned char i;
unsigned char value = 0; for (i = 8; i != 0; i--) {
value >>= 1; DQ_OUT; DQ_CLR;
delay_us(4); //*延时4uS DQ_SET; DQ_IN;
delay_us(10); //*延时10uS if (DQ_R) {
value|=0x80; }
delay_us(60); //*延时60uS }
return(value); }
//*************************************************************************
// 向18B20写一个字节函数
//*************************************************************************
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) {
unsigned char i;
for (i = 8; i != 0; i--) {
DQ_OUT; DQ_CLR;
delay_us(4); //延时4uS if (value & 0x01) {
DQ_SET; }
delay_us(80); //延时80uS DQ_SET; //位结束 value >>= 1; } }
//*************************************************************************
// 发送温度转换命令
//*************************************************************************
/*启动ds1820转换*/
void ds1820_start(void) {
DS18B20_Reset();
ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0x44); //启动转换 }
//*************************************************************************
// DS8B20读取温度信息
//*************************************************************************
unsigned int ds1820_read_temp(void) {
unsigned int i;
unsigned char buf[9];
DS18B20_Reset();
ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0xBE); //读取温度 for (i = 0; i < 9; i++) {
buf[i] = ds1820_read_byte(); }
i = buf[1]; i <<= 8; i |= buf[0]; temp_value=i;
temp_value=(uint)(temp_value*0.625);