header
×
单片机 > 单片机程序设计 > 详情

AVR 18B20程序

发布时间:2020-06-19 发布时间:
|

#include    //包含型号头文件 
#include    //包含"位"操作头文件 
#include    //标准输入输出头文件 
#include   //包含自定义常量头文件 

#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  18B20程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
KEIL for ARM 自带的例子程序虚拟串口调试
footer