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

📄 18b20.c

📁 单片机开发温度传感器ds18b20.在自己的板子上运行良好
💻 C
字号:
/////////////////////////////////////
//通信工程  陈自远  08年12月4日
////////////////////////////////////
#include <reg52.h>
sbit DQ=P3^4;
bit presence;
char tflag;
unsigned long tdat=0;
long tt;
int   t=0;
int temp_lsb;
int temp_msb;
void delay(int useconds);
void delay02s(void) ;
unsigned char ow_reset(void);
unsigned char read_bit(void);
void write_bit(char bitval);
void disp0();
long Read_Temperature(void);
char data1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
  
  // P0=254;
  // delay(30000000);测试用
		
   while (1)
   {
   	   
	tdat=Read_Temperature();
//	delay02s();
//	delay02s();
   	disp0();
	
	} 
}
  
void delay02s(void)               //延时0.2秒子程序
         {
           unsigned char i,j,k;  //定义3个无符号字符型变量。
           for(i=5;i>0;i--)     //三个FOR循环用来延时,这里为
           for(j=5;j>0;j--)     //什么是0.2S大家可以用WAVE
           for(k=5;k>0;k--);  //高断点仿真一下,就可知道大概
          }                   //是0.2S了。

void delay(int useconds)
{
	int s;
	for (s=0; s<useconds;s++);
}
unsigned char ow_reset(void)
{
	//unsigned char presence;
    DQ = 0;//pull DQ line low
    delay(30);// leave it low for 480us
	DQ = 1;       // allow line to return high
	delay(3); // wait for presence
	presence = DQ;// get presence signal
	delay(25);// wait for end of timeslot
    //	P0=presence;
    return(presence);// presence signal returned
}                            //     0=presence, 1 = no part

unsigned char read_bit(void)
{
	unsigned char i;
	DQ = 0;// pull DQ low to start timeslot
	DQ = 1;// then return high
	for (i=0; i<3; i++);// delay 15us from start of timeslo
	return(DQ);// return value of DQ line
}

void write_bit(char bitval)
{
	DQ = 0;// pull DQ low to start timeslot
	if(bitval==1) DQ =1;// return DQ high if write 1
	delay(5);// hold value for remainder of timeslot
	DQ = 1;
}
unsigned char read_byte(void)
{
	unsigned char i;
	unsigned char value = 0;
	for (i=0;i<8;i++)
	{
		if(read_bit()) 
			value|=0x01<<i;    // reads byte in, one byte at a time and the
					//shifts it left
	    	delay(6);// wait for rest of timeslot
	}
	return(value);
}
void write_byte(char val)
{
	unsigned char i;
	unsigned char temp;
	for (i=0; i<8; i++)            // writes byte, one bit at a time
	{
		temp = val>>i;          // shifts val right 'i' spaces
		temp &= 0x01;              // copy that bit to temp
		write_bit(temp);
	}
	delay(5);           // write bit in temp into

}
long Read_Temperature(void)
{


	temp_lsb=0;
    temp_msb=0;
	ow_reset();
	write_byte(0xCC);  //Skip ROM
	write_byte(0x44);  // Start Conversion
	delay(5);
	ow_reset();
	write_byte(0xCC); // Skip ROM
	write_byte(0xBE);  // Read Scratch Pad
	temp_lsb =read_byte(); // Temp data plus lsb
	temp_msb=read_byte();
	t=temp_msb;
	t<<=8;				//温度值的高8位放在t的高8位
	t=t|temp_lsb;				//温度值的低8位放在t的低8位
	if(t<0x0fff)		//判断温度值得正负值
		tflag=0;		//tflag=0温度值为正
	else
	   {
			t=~t+1;			//温度值为负,负值以补码形式存放,这里要将其还原成原码
			tflag=1;		//tflag=1温度值为负
	   }
	tt=t*(62.5);
			
	//P0=temp_lsb;
	//P0=temp_msb;
	//delay(3000000);test
	return(tt);
}
void disp0()//温度转换
{
	char flagdat ;//定义温度值符号
	char shi,ge,xshi,xbai;
	if(tflag==0)
		flagdat=0xff;//温度为正不显示符号
	else
		flagdat=0x2d;//负温度显示负号:
		P0=flagdat;
	P1=0xf2;
	delay02s();
	//delay02s();
    shi=tdat/10000;//温度十位
	P0=data1[shi];
	P1=0xf3;
//	delay02s();
//	delay02s();
//	delay02s();
//	delay02s();
    ge=tdat%10000/1000;//温度个位
	P0=data1[ge];
	P1=0xf4;
 	delay02s();
	delay02s();
    delay02s();
	delay02s();
    P0=0X7f;//小数点
	P1=0xf5;
 	delay02s();
    delay02s();
 	xshi=tdat%1000/100;//小数十位
	P0=data1[xshi];
	P1=0xf6;
	delay02s();
	delay02s();
    delay02s();
	delay02s();
	xbai=tdat%100/10;//小数百位
    P0=data1[xbai];
	P1=0xf7;

}

⌨️ 快捷键说明

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