[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   }

 

posted @ 2012-08-25 23:25  sky1991  阅读(1635)  评论(0编辑  收藏  举报