基于51单片机——读取温度后串口发送数据到PC端

链接:https://pan.baidu.com/s/1mwgnxuXqjq4zym7ewrCTHw 
提取码:yvrv

#include "reg52.h"
#include "onewire.h"
sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t *= 12;
	while(t--);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

float fRead_Temperature(void)
{
	
	unsigned char low,high;
	init_ds18b20();
	Write_DS18B20(0xcc); 		//跳过读取ROM
	Write_DS18B20(0x44); 		//启动温度转换
								//不加上Delay延时,等待温度转换完成,直接去读取暂存器
	init_ds18b20();
	Write_DS18B20(0xcc); 		//跳过读取ROM
	Write_DS18B20(0xbe); 		//获取暂存器数据
	low = Read_DS18B20();		//温度低8位数据
	high = Read_DS18B20();		//温度高8位数据
	
	
	return ((high<<8)|low)/16.0;
}
#include 
#include "Uart.h"
#include "onewire.h"

unsigned char Uart_Slow_Down;//串口减速函数
unsigned char Uart_Recv[10];//串口接收数据存储数组
unsigned char Uart_Recv_Index;//串口接收数组指针
unsigned char Uart_Send[10];//串口发送数组

unsigned char CNCHAR[6] = "摄氏度";


void DelayMs(unsigned int x)   //0.14ms误差 0us
{
 unsigned char i;
  while(x--)
 {
  for (i = 0; i<13; i++)
 {}
 }
}

void Data_Send(float Temperature)
{
	unsigned char datas[6] = {0, 0, 0, 0, 0, 0}; //定义数组
	int i;
	unsigned int temp;
	
	if(Temperature>0)
	{
		temp= (unsigned int)(Temperature*100+0.5);
		datas[0] = temp / 10000;
		datas[1] = temp % 10000 / 1000;
		datas[2] = temp % 1000 / 100;
		datas[3] = temp % 100 / 10;
		datas[4] = temp % 10;
		
		SBUF = '+';
		while (!TI);			         //等待发送数据完成
		TI = 0;
		
		for(i=0;i<5;i++)
		{
			SBUF = '0' + datas[i];  
      while (!TI);  
      TI = 0;  
		}
		// 发送小数点  
    SBUF = '.';  
    while (!TI);  
    TI = 0;  
  
    // 发送小数部分  
    SBUF = '0' + datas[5];  
    while (!TI);  
    TI = 0;  
	
	
	for(i=0; i
#include "Uart.h"
#include 


//串口初始化
void UartInit(void)		//[email protected]
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xC7;		//设定定时初值
	TH1 = 0xFE;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	ES = 1;
	EA = 1;
	TR1 = 1;		//启动定时器1
}




//字节发送函数
void Uart_SendByte(unsigned char byte)   //串口发送单个字节函数
{
	SBUF=byte;
	while(TI==0);//等待数据发送
	TI=0;//将发送标志位清零
}
 
void Uart_SendString(char *str)  //串口发送字符串函数
{
    while(*str!='\0')     //判断字符串截止位则退出
	{
		Uart_SendByte(*str++);  
		
	}
}

你可能感兴趣的:(51单片机,嵌入式硬件,单片机)