#include <msp430g2553.h> #include "stdio.h" #define uint unsigned int #define uchar unsigned char #define DS18B20 BIT3 #define DS18B20_H P2OUT |= BIT3 #define DS18B20_L P2OUT &= ~BIT3 //以下是DS18B20所需的函数定义 void B20_init(void); uchar B20_readB(void); void B20_writeB(uchar wrd); uint Read_temp(void); void B20_display(void); void B20_init(void) { P2DIR |= DS18B20; //配置为输出 P2REN &= ~DS18B20; DS18B20_L; //拉低 //Delay_us(600); //等待600微秒 //__delay_cycles(4800); __delay_cycles(600); DS18B20_H; //释放总线 //Delay_us(60); //等待60微秒 __delay_cycles(60); //__delay_cycles(480); P2DIR &= ~DS18B20; //配置为输入 P2REN |=DS18B20; while((P2IN &(DS18B20))); //等待DS18B20拉低 while(!(P2IN &(DS18B20))); //等待DS18B20释放总线 } uchar B20_readB(void) { uchar i,retd=0; for(i=0;i<8;i++) //位计数值 { retd>>=1; //右移,准备接受新的数据位 P2DIR |=DS18B20; //配置为输出 P2REN &= ~DS18B20; DS18B20_L; //拉低,启动读数据位 DS18B20_H; //释放总线 //Delay_us(5); //等待5微秒 //__delay_cycles(40); __delay_cycles(5); P2DIR &=~DS18B20; //配置为输入,开始读取数据位 P2REN |=DS18B20; if(P2IN&DS18B20) //该位是否为高 { retd|=0x80; //是就将此位置高 } //Delay_us(50); //等待50微秒 //__delay_cycles(400); __delay_cycles(50); } return retd; //将读到的一个字节返回 } void B20_writeB(uchar wrd) { uchar i; for(i=0;i<8;i++) //位计数值 { P2DIR |=DS18B20; //配置为输出 P2REN &= ~DS18B20; DS18B20_L; //拉低,启动写数据位 // Delay_us(1); //等待1微秒 //__delay_cycles(8); __delay_cycles(1); if(wrd&0x01) //此位数据是否为高 { DS18B20_H; //是高则将单总线拉高 } else { DS18B20_L; //是低则将单总线拉低 } //Delay_us(50); //等待50微秒 //__delay_cycles(400); __delay_cycles(50); DS18B20_H; //释放总线 wrd>>=1; //右移,为写入新的数据位做准备 } // Delay_us(50); //等待50微秒 //__delay_cycles(400); __delay_cycles(50); } uint Read_temp(void) { uchar templ,temph; uint temp=0; B20_init(); //初始化,每次写命令都从初始化开始 B20_writeB(0xcc); //跳过ROM B20_writeB(0x44); //启动温度转换 B20_init(); //初始化,每次写命令都从初始化开始 B20_writeB(0xcc); //跳过ROM B20_writeB(0xbe); //读寄存器 templ=B20_readB(); //读温度低字节 temph=B20_readB(); //读温度高字节 temp=templ+temph*256; //将温度整理成16位变量 return temp; //返回16位变量 } void B20_display(void) { uint t; t=Read_temp(); //读取温度值 t=(unsigned int)(t*6.25); //显示的温度保留小数点后两位, //要想保留一位可以乘以0.625 printf("温度 : %.2f \n",t*1.0/100); } int putchar(int ch) { while(!(IFG2&UCA0TXIFG)); UCA0TXBUF=ch; return ch; } void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** P2DIR |= BIT3; printf("\n%s\n","========温度测量========="); B20_display(); while(1) { __delay_cycles(1000000); B20_display(); } }