TI中文支持网
TI专业的中文技术问题搜集分享网站

分享一个MSP430G2系列驱动DS18B20的例子

#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:

谢谢分享!

赞(0)
未经允许不得转载:TI中文支持网 » 分享一个MSP430G2系列驱动DS18B20的例子
分享到: 更多 (0)