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

📄 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>     		//包含一些常用的宏定义
#define LCD_EN_PORT    PORTA
#define LCD_RW_PORT    PORTA
#define LCD_RS_PORT    PORTA
#define LCD_DATA_PORT  PORTA
#define LCD_DATA_DDR   DDRA
#define LCD_DATA_PIN   PINA
#define LCD_EN         (1<<PA2)   //portc5         out
#define LCD_RW        (1<<PA1)    //portd3         out/in
#define LCD_RS         (1<<PA0)  //portc4         out
#define LCD_DATA        ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7))   //portd4/5/6/7   out
//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 display[4]={0,0,0,0};//数据缓冲区***跟随显示位数变化而变化
 //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++)      //刷新显示缓冲区
    {   
     display[i]=data%10|0x30;//16位数据转10进制数据
     data=data/10;  
   }     
   LCD_write_string1(8,1, display[3]);        //百位数显示               
   LCD_write_string1(9,1, display[2]);//十位数显示              
   LCD_write_string1(0x0A,1, display[1]);          //个位数显示             
   LCD_write_string1(0x0C,1, display[0]);      //小数位数显示    
     delay(300);       //延时450us
  
    
  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};//定义数据缓冲区
 DDRA|=LCD_DATA|LCD_RW;
 DDRA|=LCD_RS|LCD_EN;  
    LCD_init();  
LCD_write_char(0x01,0);              //初始化LCD 
   LCD_write_string(0,0,"   DS18B20 OK   ");
   LCD_write_string(0,1,"  TEMP:    .  C ");
 while(1)
 {
  reset();			//复位								  
  write(0xcc);		    	//发送不提供ROM编码命令									  
  write(0x44);  	    	//发送开始转换命令
 		 	//循环显示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;
 led(t);			//计算实际温度值 t为温度数据*/
 } 
}

⌨️ 快捷键说明

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