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

📄 wenkong_ds18b20.txt

📁 这是一个有关程序控制温度及其测量的程序,可以供大家参考
💻 TXT
字号:
#include <REGX52.H>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
uint  TEMP;									// 温度值的变量;
uchar flag1;									// 结果为负和正的标志位。		
void display(void);
uchar LEDData [] = { 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60};
void delayms(short i);
void delay (unsigned int count)
{									
	unsigned int i;	
	while (count)	
	{
		i =200;
		while (i>0) i--;
		count--;
    }
}

void tmreset (void)								 // 发送复位和初始化
{
	unsigned int i;
P3_5 = 0;	
	i = 103;
	while (i>0) i--;         						// 延时
    P3_5= 1;	
	i = 4;	
	while (i>0) i--;	
}

bit tmpread (void)								// 读取数据的一位
{ 
	unsigned int i;
	bit dat;
	P3_5= 0; i++;	
	P3_5= 1; i++; i++;							//延时	
	dat = P3_5;	
	i = 8; while (i>0) i--;							// 延时
	return (dat);
}	

unsigned char tmpread2 (void) 			 			//读一个字节
{
	unsigned char i,j,dat;	
	dat = 0;	
	for (i=1;i<=8;i++)
	{
		j = tmpread ();	
		dat = (j << 7) | (dat >> 1);	
	}
	return (dat);
}	

void tmpwrite (unsigned char dat)					//写一个字节
{   
	unsigned int i;
	unsigned char j;
	bit testb;	
	for (j=1;j<=8;j++)
	{	
		testb = dat & 0x01;
		dat = dat >> 1;	
		if (testb)
		{	
			P3_5 = 0; 						// 写0 
			i++; i++;  
			P3_5 = 1;	
			i = 8; while (i>0) i--; 
		}
		else	
		{
			P3_5 = 0; 						// 写0 
			i = 8; while (i>0) i--; 
			P3_5 = 1;
			i++; i++;  
		}
	}
}

void tmpchange(void)							// ds1820 开始转换
{  
	tmreset ();								// 复位
	//tmpre ();								// 等待存在脉冲	
	delay (1);								// 延时
	tmpwrite (0xcc);							// 跳过序列号命令
	tmpwrite (0x44); 						// 发转换命令 44H,	
}

void tmp (void)								// 读取温度
{ 
	unsigned int a,b,d;
	tmreset ();								// 复位
	delay (1);								// 延时
	tmpwrite (0xcc); 						// 跳过序列号命令
	tmpwrite (0xbe); 						// 发送读取命令
	a = tmpread2 ();							// 读取低位温度	
	b = tmpread2 ();  						//读取高位温度	
    b=b<<8;
    d=a+b;
   if(0x80&b!=0)
    {
		flag1=1;								//若b为1则为负温	
		TEMP=~d+1;						//如果为负温则去除其补码
	}
	else		
	TEMP=d;	
}

//rom()										// 读取器件序列号子程序
//{
//	tmreset ();								//复位
//	delay (1);								//延时
//	tmpwrite(0x33);							//发送读序列号子程序
//}    

 void display(void)
{	
    unsigned int div;
	unsigned char tm[11],i;
	unsigned char shi,ge,_1,_2,_3,_4;
	float  m=0,n=0,s=0.0625;
     
	div=0x01;
	for (i=0;i<11;i++) 
        {
		if((TEMP&div)!=0)
		tm[i]=1;
		else
    	tm[i]=0;
    	div =div << 1;
	    }

	for (i=0;i<11;i++)
     	 {
	    m=tm[i]*s;
		s*=2;
		n+=m;
	 }  
        shi=(int)(n/10);
		ge=(int)n-shi*10;
		_1=(int)((n-(int)n)*10);
		_2=(int)(n*100)-shi*1000-ge*100-_1*10;
		_3=(int)(n*1000)-shi*10000-ge*1000-_1*100-_2*10;
        _4=(int)(n*10000)-shi*100000-ge*10000-_1*1000-_2*100-_3*10;

        P2_1=0;
	    if(shi!=0)	    
		P0=LEDData[shi];
		else
        P0=0xff;    
		delayms(15);
        P2_1=1;	    

        P2_2=0;        
	    P0=LEDData[ge]&0xdf;
		delayms(15);		
		P2_2=1;	
       
        P2_3=0;
		P0=LEDData[_1];
		delayms(15);
		P2_3=1; 
	       
        P2_4=0;
		P0=LEDData[_2];
		delayms(15);
	    P2_4=1;
		      		
        P2_5=0;
		P0=LEDData[_3];
		delayms(15);
		P2_5=1;

        P2_6=0;
		P0=LEDData[_4];
		delayms(15);
		P2_6=1;
		
 }

 void delayms(short i)
{
     int j=0;
	 int k=0;
	 k=i*3;
	 while(j<k) j++;
}

main()
{
	do{		
		tmpchange();							// 开始温度转换
									// 读取延时
		tmp();								//读取温度
       display();
      }while(1);	
}	

⌨️ 快捷键说明

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