DS18B20读取温度,ESP8266传输数据到电脑

代码分为两块,一块是读取18B20的,一块是mian主函数


#include 
#include 

sbit IO_18B20 = P3^2;  //DS18B20通信引脚

/* 软件延时函数,延时时间(t*10)us */
void DelayX10us(unsigned char t)
{
    do {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    } while (--t);
}
bit Get18B20Ack()
{
	bit ack;

	EA = 0;
	IO_18B20 = 0;
	DelayX10us(50);
	IO_18B20 = 1;
	DelayX10us(6);
	ack = IO_18B20;
	while(!IO_18B20);
	EA = 1;

	return ack;
}

void  Write18B20(unsigned char dat)
{
	unsigned char mask;
	EA = 0;
	for(mask=0x01; mask!= 0; mask<<=1)
	{
		IO_18B20 = 0;
		_nop_();
		_nop_();
		if((mask&dat) == 0)
			IO_18B20 = 0;
		else
			IO_18B20 = 1;
		DelayX10us(6);
		IO_18B20 = 1;
	}
	EA = 1;
}

unsigned char Read18B20()
{
	unsigned char dat;
	unsigned char mask;

	EA = 0;
	for(mask=0x01; mask!=0; mask<<=1)
	{
		IO_18B20 = 0;
		_nop_();
		_nop_();
		IO_18B20 = 1;
		_nop_();
		_nop_();
		if(!IO_18B20)
			dat &= ~mask;
		else
			dat |= mask;
		DelayX10us(6);
	}
	EA = 1;

	return dat;
}

bit Start18B20()
{
	bit ack;

	ack = Get18B20Ack();
	if(ack == 0)
	{
		Write18B20(0xCC);
		Write18B20(0x44);
	}
	return ~ack;
}

bit Get18B20Temp(int *temp)
{
	
	bit ack;
	unsigned char LSB, MSB;
	Start18B20();
	ack = Get18B20Ack();
	if(ack == 0)
	{
		Write18B20(0xCC);
		Write18B20(0xBE);
		LSB = Read18B20();
		MSB = Read18B20();
		*temp = ((int)MSB<<8) + LSB;
	}
	return ~ack;
}
#include

void ConfigUART();
extern bit Get18B20Temp(int *p);
unsigned char IntToString(unsigned char *str, int dat);

void Delay(unsigned int i )
{
	int x=0;

	for(x=0;x<i;x++);
}

void Delay2(unsigned int i )
{
	unsigned int x=0;

	int y=0;

	for(y=0;y<500;y++)
	{
		for(x=0;x<i;x++);
	}
	
}


/******************************************************************** 
名称:串口发送函数  功能:MCU向无线WIFI模块ESP8266发送数据  
********************************************************************/ 
void Send_Uart(unsigned char value) 
{  
	ES=0;  						//关闭串口中断  
	TI=0;   					//清发送完毕中断请求标志位   
	SBUF=value; 				//发送  
	while(TI==0); 				//等待发送完毕   
	TI=0;   					//清发送完毕中断请求标志位   
	ES=1;  						//允许串口中断  
}  

/******************************************************************** 
名称:WIFI模块设置函数  作用: 启动模块,以便可以实现无线接入和控制  
********************************************************************/ 

void SendAT(unsigned char *puf) 	// 数组指针*puf指向字符串数组                
{    
	while(*puf!='\0')    		//遇到空格跳出循环  
	{   
		Send_Uart(*puf);  		//向WIFI模块发送控制指令。   
		Delay(5);   
		puf++;    
	}  

   
} 





sbit LED=P0^0;
sbit LED2=P0^1;

sbit LED3=P0^2;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
sbit KEY1=P2^4;
unsigned char text[2]; 

int f=1;

int temp;


void SetRed()
{
	ENLED=0;
	ADDR3=1;
	ADDR2=1;
	ADDR1=1;
	ADDR0=0;
	LED=1;
	LED2=1;

	//P2=0xF7;
}



void InitWifi()
{



	 	SendAT("AT+CWMODE=1\r\n");
		Delay2(500);
		SendAT("AT+CWJAP=\"CMCC-5tiu\",\"12345\"\r\n");
		Delay2(2000);
		SendAT("AT+CIPSTART=\"TCP\",\"192.168.1.4\",19660\r\n");
		Delay2(500);
		SendAT("AT+CIPMODE=1\r\n");
		Delay2(500);
		SendAT("AT+CIPSEND\r\n");
		Delay2(500);
		f=1;

//		SendAT("AT\r\n");
//		Delay(30000);
//		SendAT("AT+CWMODE=2\r\n");
//		Delay(30000);
//		SendAT("AT+CWSAP=\"esp8899\",\"12345678\",11,4\r\n");
//		Delay(30000);
//		SendAT("AT+CIPMUX=1\r\n");
//		Delay(30000);
//		SendAT("AT+CIPSERVER=1,5000\r\n");
//		Delay(30000);
//		SendAT("AT+CIPSTO=0\r\n");


		

}


int intT,decT;
	unsigned char len;
	unsigned char str[12];
	bit res;


void main()
{

	LED2=0;
	Delay2(500);

	

	ConfigUART();

	SetRed();


	 InitWifi();

	 LED2=0;

	

	while(1)
	{

		//LED=~LED;

//
//	   Delay(50000);


		if(LED3==0)
		{
			LED=0;
			LED2=0;

			//SendAT("8\r\n");
			
			

			

			res= Get18B20Temp(&temp);

			intT = temp >> 4;             //分离出温度值整数部分
            decT = temp & 0xF;            //分离出温度值小数部分
            len = IntToString(str, intT); //整数部分转换为字符串
            str[len++] = '.';             //添加小数点
            decT = (decT*10) / 16;        //二进制的小数部分转换为1位十进制位
            str[len++] = decT + '0';      //十进制小数位再转换为ASCII字符
            while (len < 6)               //用空格补齐到6个字符长度
            {
                str[len++] = ' ';
            }
            str[len] = '\0';              //添加字符串结束符

			SendAT(str);
			
			Delay2(1000);

		}
		else
		{
			LED=1;
			LED2=0;

		}
	}

}



void ConfigUART()
{
	TMOD=0x20;

	SCON=0x50;

	

	//TH1=256-(11059200/12/32)/baud;

	TH1=0xFD;

	TL1=TH1;

	PCON = 0x00;

	EA=1;

	ES=1;

	TR1=1;


}



void InterruptUART() interrupt 4
{




	if(RI)
	{
		 RI=0;	

	}

	if(TI)
	 {
	 	TI=0;
	 }

}



/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
unsigned char IntToString(unsigned char *str, int dat)
{
    signed char i = 0;
    unsigned char len = 0;
    unsigned char buf[6];
    
    if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号
    {
        dat = -dat;
        *str++ = '-';
        len++;
    }
    do {          //先转换为低位在前的十进制数组
        buf[i++] = dat % 10;
        dat /= 10;
    } while (dat > 0);
    len += i;     //i最后的值就是有效字符的个数
    while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
    {
        *str++ = buf[i] + '0';
    }
    *str = '\0';  //添加字符串结束符
    
    return len;   //返回字符串长度
}



你可能感兴趣的:(单片机)