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 }