我想将实时温度值用串口显示出来,用下面的程序,串口一直显示的是:00.0000C 怎么回事啊?求指导,谢谢了!
/*温度传感器18B20--串口显示温度*/
#include<reg52.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef char int8;
typedef int int16;
sbit DQ=P3^7; //温度输入口
uint16 zhengshu;
uint16 xiaoshu;
uint16 temp;
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];
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(uint16 dat) //100度以下温度可用
{
UART_Send_Byte(dat+ '0');
}
main()
{
uart_init();
start_temp_sensor();
while (1)
{
delay_ms (1000); // 延时1秒
read_temp();
zhengshu=0xff&(temp>>4);//整数
xiaoshu=(0x0f&temp)*625;//小数
UART_Send_Dat(zhengshu/10);
UART_Send_Dat(zhengshu%10);
UART_Send_Byte('.');
UART_Send_Dat(xiaoshu/1000);
UART_Send_Dat(temp/100%10);
UART_Send_Dat(temp/10%10);
UART_Send_Dat(temp%10);
UART_Send_Byte('C');
UART_Send_Byte('\n');
}
} |