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

📄 ds18b20_drive._h

📁 数显温度万年历
💻 _H
字号:
/*****************************************
返回三个值dis_buf_18b20[0]小数dis_buf_18b20[1]个位dis_buf_18b20[2]十位
调用Read_1820_temperature();
****************************************/
#include <iom8v.h>
#include <macros.h>
#define ddrt DDRD
#define port PORTD
#define uchar unsigned char
#define uint unsigned int
#define D0   0x01  //18b20端口,PD.0
#define pin  PIND
#define CL_DQ   PORTD&=~(1<<PD0)
#define SET_DQ  PORTD|=(1<<PD0)
#define SET_OUT DDRD|=(1<<PD0)
#define SET_IN  DDRD&=~(1<<PD0)
#define IN_DQ   PIND&(1<<PD0)
unsigned int temp=0;
unsigned char temp_data[2]={0}; 
unsigned char dis_buf_18b20[3]={0};
uchar temp_comp;
void write_1820(unsigned char x) 	;
/*-----------------------------------------------------------------
函数名称:void init_1820() 
函数功能: 18b20的复位
参    数: 
返 回 值: 
-----------------------------------------------------------------*/
void init_1820(void) 
{
	SET_OUT;		 					                               //设置端口输出
	SET_DQ;							                                   //输出一个脉冲
	CL_DQ;                                                             //低电平保持480us以上
	delay_us(500);      	  			                               //延时480us以上
	SET_DQ;							                                   //没有输出一个脉冲
	SET_IN;                                                            //设置端口输入,即释放总线,外接上拉电阻,端口被拉高
	delay_us(60);     		  			                               //延时15~60us
	while(IN_DQ); 						                               //等待应答,即等待低电平信号
	delay_us(80);
    SET_OUT; 							                               //设置输出
    SET_DQ; 							                               //输出高电平
    delay_us(80);    		  			                               //60~240us 
}
/*-----------------------------------------------------------------
函数名称:void write_1820(unsigned char x) 
函数功能: 写18B20温度
参    数: x
返 回 值: 
-----------------------------------------------------------------*/
void write_1820(unsigned char x) 								       //下降沿写数据
{
 	unsigned char m;
	//SET_DQ;
	for(m=0;m<8;m++) 
    {
	 	CL_DQ;	 	 	  	 		                                   //写数据,从低位开始
		if(x&(1<<m))					                               //判断数据极性
		SET_DQ;
		else
		CL_DQ;
		delay_us(40);     				                               //延时15~60us
		SET_DQ;		
		delay_us(1);                                                   //连续写两位数据的间隔要大于1us				 
    } 
    SET_DQ; 							                               //结束写数据,置高总线
} 
/*-----------------------------------------------------------------
函数名称:unsigned char read_1820(void)
函数功能: 读取18B20温度
参    数: 
返 回 值: count
-----------------------------------------------------------------*/
unsigned char read_1820(void)                                          //上升沿读数据
{     
    unsigned char temp=0,k,n; 
    for(n=0;n<8;n++) 
    { 
		CL_DQ;	 		  			                                   //输出一个起始脉冲
		delay_us(1);                                                   //保持1us
    	SET_DQ;
		SET_IN;						                                   //设端口为输入
		k=IN_DQ;      		 		                                   //读数据,从低位开始 
		delay_us(1);
		if(k)							                               //判断数据极性
		temp|=(1<<n);
		else
		temp&=~(1<<n);
		delay_us(60); 	  				                               //延时60~120us
		SET_OUT;						                               //设端口为输出
	}
	return (temp);						                               //返回读出的数据
}
/*-----------------------------------------------------------------
函数名称:unsigned int Read_1820_temperature(void)
函数功能: 读取18B20温度,计算
参    数: 
返 回 值: count
-----------------------------------------------------------------*/
void Read_1820_temperature(void)
{
 	unsigned int count;
	unsigned char temh,teml; 
 	init_1820();        	   		                                   //复位18b20
	write_1820(0xcc);   			                                   //跳过ROM
	write_1820(0x44);            	                                   //发出温度转换命令
	delay_ms(750);
	init_1820();
	write_1820(0xcc);  				                                   //发出读命令
	write_1820(0xbe);
	teml=read_1820();  				                                   //读数据
	temh=read_1820();
	temp_data[0]=read_1820();
	temp_data[1]=read_1820();
	count=temh<<8+teml;
	count=count*0.0625;
	count=(temh*256+teml)*6.25;  	                                   //计算具体温度
	dis_buf_18b20[2]=(count%10000)/1000+0x30;	
	dis_buf_18b20[1]=(count%1000)/100+0x30;	
	dis_buf_18b20[0]=(count%100)/10+0x30;		
}

⌨️ 快捷键说明

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