#include <msp430g2553.h> #include "stdio.h" #define uint unsigned int #define uchar unsigned char #define DS18B20BIT3 #define DS18B20_HP2OUT |= BIT3 #define DS18B20_LP2OUT &= ~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.625printf("温度 : %.2f \n",t*1.0/100); }int putchar(int ch) {while(!(IFG2&UCA0TXIFG));UCA0TXBUF=ch;return ch; }void main(void){WDTCTL = WDTPW + WDTHOLD;// Stop WDTP1SEL = BIT1 + BIT2 ;// P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2 ;// P1.1 = RXD, P1.2=TXDUCA0CTL1 |= UCSSEL_2;// SMCLKUCA0BR0 = 104;// 1MHz 9600UCA0BR1 = 0;// 1MHz 9600UCA0MCTL = UCBRS0;// Modulation UCBRSx = 1UCA0CTL1 &= ~UCSWRST;// **Initialize USCI state machine**P2DIR |= BIT3;printf("\n%s\n","========温度测量=========");B20_display();while(1){__delay_cycles(1000000);B20_display();}}
gaoyang9992006:
分享自https://www.cnblogs.com/sky1991/archive/2012/08/25/2657036.html
Susan Yang:
谢谢分享!