| 
 
| 149的DS18B20 #include <reg52.h>
 #include <msp430x14x.h>
 #include "DS18B20.h"
 extern void Delay(unsigned int dly);
 #define DQ_IN  (P1DIR&=~BIT6)
 #define DQ_OUT (P1DIR|= BIT6)
 #define DQ_val (P1IN & BIT6)
 #define DQ_1   (P1OUT|=BIT6)
 #define DQ_0   (P1OUT&=~BIT6)
 unsigned char tem[]={0,0},Neg_flag;  //数组存储读取的温度数据,负数标志
 /*******************************************************************************
 * Function Name  : void Delayus(unsigned int dly)
 * Description    : 延时 dly us
 * Input          : dly
 * Output         : None
 * Return         : None
 *******************************************************************************/
 void Delayus(unsigned int dly)
 {
 TACTL|= TASSEL_2+MC_1+TACLR;
 CCR0  = dly;
 while(!(TACTL&BIT0));         //等待时间到
 TACTL  = 0;                 //停止计数   ??????
 TACTL &= ~BIT0;                 //清中断标志
 }
 /*******************************************************************************
 * Function Name  : unsigned char Init_DS18B20(void)
 * Description    : IO 初始化
 * Input          : void
 * Output         : None
 * Return         : None
 *******************************************************************************/
 unsigned char Init_DS18B20(void)
 {
 unsigned char tp;
 DQ_OUT;
 DQ_0;                     //MCU 拉低最少480us 再释放等待DS拉高
 Delayus(600);             //480us~960us
 DQ_1;
 DQ_IN;                    //释放总线
 Delayus(55);              //等15~60us
 _NOP();
 if(DQ_val==BIT6) tp=1;    //初始失败
 else tp=0;                //初始成功
 return tp;
 }
 /*******************************************************************************
 * Function Name  : void Write_DS18B20(unsigned char data)
 * Description    : 向18B20写数据
 * Input          : void
 * Output         : None
 * Return         : None
 *******************************************************************************/
 void Write_DS18B20(unsigned char data)
 {
 unsigned char i;
 DQ_OUT;
 for(i=0;i<8;i++)
 {
 DQ_0;                   //下降沿
 Delayus(3);            //15~60us 等待18B20采样
 if(data&0x01)           //写从低到高位
 {
 DQ_1;
 }
 else
 {
 DQ_0;
 }
 Delayus(65);
 data>>=1;
 DQ_1;
 Delayus(2);
 }
 }
 /*******************************************************************************
 * Function Name  : unsigned char Read_DS18B20(void);
 * Description    : 读18B20数据
 * Input          : void
 * Output         : None
 * Return         : 18B20数据
 *******************************************************************************/
 unsigned char Read_DS18B20(void)
 {
 unsigned int i, rdata;
 for(i=0;i<8;i++)
 {
 rdata>>=1;
 DQ_0;
 Delayus(2);          //下降沿
 DQ_1;
 DQ_IN;               //释放总线
 Delayus(3);          //延时5 us
 if(DQ_val==BIT6)
 {
 rdata |= 0x80;     //读从高位开始
 }
 Delayus(45);
 DQ_OUT;
 DQ_1;
 Delayus(2);
 }
 return rdata;
 }
 /*******************************************************************************
 * Function Name  : unsigned char Convert_18B20(void);
 * Description    : 18B20转换
 * Input          : void
 * Output         : None
 * Return         : None
 *******************************************************************************/
 unsigned char *Convert_18B20(void)
 {
 unsigned char n;
 do
 n = Init_DS18B20();           //复位
 while(n);
 Write_DS18B20(0xCC);            //跳过 ROm指令
 Write_DS18B20(0x44);            //温度转换 RAM指令
 Delay(750);                   //等待750us温度转换完成
 do
 n = Init_DS18B20();           //复位
 while(n);
 Write_DS18B20(0xCC);            //跳过ROM
 Write_DS18B20(0xBE);;           //读存储器指令 读数据
 tem[0] = Read_DS18B20();        //
 tem[1] = Read_DS18B20();
 return tem;
 }
 /*******************************************************************************
 * Function Name  : unsigned char Compute_18B20(unsigned char data);
 * Description    : 计算18B20转换后的温度值
 * Input          : 16进制的温度值
 * Output         : None
 * Return         : 十进制的温度值
 *******************************************************************************/
 float Compute_18B20()
 {
 unsigned char temper=0;
 if(tem[0]&0xF0)
 {
 Neg_flag = 1;                       //负数标志
 temper = tem[1]+tem[0]*256;
 temper = (~temper) +1;               //取反加一
 }
 else
 {
 temper = tem[1]+tem[0]*256;
 }
 return temper;
 }
 | 
 |