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

📄 7_6.c

📁 51事例原代码 事例多多 应该对初学者很有用
💻 C
字号:
//DS18B20测温c51程序:

#include <reg51.h>
#include<intrins.h>
#define BUSY (DQ==0) 

sbit DQ= P0^4; 
unsigned char idata TMP; 			//温度的整数部分
unsigned char idata TMP_d; 			//温度的小数部分
unsigned char f;					//f=0,正温度;f=1,负温度
unsigned char ROM[8];				//存放DS1820ROM中的编码(即64位地址)
void wr_ds18(char d); 				// ds18b20字节写
unsigned char rd_ds18();			//DS18B20 字节读取

void time_delay(unsigned char time)	//延时程序,单位?s,大于10us
{
	time=time-10;
	time=time/6;
	while (time!=0) time--;
}

void ds_reset(void)					// DS18B20复位
{
	unsigned char idata count=0;  
	DQ=0;							//控制器向DS18B20发低电平脉冲
	time_delay(240);				//延时
	time_delay(240);
	DQ=1;
	return;
}

void check_pre(void)				//检查DS18B20是否存在
{
    while(DQ);						//DQ=1?
    while(~DQ);						//DQ=0?
    time_delay(30);
}

void read_ROM(void)					//读ROM
{
	int n;
	ds_reset();						//DS18B20初始化
	check_pre();
	wr_ds18(0x33);					//ds18b20字节写
	for(n=0;n<8;n++)
		{
		ROM[n]=rd_ds18_1();   		//读DS1820ROM中的编码(即64位地址)
		}
}

bit read_bit(void)					//位读取
{
    idata char i=0;
    bit j;
    DQ=0;
	_nop_();
    DQ=1;
    _nop_();
    _nop_();
    _nop_();
	_nop_();
  	_nop_();
	_nop_();
 	_nop_();
 	_nop_();
 	_nop_();
 	_nop_();
 	_nop_();
 	_nop_();
 	_nop_();
 	_nop_(); 
  	j = DQ;
  	time_delay(50);
 	return j;
}

unsigned char rd_ds18()				//DS18B20 字节读取
{
	unsigned char idata i,t,d=0;
	for(i=1;i<=8;i++)
   		{
		t=read_bit();				//位读取
        d=(t<<(i-1))|d;				//结果压入d
    	}
     return d;
}

void wr_ds18(char d)				// ds18b20字节写
{
     signed char  idata i=0;
     unsigned char idata k;
     bit q;
     for(k=1;k<=8;k++)
     {
         q = d & 0x01;				//将d中的数逐位移至q
         d = d>>1;
         if (q)
         {							//写"1"
              DQ=0;
              _nop_();
              _nop_();
              DQ=1;
              time_delay(60);
         }
         else
         {							//写"0"
              DQ=0;
              time_delay(50);
              DQ=1;
              _nop_();
              _nop_();
         }
     }
}

int get_temp(void)					//得到整数的温度值
{
	unsigned char idata a=0,b=0;
    unsigned char idata i;
	EA=0;							//关中断
	ds_reset();						//DS18B20初始化
	check_pre();
	wr_ds18(0xcc);					//向DS18B20发SKIP ROM命令
	wr_ds18(0x44);					//启动DS18B20进行温度转换,结果存入内部RAM
	while(BUSY);					//延时
	ds_reset();						//DS18B20初始化
	check_pre();
	wr_ds18(0xcc); 					//向DS18B20发SKIP ROM命令
	wr_ds18(0xbe);					//读内部RAM中9字节的内容命令
	a=rd_ds18();					//读内部RAM (LSB)
	b=rd_ds18();					//读内部RAM (MSB)

	i=b;
    i=(i>>4);
    if(i==0)						//正温度
		{
		f=0;						//设立正温度符
		TMP=((a>>4)|(b<<4));		//取出整数部分
		a=(a&0x0f);
		if (a>8)
			{
			TMP=(TMP+1);			//四舍五入
			}
		}
	else
		{							//负温度
		f=1;						//设立负温度符
		a=a>>4;
		b=b<<4;
		TMP=(a|b);					//取出整数部分
		TMP=~TMP;					//变补
		TMP=(TMP+1);
		}
	EA=1;							//重新开放中断
	return(TMP);
}

int get_temp_d(void)				//得到完整的温度值(整数和小数)
{
	unsigned char idata a=0,b=0;
	unsigned char idata i,j;
	EA=0;							//关中断
	ds_reset();						// DS18B20初始化
	check_pre();
	wr_ds18(0xcc); ;				//向DS18B20发SKIP ROM命令
	wr_ds18(0x44);					//启动DS18B20进行温度转换,结果存入内部RAM
	while(BUSY);					//延时
	ds_reset();						// DS18B20初始化
	check_pre();
	wr_ds18(0xcc); 					//向DS18B20发SKIP ROM命令
	wr_ds18(0xbe);					//读内部RAM中9字节的内容命令
	a=rd_ds18();					//读内部RAM (LSB)
	b=rd_ds18();					//读内部RAM (MSB)
	i=b;
	i=(i>>4);
	if (i==0)
		{
        f=0;    					//i为0,正温度,设立正温度标记
        TMP=((a>>4)|(b<<4));		//整数部分
       	a=(a&0x0f);
       	TMP_d=a;					//小数部分
		}
	else
		{
       	f=1;    					//i为1,负温度,设立负温度标记
       	a=~a;						//变补
       	a=(a+1);
       	b=~b;						//变补
       	b=(b+1);
       	j=a;
      	a=a>>4; 
       	b=b<<4;
       	TMP=(a|b);					//整数部分
       	j=(j&0x0f);					//小数部分
       	TMP_d=j;
    	}
	EA=1;							//重新开放中断
	return(TMP);
}

⌨️ 快捷键说明

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