如果有问题或是更好的方法希望大家提出来,谢谢
/*温度传感器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');
}
}