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

📄 ds18b20.c

📁 AVR16单片机DS18B20程序
💻 C
字号:
/*******************************************
  文件:DS18B20.C
  环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
  硬件:ATMEGA16芯片
  日期:2006年12月10日 
  功能:驱动开发板上的温度传感器DS18B20(作者只做了正温度值的显示,负温度值的显示读者可自行编写)。
  备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#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(600);					//等待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倍
  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);
  }
 }
}

⌨️ 快捷键说明

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