打印

新手求教:Ds18b20的测温程序

[复制链接]
3931|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mr.Darcy|  楼主 | 2012-8-15 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚刚用C语言编写了一个测温程序,竟然不能用,帮忙分析一下!谢谢了。程序中温度的上限、下限没有涉及。
#include<reg51.h> //51单片机
sbit DQ=P3^7;
sbit ls138A=P2^2; //数码管的位选 是通过74138实现的。
sbit ls138B=P2^3;
sbit ls138C=P2^4;
#define ucha unsigned char
#define uint unsigned int
uint i,num;
ucha table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77
};
ucha aa;
void delay(uint m)//延时程序
{
        while(m--);
}
void init_ds18b20()//初始化
{
  ucha x;
  DQ=0;
  delay(80);
  DQ=1;
  delay(10);
  x=DQ;
  delay(5);
}
ucha read_ds18b20()//读一个字节
{
        ucha i,shuju=0;
        for(i=8;i>0;i--)
             {
                 DQ=0;
                 delay(1);
                 shuju>>=1;
                 DQ=1;
                 delay(10);
                 if(DQ==1)
                 {
                        shuju|=0x80;
                 }
                 delay(6);
             }
             return(shuju);
}
void write_ds18b20(ucha shuju)//写一个字节
{
        ucha i;
        for(i=8;i>0;i--)
        {
                DQ=0;
                delay(1);
                DQ=shuju&0x01;
                delay(5);
                DQ=1;
                shuju>>=1;
        }
        delay(5);
}
uint Get_temp()//读取温度
{
        uint a,b;
        init_ds18b20();
        write_ds18b20(0xcc);
        write_ds18b20(0x44);
        delay(20);
        init_ds18b20();
        write_ds18b20(0xcc);
        write_ds18b20(0xBE);
        a=read_ds18b20();//低 8 wei
        b=read_ds18b20();//高 8 wei
        if(b&0xf8)
        {
        b<<=8;
        b=a|b;
        b=~b+1;
        num=b*0.0625*100;
        }
        else
        {
         b<<=8;
         b=a|b;
         num=b*0.0625*100;
        }
        return(num);
}
void display(uint c)//数码管显示
{
        ucha bai,shi,ge,shifen,baifen;
        bai=c/10000;
        shi=c/1000%10;
        ge=c/100%10;
        shifen=c/10%10;
        baifen=c%10;
        ls138A=0;ls138B=0;ls138C=0;
        P0=table[bai];
        ls138A=0;ls138B=0;ls138C=1;
        P0=table[shi];
        ls138A=0;ls138B=1;ls138C=0;
        P0=table[ge];
        ls138A=0;ls138B=1;ls138C=1;
        P0=table[shifen];
        ls138A=1;ls138B=0;ls138C=0;
        P0=table[baifen];
}
void main()
{
        while(1)
        {
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        display(Get_temp());
        }

}
void exter0() interrupt 1//每一秒更新一次温度
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;
        if(aa==20)
        {
               aa=0;
               
        }
}

相关帖子

沙发
Mr.Darcy|  楼主 | 2012-8-15 18:00 | 只看该作者
帮忙看一下问题到底出在哪里!!who can help me?

使用特权

评论回复
板凳
NE5532| | 2012-8-15 19:47 | 只看该作者
无人能帮,自己先把1-W的到线应答调通,程序不是你这样写的,写到这个份上才来调试,我就该崇拜你了。

使用特权

评论回复
地板
Mr.Darcy|  楼主 | 2012-8-15 21:51 | 只看该作者
第一次写这种传感器的程序。。。

使用特权

评论回复
5
NE5532| | 2012-8-15 22:01 | 只看该作者
18B20数据手册里面关于时序的部分看了没有?到线应答有没有映像了?

使用特权

评论回复
6
Mr.Darcy|  楼主 | 2012-8-15 22:06 | 只看该作者
时序部分看过了,到线应答、映像 ,不懂。

使用特权

评论回复
7
NE5532| | 2012-8-15 22:24 | 只看该作者
就是把复位和复位以后读串号的部分先调通。

使用特权

评论回复
8
yjhon| | 2012-8-15 23:05 | 只看该作者
他意思是不是先把读数写数之类的基本问题搞定?18b20真没用过

使用特权

评论回复
9
huzaizai007| | 2012-8-16 09:06 | 只看该作者
能读出序列号不?

使用特权

评论回复
10
我是土匪| | 2012-8-16 09:27 | 只看该作者
DS18B20有极其严格的时序。

使用特权

评论回复
11
Mr.Darcy|  楼主 | 2012-8-16 10:17 | 只看该作者
怎么才算调通呢?调通后有什么现象或结果。

使用特权

评论回复
12
Mr.Darcy|  楼主 | 2012-8-16 10:18 | 只看该作者
To9 楼:
        都是跳过Rom,好像不读序列号了。。

使用特权

评论回复
13
NE5532| | 2012-8-16 10:54 | 只看该作者
怎么才算调通呢?调通后有什么现象或结果。
Mr.Darcy 发表于 2012-8-16 10:17


你看了协议还提这种问题,说明协议等于没看,请重新看协议部分。

使用特权

评论回复
14
雷影少年| | 2012-8-16 11:18 | 只看该作者
本帖最后由 雷影少年 于 2012-8-16 11:50 编辑

看时序图,根据时序图写18B20初始化、读、写程序,等这些都能正常通过后才写下一步的程序,要不会悲剧死的,写程序的时候最关键的是时序,时序正确的话就容易多了

使用特权

评论回复
15
雷影少年| | 2012-8-16 11:46 | 只看该作者
To9 楼:
        都是跳过Rom,好像不读序列号了。。
Mr.Darcy 发表于 2012-8-16 10:18

只有一个18B20没必要读序列号啊~

使用特权

评论回复
16
雷影少年| | 2012-8-16 11:49 | 只看该作者
怎么才算调通呢?调通后有什么现象或结果。
Mr.Darcy 发表于 2012-8-16 10:17

我是直接用PROTEUS仿真的,在单片机上接个bcd的数码管,直接显示读出的数据,能够显示数就是接通了,显示不出就是没接通~

使用特权

评论回复
17
linqing171| | 2012-8-16 12:34 | 只看该作者
不读序列号,怎么证明你和他通信上了?

使用特权

评论回复
18
ocon| | 2012-8-16 12:57 | 只看该作者
这程序看上去像抄来的,建议对照18b20的数据手册,看懂程序流程再调试。

使用特权

评论回复
19
huzaizai007| | 2012-8-16 13:16 | 只看该作者
我一般都是先读芯片序列号,看看通信正常不
序列号读不对,用示波器对照芯片手册看时序
时序也对,那就是硬件问题了

使用特权

评论回复
20
ieexplorer| | 2012-8-16 13:54 | 只看该作者
所以说,迫不得已,别用这种一线制的器件。

使用特权

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

本版积分规则

0

主题

119

帖子

0

粉丝