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 }