#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();
}
} |