打印

求助:DS18B20+PIC16F873A+串口读出温度不正确

[复制链接]
2651|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
seacore_2008|  楼主 | 2012-3-11 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
那位老师帮看看,使用串口监控读出来的总是显示<793,程序如下;

#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
uint temper;
uchar a1,a2,a3,a4;
#define DQ RA1
#define DQ_HIGH() TRISA1=1
#define DQ_LOW() TRISA1=0;DQ=0
#define nop asm("nop")
__CONFIG(0X3B31);
void init();
void reset();
void write_byte(uchar date);
uchar read_byte();
void get_tem();
void delayus(uint x,uchar y);
void delay(uint x);
void send();


void main()
{
        init();
while(1)
{
        get_tem();
        send();
        RA5=!RA5;//指示灯
}
       
}


void reset()
{

        uchar st=1;

        while(st)
        {
                DQ_LOW();
                delayus(70,30);//740
                DQ_HIGH();
                delayus(4,4);//70
                if(DQ==1)
                st=1;
                else
                st=0;
                delayus(40,15);//500
        }
}
void write_byte(uchar date)
{
        uchar i,temp;

        for(i=8;i>0;i--)
        {
                temp=date&0x01;//01010101
                DQ_LOW();
                delayus(0,0);//20
                if(temp==1)
                DQ_HIGH();
                delayus(2,2);//44
                DQ_HIGH();
                NOP();NOP();//
                date=date>>1;//00101010
        }
}
uchar read_byte()
{
        uchar i,date=0;
        static bit j;
        for(i=8;i>0;i--)
        {
                date=date>>1;
                DQ_LOW();
                nop;nop;nop;nop;nop;nop;
                DQ_HIGH();
                nop;nop;nop;nop;
                j=DQ;
                if(j==1)
                date=date|0x80;
                delayus(1,1);
        }
        return (date);
}
void get_tem()
{
        uchar tem1,tem2;
        float aaa;
        reset();  //复位
        write_byte(0xCC);//跳过ROM
        write_byte(0x44);//温度转换
        delay(1000);

        reset();
        write_byte(0xCC);
        write_byte(0xBE);

        tem1=read_byte();
        tem2=read_byte();
        nop;nop;
        DQ_HIGH();     //释放总线

        aaa=(tem2*256+tem1)*6.25;
        temper=(int)aaa;
        a1=temper/1000;
        a2=temper%1000/100;
        a3=temper%100/10;
        a4=temper%10;
}

void delayus(uint x,uchar y)
{
        uint i;
        uchar j;
        for(i=x;i>0;i--);
        for(j=y;j>0;j--);
}

void init()//相关寄存器初始化
{
        TXSTA=0X24;
        RCSTA=0X90;//连续接收
        SPBRG=25; //9600波特率

        TRISA5=0;
        GIE=1;
        RCIE=1;
        ADCON1=0X07;

}

void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
    for(b=110;b>0;b--);
}
void send()
{

        TXREG=a1|0x30;
        delay(1);
       
        TXREG=a2|0x30;
        delay(1);
       
        TXREG=a3|0x30;
        delay(1);
       
        TXREG=a4|0x30;
        delay(1);
       
        TXREG=0X0D;
        delay(1);
        TXREG=0X0A;
        delay(1);
        while(!TRMT);

}
沙发
Ryanhsiung| | 2012-3-11 11:35 | 只看该作者
1、One Wire 的时序是否正确!(这个用显波器看)
2、读温度的时序是否正确(程序对规格书看)
3、程序是否有BUG

使用特权

评论回复
板凳
seacore_2008|  楼主 | 2012-3-11 11:37 | 只看该作者
谢谢各位,是传感器挂了。

使用特权

评论回复
地板
paulful| | 2013-6-20 21:13 | 只看该作者
楼主 您好,这个程序最好跑出来了吗? 我也遇到了一个ds18b20的问题可以向你请教吗?

使用特权

评论回复
5
paulful| | 2013-6-20 21:55 | 只看该作者
楼主可以留个q给我嘛  谢谢了

使用特权

评论回复
6
llqjmy| | 2013-6-21 23:22 | 只看该作者
paulful 发表于 2013-6-20 21:55
楼主可以留个q给我嘛  谢谢了

我能问问:为什么你们这么喜欢用DS18B20呢?它又贵,测量范围也不是很宽。精度也不是很高。

使用特权

评论回复
7
paulful| | 2013-6-22 17:11 | 只看该作者
llqjmy 发表于 2013-6-21 23:22
我能问问:为什么你们这么喜欢用DS18B20呢?它又贵,测量范围也不是很宽。精度也不是很高。 ...

项目需求,以前也用过很多的温度传感器,觉得这个还是比较好一点。

使用特权

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

本版积分规则

7

主题

31

帖子

0

粉丝