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

📄 ds1820温度.c

📁 这个是AM51S开发板的专用温度测试程序!
💻 C
字号:
//温度显示程序==LED显示,精度0.5度
//12M,11.0592M

/*********************************************/

#include"AT89x52.h"
	
#define uint unsigned int
#define uchar unsigned char

sbit DUAN=P2^0;     //74HC573的LE端    LED的段选端
sbit WEI=P2^1;      //74HC573的LE端    LED的位选端
sbit TMDAT=P1^7;    //DS1820温度接口

uchar Temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x40};  //共阴显示字库
uchar Temp_1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};          //共阴==带小数点

bit f;             //负温度标志
bit flag;          //DS1820初始化成功标志
uchar tempint,tempdf;	          //温度整数部分和小数部分

void wei_1(uchar wei)             //数码管位控制
{
	WEI=1;
	P0=wei;
	WEI=0;
}

void duan_1(uchar duan)           //数码管段控制
{
	uint i;
	DUAN=1;
	P0=Temp[duan];
	DUAN=0;
	for(i=500;i>0;i--);
}

void duan_2(uchar duan)           //数码管段控制
{
	uint i;
	DUAN=1;
	P0=Temp_1[duan];
	DUAN=0;
	for(i=500;i>0;i--);
}

void set_ds1820()              //初始化DS1820
{
	while(1)
	{
		uchar delay;
		flag=0;
		TMDAT=1;                  //总线高电平
		delay=1;
		while(--delay);           //稍微延时
		TMDAT=0;                  //总线拉低
		delay=250;
		while(--delay);           //延时500us
		TMDAT=1;                  //拉高总线
		delay=30;
		while(--delay);           //延时60us
		while(!TMDAT)             //当DS1820拉低总线
		{
			delay=120;  
			while(--delay);        //延时240us
			if(TMDAT)
			{
				flag=1;             //DS1820初始化成功标志
				break;
			}
		}
		if(flag)                  //初始化成功后再延时480us,时序要求
		{
			delay=240;
			while(--delay);
			break;
		}
	}
}

void write_ds1820(uchar command)  //写8位
{
	uchar delay,i;
	for(i=8;i>0;i--)               //循环8次写入
	{
		TMDAT=0;                    //拉低总线
		delay=6;
		while(--delay);             //延时12us
		TMDAT=command&0x01;         //将数据放在总线上,进行采样
		delay=25;
		while(--delay);             //延时50us,采样完毕
		command=command>>1;         //数据右移一位,准备下次数据
		TMDAT=1;                    //释放总线
	}
}

void read_ds1820()                //读
{
	uchar delay,i,j,k,temp,temph,templ;
	j=2;                           //读2位字节数据
	do
	{
		for(i=8;i>0;i--)            //一个字节分8位读取
		{
			temp>>=1;                //读取1位右移1位
			TMDAT=0;                 //数据线置低电平
			delay=1;
			while(--delay);          //延时2us
			TMDAT=1;                 //拉高总线
			delay=4;
			while(--delay);          //延时8us
			if(TMDAT)temp|=0x80;     //读取1位数据
			delay=25;
			while(--delay);          //读取1位数据后延时50us
		}
		if(j==2)templ=temp;         //读取的第一字节存templ
		else temph=temp;            //读取的第二字节存temph
	}while(--j);
	f=0;                           //初始温度标志为正
	if((temph&0xf8)!=0x00)         //若温度为负的处理,对二进制补码的处理
	{
		f=1;                        //为负温度f置1
		temph=~temph;
		templ=~templ;
		k=templ+1;
		templ=k;
		if(k>255)
		{
			temph++;
		}
	}
	tempdf=templ&0x0f;            //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf
	templ>>=4;
	temph<<=4;
	tempint=temph|templ;
}

void get_temperature()           //温度转换、获得温度子程序
{
	set_ds1820();                 //初始化DS18B20
	write_ds1820(0xcc);           //发跳过ROM匹配命令
	write_ds1820(0x44);           //发温度转换命令
	set_ds1820();                 //初始化DS18B20
	write_ds1820(0xcc);           //发跳过ROM匹配命令
	write_ds1820(0xbe);           //发出读温度命令
	read_ds1820();                //将读出的温度数据保存到tempint和tempdf处
}

void disp_temp()                      //显示温度
{
	uchar tempinth,tempintl;	
	tempinth=tempint/10;          //整数高半字节
	tempintl=tempint%10;          //整数低半字节
	if(!flag)wei_1(0xff);         //如果不能检测出DS1820,则不显示
	else                          //或者显示温度值
	{
		if(f==1)                   //如果为负温度,则显示负号
		{
			wei_1(0xf7);
			duan_1(11);
		}
		else  wei_1(0xff);        //或者不显示负号 
		wei_1(0xef);
		duan_1(tempinth);		
		wei_1(0xdf);
		duan_2(tempintl);
		wei_1(0xbf);
		duan_1(tempdf);	
		wei_1(0x7f);
		duan_1(10);	
		f=0;                     //清负温度标志	
	}	
}

void main()
{
	while(1)
	{
		get_temperature();         //获得温度         
		if(tempdf>=8)tempdf=5;     //0.5度精度显示   
		else tempdf=0;
		disp_temp();               //显示温度
	}
}
	

⌨️ 快捷键说明

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