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

📄 ningkun-18b20.txt

📁 AVR基础试验程序
💻 TXT
字号:
//**************************************************//

//函 数 功 能: 18B20温度读取 
//函数输入参数: PB0 数据输入连接18B20   t温度数据输出

//CPU芯片类型: ATMEGA16   时钟:8M
//编译器版本:  ICCAVR  6.31

//创建人:      宁坤
//创建日期:    2006-8-5


//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH//
      
#include<iom16v.h>      		//包含定义ATmega16寄存器的头文件
#include<macros.h>     		//包含一些常用的宏定义
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx			
void delay(int i)		//定时程序  	1.5us左右
{
 while(i>=0)
  {i--;}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//复位程序
int reset()
{
 int test=0;					//定义返回值 0成功 1失败
 DDRB=0XFF;					//设置数据线口为输出状态
 PORTB=0xfe;					//拉低总线 准备复位
 delay(450);					//延时600us
 PORTB=0xff;					//释放总线
 delay(40);					//等待60us 准备接受器件存在信号
 DDRB=0x00;					//数据口设置为输入
 test=PINB;					//接收器件返回的复位信号
 delay(400);					//等待480us完成复位
 test&=0x01;					//处理返回信号成一位数据
 DDRB=0XFF;					//数据口设置为输出
 PORTB=0XFF;					//输出高电平 释放总线
 return test;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//写一比特
void write(int bit)
{int i=8;                       		//循环8次写一字节
 for(i=8;i>0;i--)
  {DDRB=0XFF;	   			    	//设置为输出
   PORTB=0X00;					//拉低总线 开始准备写数据
   delay(3);					//等待4us
   PORTB=0XFF;					//释放总线
   delay(10);					//延时15us
   PORTB=bit&0x01; 				//写数据
   delay(40);					//等待60us 18B20采集数据
   DDRB=0XFF;					//释放总线
   PORTB=0XFF;
   bit=bit>>1;					//数据**右移位** 先发低位
  }  
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//读一字节
int read(void)
{int i,temp=0,bit=0;
 for(i=0;i<8;i++)				//循环8次读一字节
  {
   DDRB=0Xff;	 				//设置输出准备读数据									   
   PORTB=0x00;					//拉低总线 开始读时间隙
   delay(2);					//等待3us
   PORTB=0XFF;					//释放总线
   delay(2);					//等待3us
   DDRB=0x00;					//数据口设置为输入
   delay(1);					
   temp=PINB;					//接收数据
   delay(40);					//等待60us完成读周期
   temp<<=7;
   temp&=0x80;   				//接收数据转化为位数据
   DDRB=0XFF;					//释放总线
   PORTB=0XFF;
   bit=bit>>1;					//数据**右移位,先接受高位
   bit=bit|temp;				//转化为并行数据
  }  
  return bit;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//显示程序
void led(unsigned long int BCDdata)
{
 char led[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选缓冲区
 int leddata[8];//数据缓冲区***跟随显示位数变化而变化
 int ledtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码列表
 unsigned long int data;//临时数据
 int y=100,i;//循环变量  ****Y满足18B20转换所需要的500ms**
 DDRC=0Xff;  //PD口设置为段码输出
 DDRA=0Xff;  //PB口设置为数据输出
 PORTC=0xff; //显示消隐
 PORTA=0xff; //显示消隐
 
//数据转换成十进制显示值 
 while(y>=0)
 {
  data=BCDdata;
  for(i=0;i<4;i++)      //刷新显示缓冲区
    {   
     leddata[i]=ledtable[data%10];//16位数据转10进制数据
     data=data/10;
     leddata[1]&=0x7f;  //设置小数点  
	 
     PORTC=led[i];      //0X7F;//显示第i位
     PORTA=leddata[i];	//发送要显示的数据
     delay(300);       //延时450us
     PORTA=0XFF;
    }	
  y--;			 
 }  
}  
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

void main()
{int test=0,k=0;        	//复位返回 和9直接读取循环变量
 int m,n,t=0;             	//临时数据
 int da[9]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//定义数据缓冲区
 while(1)
 {
  reset();			//复位								  
  write(0xcc);		    	//发送不提供ROM编码命令									  
  write(0x44);  	    	//发送开始转换命令
  led(t);		 	//循环显示500ms以完成温度转换 
  reset();              	//复位 准备读数据
  write(0xcc);			//发送不提供ROM编码命令
  write(0xbe);		 	//发送读数据命令
  for(k=0;k<=8;k++)		//循环读9个字节的数据 并存储进数据缓冲区
  {
   test=read();
   da[k]=test; 			//9字节数据依次读入数据缓冲区
  }
  reset(); 	  	 	//复位 下面开始数据转换成温度值
  m=da[0];			//度读温度低位数据
  n=da[1]; 			//读温度高位数据 
  n=n<<8;			//数据整合为16位数据
  m=(m|n)*10; 		//数据扩大10倍,显示取一位小数点
  t=m>>4;			//计算实际温度值 t为温度数据*/
 } 
}

⌨️ 快捷键说明

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