原创 单片温度采集DS18B20

2007-1-13 20:37 2335 5 7 分类: MCU/ 嵌入式

项           目:        DS18B20_TEST
编   译      器:        AVR Studio_4.12sp4+winAVR412
目  标   芯  片:        ATmega16
时           钟:        外部 8000000hz


#define DS18b20_PORT PORTB
#define DS18b20_DDR  DDRB
#define DS18b20_PIN  PINB


#define DS18b20      PB4 


#define SETBIT(x,y) (x|=(1<<y))     
#define CLRBIT(x,y) (x&=(~(1<<y)))  
#define CHKBIT(x,y) (x&(1<<y))    


#define  BIT_INV(x,y)    x^=(1<<y)
/********************************************************************************
                             DS18B20操作定义
********************************************************************************/
#define  CLR_DS18B20  CLRBIT(DS18b20_PORT,DS18b20)  //数据线强制拉低
#define  SET_DS18B20  SETBIT(DS18b20_PORT,DS18b20)  //数据线强制拉高,上拉
#define  HLD_DS18B20  SETBIT(DS18b20_DDR,DS18b20)  //Mega16控制总线
#define  RLS_DS18B20  CLRBIT(DS18b20_DDR,DS18b20)      //释放总线
#define  STU_DS18B20  CHKBIT(DS18b20_PIN,DS18b20)  //数据线的状态
 


/*********************************************************************************************
延时函数
**********************************************************************************************/


void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }


void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
  }
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<400;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }


void init_1820(void) 

    HLD_DS18B20;      //设置PC2 为输出
    SET_DS18B20;  
    CLR_DS18B20; 
    delay_nus(180);    //480us以上 
    SET_DS18B20; 
    RLS_DS18B20; 
    delay_nus(10);     //15~60us 
    while(STU_DS18B20); 
    HLD_DS18B20; 
    SET_DS18B20; 
    delay_nus(40);   //60~240us 

void write_1820(unsigned char x) 
{    
     unsigned char m; 
    for(m=0;m<8;m++) 
    { 
       CLR_DS18B20; 
       if(x&(1<<m))    //写数据了,先写低位的!
       SET_DS18B20; 
       else 
       {CLR_DS18B20;} 
       delay_nus(10);   //15~60us 
       SET_DS18B20; 
    } 
     SET_DS18B20; 

unsigned char read_1820(void) 
{     
    unsigned char temp,k,n; 
    temp=0; 
    for(n=0;n<8;n++) 
       { 
      CLR_DS18B20; 
      SET_DS18B20; 
      RLS_DS18B20; 
      k=(STU_DS18B20);    //读数据,从低位开始 
      if(k) 
      temp|=(1<<n); 
      else 
      temp&=~(1<<n); 
      delay_nus(30); //60~120us     
      HLD_DS18B20; 
   } 
   return (temp); 
}  


void gettemp(unsigned char k[])         //读取温度值

     unsigned char temh,teml,wm0,wm2; 
     init_1820();        //复位18b20 
     write_1820(0xcc);   // 发出转换命令 
     write_1820(0x44);
     delay_nms(20);  
     init_1820(); 
     write_1820(0xcc);  //发出读命令 
     write_1820(0xbe); 
     teml=read_1820();  //读数据 
     temh=read_1820();
  wm0=teml;
     wm0&=0x0F;
     teml=teml>>4;       
     temh=temh<<4;
     wm2=teml|temh;      
     k[0]=(wm2/10)+48;   
     k[1]=(wm2%10)+48;
  k[3]=(wm0*6)/10+48;
}
int main()
{  
    unsigned char p[]={"  . 'C"}; 
 while(1)
 {        
    gettemp(p);
 //处理


 delay_nms(10);
                                                           
    }                                                   
 }

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户165980 2008-12-6 17:32

蛮有意味的!

用户58782 2008-11-23 23:33

偶得之,甚好!

用户93270 2007-8-29 23:03

非常感谢

用户1171155 2007-3-22 11:24

content
相关推荐阅读
用户57654 2007-07-21 08:57
即将实际应用
经过半年多的时间我的第一个控制器,基本成型了,这其中涉及了PCB,从未知,到实际应用发了不少时间。近期将上传一些图片供大家看看。...
用户57654 2007-01-02 23:40
实时时钟DS1302应用
#define DS1302_PORT PORTC#define DS1302_DDR  DDRC#define DS1302_PIN  PINC#define SETBIT(x,y) (x|=(1&...
用户57654 2006-12-27 16:55
h1602c液晶显示函数
/*************************************************************************************项           目:...
用户57654 2006-11-09 12:48
初学单片机
从现在开始...... ...
我要评论
2
5
关闭 站长推荐上一条 /3 下一条