mcu131368 发表于 2010-4-18 13:15:25

新手请教关于DS18B20+1602的问题,请兄弟们看看

有兄弟写过DS18B20+1602的程序吗?大家帮我看看有啥问题,昨晚显示温度为25.5度,今天怎么还是显示为25.5度呢
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit DQ=P2^2;
uchar dates[]={0,0,0};       

uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
   for(y=110;y>0;y--);

}


void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;

}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;

}

void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);

}


void delay_us(uchar x)                       //延时 x * 1.084 + 2.73 us
{
        while(--x);
}



void delay_ms(uint z)                          //延时任意ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=240;y>0;y--);
}



void DS18B20_init()
{
        DQ = 1;                                                //拉高数据总线线
        _nop_();                                       //延时1us
        DQ = 0;                                               //拉低数据总线       
        delay_us(250);                                //延时273us
        delay_us(250);                                //延时273us
        DQ = 1;                                               //释放总线       
        delay_us(75);                               //延时84us,等待DS18B2发存在信号
        delay_us(210);                                 //延时230us
        DQ = 1;                                                  //释放总线
}


void DS18B20_write_byte(uchar temp)
{
        uchar i;
        ACC = temp;
        for(i=8;i>0;i--)
        {
                DQ = 0;
                delay_us(12);                        //延时15.73us
                DQ = ACC0;
                ACC>>=1;
                delay_us(40);                        //延时46us
                DQ = 1;
                _nop_();       
        }
}

uchar DS18B20_read_byte()
{
        uchar i;
        for(i=8;i>0;i--)
        {
                ACC>>=1;
                DQ = 0;
                delay_us(8);                        //延时11.4us
                DQ = 1;
                _nop_();
                ACC7 = DQ;
                delay_us(45);                         //延时51.5us
                DQ = 1;
        }
        return ACC;       
}


uint DS18B20_read()
{
        uchar wh,wl;
        uint temp;
        float t;
        DS18B20_init();                                //复位信号
        DS18B20_write_byte(0xcc);        //跳过ROM命令
        DS18B20_write_byte(0x44);        //执行温度转换命令
        delay_ms(1);                                //等待温度转换
        DS18B20_init();                                //复位信号
        DS18B20_write_byte(0xcc);        //跳过ROM命令
        DS18B20_write_byte(0xbe);        //读暂存器命令
        wl = DS18B20_read_byte();        //读温度的低字节
        wh = DS18B20_read_byte();        //读温度的高字节
        _nop_();
           temp = wh;
        temp<<=8;
        temp|=wl;
    t = temp*0.0625;
    temp = t*10+0.5;
        return temp;
}



void dealvel(uint v)
{
   dates        =v/100;
   dates        =v%100/10;
   dates=v%10;

}

void main()
{ uchar t;
init();
        while(1)
   {
    t=DS18B20_read();
        dealvel(t)        ;
        write_com(0x80+0x45);
    write_date(dates+0x30);
        write_com(0x80+0x46);
    write_date(dates+0x30);
        write_com(0x80+0x47);
    write_date(dates+0x30);

       //delay(2);
   }       
}
请大家帮我看一下啊,程序运行没问题,就是显示数值一直不变呢,昨晚搞了一晚上,也没搞明白

mcu131368 发表于 2010-4-19 17:51:49

咋没人理我?

lixupeng 发表于 2011-1-9 23:13:06

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4158711&bbs_page_no=1&search_mode=1&search_text=DS18b20&bbs_id=1006

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1593236&bbs_page_no=1&search_mode=1&search_text=DS18b20&bbs_id=1006

shenrongze 发表于 2011-1-10 00:38:56

应该是你读取/写入温度数据的延时不对吧,要注意ds18b20的时序
这个比较简洁
void wr_ds18b20(uchar com)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                ds18b20_dq=0;
                ds18b20_dq=com&0x01;
                delay(5);
                ds18b20_dq=1;
                com=com>>1;
        }
}
uchar rd_ds18b20(void)
{
        uchar i,com;
        for(i=0;i<8;i++)
        {
                ds18b20_dq=0;
                com=com>>1;
                ds18b20_dq=1;
                if(ds18b20_dq)
                        com=com|0x80;
                delay(4);
        }
        return com;
}

liu_595 发表于 2011-1-10 15:30:43

可能坏了!!
呵呵

653833564 发表于 2012-10-19 16:37:47

{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}

692446 发表于 2012-12-8 21:22:06

{:sweat:}{:funk:}{:funk:}{:funk:}

liudaolunhui 发表于 2012-12-9 03:49:03

上两张截图来看看!!!!
页: [1]
查看完整版本: 新手请教关于DS18B20+1602的问题,请兄弟们看看