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

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


#include <reg52.h>
#include <intrins.h>

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<reg52.h>

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;   //返回字符串长度
}



  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DS18B20是一种数字温度传感器,它可以通过一条数据线和单总线接口连接到单片机,而STM32则是ST公司推出的一系列微控制器芯片。下面是一个简单的DS18B20的STM32代码示例: ```c #include "ds18b20.h" GPIO_InitTypeDef GPIO_InitStruct; void DS18B20_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); DS18B20_DQ_OUT = 1; } void DS18B20_Start(void) { DS18B20_DQ_OUT = 0; //将总线拉低 delay_us(750); //延时750us DS18B20_DQ_OUT = 1; //将总线拉高 delay_us(15); //延时15us } uint8_t DS18B20_Read_Bit(void) { uint8_t dat; DS18B20_DQ_OUT = 0; //将总线拉低 delay_us(2); //延时2us DS18B20_DQ_OUT = 1; //将总线拉高 delay_us(10); //延时10us dat = DS18B20_DQ_IN; //读取数据 delay_us(48); //延时48us return dat; } uint8_t DS18B20_Read_Byte(void) { uint8_t i,j,dat=0; for(i=0;i<8;i++) { j = DS18B20_Read_Bit(); dat = (j<<7)|(dat>>1); } return dat; } void DS18B20_Write_Bit(uint8_t dat) { DS18B20_DQ_OUT = 0; //将总线拉低 delay_us(2); //延时2us if(dat) DS18B20_DQ_OUT = 1; //写1 else DS18B20_DQ_OUT = 0; //写0 delay_us(60); //延时60us DS18B20_DQ_OUT = 1; //将总线拉高 } void DS18B20_Write_Byte(uint8_t dat) { uint8_t i; for(i=0;i<8;i++) { if(dat&0x01) DS18B20_Write_Bit(1); else DS18B20_Write_Bit(0); dat >>= 1; } } int16_t DS18B20_Get_Temp(void) { uint8_t high,low; int16_t temp; DS18B20_Start(); //开始温度转换 DS18B20_Write_Byte(0xcc); //跳过ROM操作 DS18B20_Write_Byte(0x44); //开始温度转换 delay_ms(750); //等待转换完成(DS18B20最大转换时间为750ms) DS18B20_Start(); //开始读取温度 DS18B20_Write_Byte(0xcc); //跳过ROM操作 DS18B20_Write_Byte(0xbe); //读温度寄存器 low = DS18B20_Read_Byte(); //读温度低字节 high = DS18B20_Read_Byte(); //读温度高字节 temp = high; temp <<= 8; temp |= low; //合并温度数据 return temp; } ``` 这段代码实现了DS18B20在STM32上的读取温度功能,其中DS18B20_Init函数用于初始化DS18B20DS18B20_Start函数用于开始温度转换,DS18B20_Read_Bit和DS18B20_Read_Byte函数用于读取数据,DS18B20_Write_Bit和DS18B20_Write_Byte函数用于写入数据,DS18B20_Get_Temp函数用于获取温度。如果你还有其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖朝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值