⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 MSP430F2274控制DS18B20
💻 C
字号:
#include "msp430x22x4.h"
//---------------------------------------------------------
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//---------------------------------------------------------
unsigned char  Dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
void delay(unsigned int i);    //delay 
int Init_DS18B20();           // 初始化DS18B20子函数
unsigned char ReadOneChar();  //  读字节子函数   
void WriteOneChar(unsigned char dat); //写字节子函数   
void tmpchange(void);        // DS18B20 开始 
void tem_deal(unsigned int tem) ;   //温度显示处理函数
unsigned int tmp();             //读取温度

 unsigned int   qqq;
unsigned int temp=0;       //   定义一个变量,存储温度值
unsigned char  temp_data[2]={0x00,0x00};//读出温度暂放

int main( void )
{
  WDTCTL = WDTPW + WDTHOLD;
  P3DIR|=BIT0;    //设P3.0为DS18B20数据脚
  P3OUT|=BIT0;
   do
   {
     tmpchange();      //温度转换
     delay_ms(1000);   //延时1秒让它转换
     tem_deal(tmp());   
      delay_ms(10); //延时
   }
     while(1);
}
//-------------------------------------------------------------
void delay(unsigned int i)      //延迟函数  
{
    while(i--) {};
}
int Init_DS18B20()
{
     unsigned char x=0;
     x=0;
     P3DIR|=BIT0;          //P3.0 output 
     P3OUT&=~BIT0;          //单片机将数据脚P3.0拉低
     delay_us(500);            //精确延时 大于 480us
     P3OUT|=BIT0;         //拉高总线  
     delay_us(30);               //15 us ~~60 us
     P3DIR&=0xfe;         //设数据脚P3.0为输入
     x=P3IN&BIT0;        //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
     
     P3DIR|=BIT0;          //保证P3.0 output 
     P3OUT|=BIT0;  
      delay_ms(10);         //这里必须延迟一段时间
     return  x;
}
unsigned char ReadOneChar()
{
   unsigned char i = 0,j;
   unsigned char dat = 0;
   for (i=8;i>0;i--)
    { 
        dat>>=1;             //数据右移一位
        P3DIR|=BIT0;
        P3OUT&=~BIT0;         //给脉冲信号 0           
        P3OUT|=BIT0;  //OUTPUT 1
        delay_us(1);
        P3DIR&=~BIT0;         //设数据脚P3.0为输入
        j=P3IN&BIT0;
        if(j==0)           //DQ为1
             dat&=0x7f;   //读出数据
        else 
             dat|=0x80;
        delay_us(40);               //延时40 us
     }
   
   P3DIR|=BIT0;          //保证P3.0 output 
   P3OUT|=BIT0;  
   return(dat);
}
void WriteOneChar(unsigned char dat)
{
    unsigned char i = 0;
    P3DIR|=BIT0;       
    for (i=8; i>0; i--)
     {
       P3OUT&=~BIT0;     //给脉冲信号 0
       delay_us(3);   delay_us(3);  delay_us(3);  delay_us(3);  delay_us(1);        //延时13 us
       P3OUT= dat&0x01;  //写入一位数据
       delay_us(50);           //延时 50us
       P3OUT|=BIT0;     //给脉冲信号 1
       dat>>=1;         //右移一位数据
     }
    
     P3DIR|=BIT0;          //保证P3.0 output  1
    P3OUT|=BIT0;     
}
void tmpchange(void)          // DS18B20 开始 
{
  Init_DS18B20();             // 初始化DS18B20
  WriteOneChar(0xcc);         // 跳过序列号命令
  WriteOneChar(0x44);         // 发送温度转换命令
}
unsigned int tmp()                    //读取温度
{
 // float tt=0;
  Init_DS18B20();             // 初始化ds18b2子函数 
  WriteOneChar(0xcc);         // 跳过ROM命令
  WriteOneChar(0xbe);         // 发送读取数据命令
  temp_data[0]=ReadOneChar(); // 连续读两个字节数据
  temp_data[1]=ReadOneChar();
  temp=temp_data[1];
  temp<<=8;                                               
  temp=temp|temp_data[0];     // 两字节合成一个整型变量。
 // tt=temp*0.0625;          // 得到真实十进制温度值,因为DS18B20
                              // 可以精确到0.0625度,所以读回数据的最低位代表的是
                              // 0.0625度。
  
  return temp;                // 返回温度值
}
void tem_deal(unsigned int tem)
{
/*************温度数据处理*****************/
 if(tem>6348)                       // 温度值正负判断
      {
	  tem=65536-tem;
          tem = tem*6.25;  
	   Dis_play[0]=tem/10000;   		             //百位
	   Dis_play[1]=tem%10000/1000;                              //十位
	   Dis_play[2]=tem%1000/100; 	                               //个位
           Dis_play[3]=tem%100/10;
           Dis_play[4]=tem%10;
           Dis_play[0]+=0x30;   		             //百位
	   Dis_play[1]+=0x30;                       //十位
	   Dis_play[2]+=0x30; 	                     //个位
           Dis_play[3]+=0x30;
           Dis_play[4]+=0x30;	
	} 
else  
	 {    

           tem = tem*6.25;  
           Dis_play[0]=tem/10000;   		             //百位
	   Dis_play[1]=tem%10000/1000;                       //十位
	   Dis_play[2]=tem%1000/100; 	                     //个位
           Dis_play[3]=tem%100/10;
           Dis_play[4]=tem%10;
           Dis_play[0]+=0x30;   		             //百位
	   Dis_play[1]+=0x30;                       //十位
	   Dis_play[2]+=0x30; 	                     //个位
           Dis_play[3]+=0x30;
           Dis_play[4]+=0x30;
	 }	  
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -