[LaunchPad] DS18B20温度测量,串口显示

  1 #include <msp430g2553.h>

  2 #include  "stdio.h"

  3  

  4 #define uint unsigned int 

  5 #define uchar unsigned char

  6 

  7 #define DS18B20       BIT3

  8 #define DS18B20_H     P2OUT |= BIT3

  9 #define DS18B20_L     P2OUT &= ~BIT3

 10 

 11 //以下是DS18B20所需的函数定义

 12 

 13 void B20_init(void);

 14 uchar B20_readB(void);

 15 void B20_writeB(uchar wrd);

 16 uint Read_temp(void);

 17 void B20_display(void);

 18 

 19 

 20 void B20_init(void)

 21 {

 22  P2DIR |= DS18B20;                     //配置为输出

 23  P2REN &= ~DS18B20;

 24  DS18B20_L;                         //拉低

 25  //Delay_us(600);                 //等待600微秒

 26  //__delay_cycles(4800); 

 27  __delay_cycles(600);

 28  DS18B20_H;                         //释放总线

 29  //Delay_us(60);                 //等待60微秒

 30  __delay_cycles(60);

 31  //__delay_cycles(480); 

 32  P2DIR &= ~DS18B20;                     //配置为输入

 33  P2REN |=DS18B20;

 34  while((P2IN &(DS18B20)));                 //等待DS18B20拉低

 35  while(!(P2IN &(DS18B20)));                  //等待DS18B20释放总线

 36 }

 37 

 38 uchar B20_readB(void)

 39 {

 40  uchar i,retd=0;

 41  for(i=0;i<8;i++)         //位计数值

 42  {

 43   retd>>=1;            //右移,准备接受新的数据位

 44   P2DIR |=DS18B20;        //配置为输出

 45   P2REN &= ~DS18B20;

 46   DS18B20_L;                //拉低,启动读数据位

 47   DS18B20_H;            //释放总线

 48   //Delay_us(5);        //等待5微秒

 49   //__delay_cycles(40); 

 50   __delay_cycles(5);

 51   P2DIR &=~DS18B20;        //配置为输入,开始读取数据位

 52   P2REN |=DS18B20;

 53    

 54   if(P2IN&DS18B20)        //该位是否为高

 55   {

 56    retd|=0x80;            //是就将此位置高

 57   }

 58   //Delay_us(50);        //等待50微秒

 59   //__delay_cycles(400); 

 60   __delay_cycles(50);

 61  }

 62  return retd;            //将读到的一个字节返回

 63 }

 64 

 65 void B20_writeB(uchar wrd)

 66 {

 67  uchar i;

 68  for(i=0;i<8;i++)          //位计数值

 69  {

 70   P2DIR |=DS18B20;        //配置为输出

 71   P2REN &= ~DS18B20;

 72   DS18B20_L;                //拉低,启动写数据位

 73  // Delay_us(1);        //等待1微秒

 74   //__delay_cycles(8); 

 75   __delay_cycles(1);

 76   if(wrd&0x01)            //此位数据是否为高

 77   {

 78    DS18B20_H;                //是高则将单总线拉高

 79   }

 80   else

 81   {

 82    DS18B20_L;                //是低则将单总线拉低

 83   }

 84   //Delay_us(50);            //等待50微秒

 85   //__delay_cycles(400); 

 86  __delay_cycles(50); 

 87   DS18B20_H;                //释放总线

 88   wrd>>=1;            //右移,为写入新的数据位做准备

 89  }

 90  // Delay_us(50);        //等待50微秒

 91  //__delay_cycles(400); 

 92  __delay_cycles(50);

 93 }

 94 

 95 uint Read_temp(void)

 96 {

 97  uchar templ,temph;

 98  uint temp=0;

 99  B20_init();            //初始化,每次写命令都从初始化开始

100 

101  B20_writeB(0xcc);      //跳过ROM

102  B20_writeB(0x44);      //启动温度转换

103  B20_init();            //初始化,每次写命令都从初始化开始

104  B20_writeB(0xcc);      //跳过ROM

105  B20_writeB(0xbe);      //读寄存器

106  templ=B20_readB();     //读温度低字节

107  temph=B20_readB();     //读温度高字节

108  temp=templ+temph*256;  //将温度整理成16位变量

109   return temp;            //返回16位变量

110 }

111 

112 

113 

114 void B20_display(void)

115 {

116    uint t;

117    t=Read_temp();          //读取温度值

118    t=(unsigned int)(t*6.25);              //显示的温度保留小数点后两位,

119                            //要想保留一位可以乘以0.625

120     printf("温度  : %.2f  \n",t*1.0/100);

121 }

122 

123  int putchar(int ch)

124  {

125    while(!(IFG2&UCA0TXIFG));

126     UCA0TXBUF=ch;

127     return ch;

128  }

129  

130   

131   void main(void)

132   

133   {

134   

135   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

136   

137    P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

138    P1SEL2 = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

139   

140    UCA0CTL1 |= UCSSEL_2;                     // SMCLK

141    UCA0BR0 = 104;                            // 1MHz 9600

142    UCA0BR1 = 0;                              // 1MHz 9600

143    UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1

144    UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

145    P2DIR |= BIT3;

146   

147   printf("\n%s\n","========温度测量=========");

148  

149   B20_display();

150   

151    while(1)

152    {

153    __delay_cycles(1000000);

154    B20_display();

155    

156    }

157  

158   }

 

你可能感兴趣的:(HP)