原创 单片温度采集DS18B20

2007-3-12 16:57 2844 7 9 分类: 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);
                                                           
    }                                                   
 }

文章评论2条评论)

登录后参与讨论

用户1276322 2007-3-14 13:34

谢谢你的建议,你的网站我也经常去看的,很不错的,不过我在上面发的资料是少了点。平时喜欢把自己的东西拿出来放在自己的小窝里,闲来无事自己看看,同时也和广大的爱好者共享。

用户80446 2007-3-13 15:19

资料还蛮多的,希望能发一些到我的网站上,www.iccavr.com AVR开发网,谢谢。

相关推荐阅读
用户1276322 2007-03-26 16:47
AVR读写外部RAM时出现的问题
AVR读写外部RAM时出现的问题问:1,对AT90S8515来说,外部RAM的地址肯定是从0x0260开始的?2,我用ICE200仿真8515读写外部RAM,RAM大小为32K Bytes,地址映射到...
用户1276322 2007-03-26 15:45
理解#defineSREG(*(volatileunsignedchar*)0x5F
以前看到#define SREG    (*(volatile unsigned char *)0x5F)这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~~~   ...
用户1276322 2007-03-26 12:56
AVR复位和中断处理
AVR提供了几种不同的中断源。这些中断和复位向量在程序存储器空间内都有自己单独的程序向量。所有中断都被分配一个私有的使能位,要想使能某一中断,就要向其使能位写入逻辑1,而且要把状态寄存器中的全局中断使...
用户1276322 2007-03-26 00:28
红外线遥控原理
作者:微电  出处:微电通讯  更新时间: 2006年07月14日            红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因...
用户1276322 2007-03-26 00:22
AVR中断应用设计要点
AVR的中断源比较多,尤其是ATmega128,一共有35个外部以及内部中断源。通常情况下,Flash程序存储器空间的最低位置(0x0000-0x0045)定义为复位和中断向量空间。完整的中断向量见第...
用户1276322 2007-03-25 23:59
avr单片机中断使用心得
中断响应后由硬件自动清零全局中断,任何中断都无法响应,在执行完中断程序后,全局中断打开.如果需要中断嵌套,则在中断程序里软件添加打开全局中断.就可以响应任何中断(包括比本中断优先级低的中断).以至可以...
我要评论
2
7
关闭 站长推荐上一条 /2 下一条