温度传感器18B20(串口显示)

如果有问题或是更好的方法希望大家提出来,谢谢

/*温度传感器18B20--串口显示温度*/
#include<reg52.h>
#include <intrins.h> 

typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef          char int8;
typedef          int int16;
sbit DQ=P3^2;	 //温度输入口

void nops()
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

void delay(uint16 n)
{
    while(n--);
}

void delay_ms(uint16 n)
{
	uint8 m=120;

	while (n--)
		while (m--);
}

void DS18b20_reset(void)
{
	bit flag=1;
		while (flag)
	 	{
 			DQ = 1;
			delay(1);	//7.5us
 			DQ = 0;
 			delay(50); //139.8us
 			DQ = 1; 
 			delay(6);  // 21us
 			flag = DQ;
   		}
	delay(45);    //延时500us
	DQ=1;
}


/*
 * 18B20写1个字节函数
 * 向1-WIRE总线上写一个字节
*/
void write_byte(uint8 val)
{
	uint8 i;

	for (i=0; i<8; i++)
	{
		DQ = 1;
		_nop_();  	 //两次传送间隔大于1us
		DQ = 0;
		nops(); //4us
		DQ = val & 0x01;      //最低位移出
		delay(6);           //66us  (30US)
		val >>= 1;          //右移一位
	}
	DQ = 1;
	delay(1);  
}


/*
 * 18B20读1个字节函数
 * 从1-WIRE总线上读取一个字节
*/
uint8 read_byte(void)
{
	uint8 i, value=0;

	for (i=0; i<8; i++)
	{
	    value >>= 1;
		DQ=1;
		_nop_();
		DQ = 0;
		nops();   //4us
		DQ = 1;
		nops();   //4us 
		if (DQ)
			value|=0x80;
		delay(6);           //66us
	}
	DQ=1;
	return value;
}


/*
 * 启动温度转换
*/
void start_temp_sensor(void)
{
   DS18b20_reset();
   write_byte(0xCC); // 发Skip ROM命令
   write_byte(0x44);// 发转换命令
}


/*
 * 读出温度
*/
int16 read_temp(void)
{
	uint8 temp_data[2]; // 读出温度暂放
	int16 temp;

	DS18b20_reset();  // 复位
	write_byte(0xCC); // 发Skip ROM命令
	write_byte(0xBE); // 发读命令
	temp_data[0]=read_byte();  //温度低8位
	temp_data[1]=read_byte();  //温度高8位

	temp = temp_data[1];
	temp <<= 8;
	temp |= temp_data[0];
	temp >>= 4;	  //注意是移动四位

	return temp;
}

/**
 * UART初始化
 * 波特率:9600
*/
void uart_init(void)
{
    TMOD = 0x21;        // 定时器1工作在方式2(自动重装)
    SCON = 0x50;        // 10位uart,允许串行接受

    TH1 = 0xFD;
    TL1 = 0xFD;

    TR1 = 1;
}

/**
 * UART发送一字节
*/
void UART_Send_Byte(uint8 dat)
{
	SBUF = dat;
	while (TI == 0);
	TI = 0;
}

/**
 * 将数据转换成ASC码并通过UART发送出去
*/
void UART_Send_Dat(uint8 dat)	 //100度以下温度可用
{
	UART_Send_Byte(dat/10%10 + '0');
	UART_Send_Byte(dat%10 + '0');
}

 

main()
{
	int16 ans;

	uart_init();
	start_temp_sensor();
	while (1)
	{
		delay_ms (1000); // 延时1秒

		ans=read_temp();
	
		if (ans < 0)
		{
			UART_Send_Byte('-');
			ans = -ans;
		}
	
		UART_Send_Dat(ans);
		UART_Send_Byte('\r');
		UART_Send_Byte('\n');
	}

}


 

你可能感兴趣的:(温度传感器18B20(串口显示))