打印
[51单片机]

求指导关于串口显示实时温度

[复制链接]
2358|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jing105768|  楼主 | 2016-1-23 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想将实时温度值用串口显示出来,用下面的程序,串口一直显示的是: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');
          
    }  
  
}

相关帖子

沙发
ningling_21| | 2016-1-23 14:13 | 只看该作者
没启动温度转换吗

使用特权

评论回复
板凳
JY-DX-JY| | 2016-1-23 14:21 | 只看该作者
读到的温度是0

使用特权

评论回复
地板
jing105768|  楼主 | 2016-1-23 14:22 | 只看该作者
ningling_21 发表于 2016-1-23 14:13
没启动温度转换吗

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

使用特权

评论回复
5
jing105768|  楼主 | 2016-1-23 14:23 | 只看该作者

为什么不是实时温度值?而一直是00.0000呢?

使用特权

评论回复
6
JY-DX-JY| | 2016-1-23 14:29 | 只看该作者
可能时序有问题吧,拿示波器看一下

使用特权

评论回复
7
ningling_21| | 2016-1-23 15:11 | 只看该作者
jing105768 发表于 2016-1-23 14:23
为什么不是实时温度值?而一直是00.0000呢?

初始化正确吗?它的温度转换完成了没

使用特权

评论回复
8
shauew| | 2016-1-23 15:51 | 只看该作者
先调试看看实时温度值正确不,
如果正确然后打印出来的值有错误,
那就很可能是温度在打印时候计算的错误,比如取整有可能得到0.

使用特权

评论回复
9
jing105768|  楼主 | 2016-1-23 16:34 | 只看该作者
ningling_21 发表于 2016-1-23 15:11
初始化正确吗?它的温度转换完成了没

我想问下串口调试助手里的数据可以保存吗,怎么保存?

使用特权

评论回复
10
nngogogo| | 2016-1-23 17:19 | 只看该作者
估计还是通信时序的问题吧   刚上电第一次有没有读到85度?  

使用特权

评论回复
11
ningling_21| | 2016-1-23 17:56 | 只看该作者
jing105768 发表于 2016-1-23 16:34
我想问下串口调试助手里的数据可以保存吗,怎么保存?

这个要看你的串口助手有没这个功能,例如:   usr-tcp232-test  这个软件是可以保存的

使用特权

评论回复
12
icecut| | 2016-1-23 18:05 | 只看该作者
https://bbs.21ic.com/icview-831950-1-1.html
下载这个代码看看...我记得有18b20读温度显示和发送串口

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

25

帖子

1

粉丝