您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机AVR 18B20程序 正文
AVR 18B20程序

AVR 18B20程序

点击数:7274 次   录入时间:03-04 12:00:35   整理:http://www.55dianzi.com   AVR单片机
#include <iom16v.h>   //包含型号头文件
#include <macros.h>   //包含"位"操作头文件
#include <stdio.h>   //标准输入输出头文件
#include <AVR_PQ1A.h>  //包含自定义常量头文件
#include "SMG.C"   //包含数码管显示函数

/*******************************************
函数名称: B20_init
功    能: 复位DS18B20
参    数: 无
返回值  : 无
/********************************************/
void B20_init(void)
{
 DDRA|=BIT(DS18B20);   //配置为输出 
  PORTA|=BIT(DS18B20);
  Delayus(10);    
 PORTA&=~BIT(DS18B20);   //拉低
 Delayus(750);     //等待600微秒
 PORTA|=BIT(DS18B20);   //释放总线
 Delayus(60);     //等待60微秒
 DDRA&=~BIT(DS18B20);   //配置为输入 
 while((PINA&(BIT(DS18B20)))); //等待DS18B20拉低
 while(!(PINA&(BIT(DS18B20)))); //等待DS18B20释放总线
}
/*******************************************
函数名称: B20_readB
功    能: 读取一个字节的数据
参    数: 无
返回值  : retd--返回的一个字节数据
/********************************************/
uchar B20_readB(void)
{
 uchar i,retd=0;
 
 for(i=0;i<8;i++)     //位计数值
 {
  retd>>=1;      //右移,准备接受新的数据位
  DDRA|=BIT(DS18B20);   //配置为输出
  PORTA&=~BIT(DS18B20);   //拉低,启动读数据位
  PORTA|=BIT(DS18B20);   //释放总线
  Delayus(5);     //等待5微秒
  DDRA&=~BIT(DS18B20);   //配置为输入,开始读取数据位
  if(PINA&BIT(DS18B20))   //该位是否为高
  {
   retd|=0x80;     //是就将此位置高
  }
  Delayus(50);     //等待50微秒
 }
 return retd;     //将读到的一个字节返回
}
/*******************************************
函数名称: B20_writeB
功    能: 写入一个字节的数据
参    数: wrd--要写入的数据
返回值  : 无
/********************************************/
void B20_writeB(uchar wrd)
{
 uchar i;
 for(i=0;i<8;i++)            //位计数值
 {
  DDRA|=BIT(DS18B20);   //配置为输出
  PORTA&=~BIT(DS18B20);   //拉低,启动写数据位
  Delayus(1);     //等待1微秒
  if(wrd&0x01)     //此位数据是否为高
  {
   PORTA|=BIT(DS18B20);   //是高则将单总线拉高
  }
  else
  {
   PORTA&=~BIT(DS18B20);  //是低则将单总线拉低
  }
  Delayus(50);     //等待50微秒
  PORTA|=BIT(DS18B20);   //释放总线
  wrd>>=1;      //右移,为写入新的数据位做准备
 }
 Delayus(50);     //等待50微秒
}
/*******************************************
函数名称: Read_temp
功    能: 读取温度值
参    数: 无
返回值  : rettemp--返回的温度值
/********************************************/
uint Read_temp(void)
{
 uchar templ,temph;
 uint temp;
 B20_init();       //初始化,每次写命令都从初始化开始
 B20_writeB(0xCC);    //跳过ROM
 B20_writeB(0x44);    //启动温度转换
 B20_init();       //初始化,每次写命令都从初始化开始
 B20_writeB(0xcc);    //跳过ROM
 B20_writeB(0xbe);    //读寄存器
 templ=B20_readB();   //读温度低字节
 temph=B20_readB();   //读温度高字节
 temp=templ+temph*256;//将温度整理成16位变量
 return temp;       //返回16位变量
}
/*******************************************
函数名称: Num_BCD
功    能: 将一个字节的整数转换成三位BCD码
参    数: num--需要转换的整数
返回值  : chr--三位BCD码数组指针
/********************************************/
uchar* Num_BCD(uint num)
{
 uchar i,chr[3];   
 uchar *rept;
 rept=&(chr[0]);   //返回指针指向BCD码数组
 for(i=0;i<3;i++)
 {
  chr[2-i]=num%10;   //对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
  num/=10;     //除以10,为取出下一位做准备
 }
 return rept;    //返回指针
}
/*******************************************
函数名称: main
功    能: 完成温度的读取与显示
参    数: 无
返回值  : 无
/********************************************/
void main(void)
{
 uint t;
 uchar *temppt;
 uchar i,temp[3];
 Board_init( );    //初始化开发板
 while(1)
 {
  t=Read_temp();   //读取温度值
  t*=0.625;     //转换成实际温度的10倍
    while(t==850)
  {
        t=Read_temp();   //读取温度值
        t*=0.625; 
  }
  
  temppt=Num_BCD(t);//将实际温度的10倍转换成BCD码

  for(i=0;i<3;i++) //将转换后的BCD码存入显示数组
  {
   temp[i]=*(temppt+i);
  }
  for(i=0;i<3;i++)     //显示温度
  {
   if(i==1)
   {
    temp[1]+=16;    //如果是各位,则加上小数点(数码管的译码数组有所改变,读者可以看10_DS18B20文件夹下的SMG.C文件)
   }
   One_smg_display(temp[i],i+1);    
   Delayms(5);
  }
 }
}




本文关键字:程序  AVR单片机单片机-工控设备 - AVR单片机