打印
[51单片机]

dis18b20的时序哪里写发错了?

[复制链接]
1944|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
源泉蒋|  楼主 | 2016-3-12 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请大家帮我看一下dis18b20的时序哪里写发错了?在数码管上只显示两位0,下面是程序:
#include<stc15f2k60s2.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define rst573 P2&=0x1f                //¹Ø±ÕÑ¡ÖÐ
#define smgY6C P2|=0xC0;//λѡͨ
#define smgY7C P2|=0xe0;//¶Îѡͨ
#define fengming P2|=0xa0;//Ñ¡ÖзäÃùÆ÷+¼ÌµçÆ÷

sbit dq=P1^4;
sbit Wr=P4^2;

code uchar  duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
                                                  // È«Ãð+ 1~8wei/*1011111
code uchar  wei[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};          //λÂë
uchar dspcom=6;
uchar k=0;
uint real_temp;
uchar flag;


void Delay60us(uint i)                //@11.0592MHz
{
        unsigned char j;
        j = 162;
        do
        {
                while (--j);
        } while (--i);
}

void Delay30us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        _nop_();
        i = 80;
        while (--i);
}
void delay(uint z)//msÑÓʱº¯Êý
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=1100;y>0;y--);
}

void CHS_BEEP_close()                  
{          Wr=0;
          fengming;//
          P0=0x0f;
          Wr=1;
}

void ds18b20_init()
{
   dq=1;
         _nop_();
         dq=0;
         Delay60us(10);
         dq=1;
         Delay60us(1);
       
}

void temperaturewrite_Byte(uchar dat)//д×Ö½Úº¯Êý
{
  uchar i,j;
        dq=1;
        for(i=1;i<=8;i++)
        {
        j=dat&0x01;
        dat>>=1;
  if(j)
          {
                dq=0;
                i++;i++;
                dq=1;
    Delay30us();
    }               
          else
           {
                   dq=0;
                         Delay30us();
                         dq=1;
                         _nop_();
     }
        }
}
bit temperatureread_bit()//¶Áһλ
{
         uint i;
   bit dat;
   dq=0;i++;i++;          //i++ ÆðÑÓʱ×÷ÓÃ
         Delay30us();
   dq=1;i++;i++;
   dat=dq;
   i=80;while(i>0)i--;
   return (dat);
}
uchar temperatureread_Byte()//¶Á×Ö½Úº¯Êý
  {
                uchar dat,i,j;
                dat=0;
                dq=0;
                i++;i++;
                for(i=1;i<=8;i++)
                {
       j=temperatureread_bit();
                        dat=(j<<7)|(dat>>1);
                       
    }   
                return(dat);
  }

        void display(uint x)
{
        uchar a,b;
        a=x/10;
        b=x%10;
        smgY7C;//¶Îѡͨ
        P0=0xff;//ÏûÒþ
        rst573;
       
  smgY6C;//λѡͨ
        P0=wei[7];
        rst573;

       
        smgY7C;
        P0=duan[a];
  rst573;       
        delay(1);
       
        smgY6C;//λѡͨ
        P0=wei[8];
        rst573;

        smgY7C;
        P0=duan[b];
  rst573;       
        delay(1);
       
       
}
       
        uint get_temperature()//»ñȡζÈÖµ
        {
                uchar h,l;
                uint temp;
               
                ds18b20_init();//Æô¶¯Î¶Èת»»
                temperaturewrite_Byte(0xcc);
                temperaturewrite_Byte(0x44);
               
                ds18b20_init();
                temperaturewrite_Byte(0xcc);
                temperaturewrite_Byte(0xbe);
                l=temperatureread_Byte();//¶ÁȡζȵÍ×Ö½Ú
                h=temperatureread_Byte();//¶Áȡζȸß×Ö½Ú
                temp=h;
                temp<<=8;
                temp=temp|l;
                real_temp=temp*0.0625;
                return(real_temp);
       
  }
        void timer_init()
        {
                TMOD=0x01;
                TH0=(65536-2000)/256;
                TL0=(65536-2000)/256;
                EA=1;//´ò¿ª×ÜÖжÏ
                ET0=1;
       
  }
       


        int main(void)
        {

                timer_init();
               
                while(1)
                { CHS_BEEP_close();                  //¹Ø±Õ·äÃùÆ÷¼ÌµçÆ÷
                       
      display(real_temp);
       if(flag)
                         {
                                 flag=0;
                                 real_temp=get_temperature();//¶ÁȡζÈ
       }
    }
  }
        void timer_0(void) interrupt 1 using 0
        {
    TH0=(65536-2000)/256;//ÒѾ­×Ô¶¯ÖØ×°³õÖµ
                TL0=(65536-2000)/256;
                if(++k==150)
                { k=0;//300msÖØлñȡζÈ
                        flag=1;
                       
    }
  }

相关帖子

沙发
ningling_21| | 2016-3-12 11:29 | 只看该作者
最简单的办法,用示波器测数据线波形,和18B20手册里的数据波形对比

使用特权

评论回复
板凳
源泉蒋|  楼主 | 2016-3-12 11:53 | 只看该作者
ningling_21 发表于 2016-3-12 11:29
最简单的办法,用示波器测数据线波形,和18B20手册里的数据波形对比

没有示波器啊

使用特权

评论回复
地板
ningling_21| | 2016-3-12 12:02 | 只看该作者

你的电路硬件有没有问题?

使用特权

评论回复
5
lisingch| | 2016-3-12 12:03 | 只看该作者
关键是时序,STC有个寄存器是分频的,你看看手册设置一下。

使用特权

评论回复
6
dirtwillfly| | 2016-3-12 21:38 | 只看该作者

有逻辑分析仪也行的,某宝卖30多元的就行

使用特权

评论回复
7
胡斯哲| | 2016-3-12 22:13 | 只看该作者
1,复位时   读响应没2读位的时候,拉低15us内就要采样3,最重要的就是延时是否正确

使用特权

评论回复
8
胡斯哲| | 2016-3-12 22:14 | 只看该作者
延时要精确点

使用特权

评论回复
9
15698208161| | 2016-3-13 12:30 | 只看该作者
没有示波器,可以用protues仿真,在仿真里面用虚拟示波器检测波形,很准的。不然你就好像瞎子一样,根本不知道哪里有问题。

使用特权

评论回复
10
星星ARM| | 2016-3-13 16:58 | 只看该作者
电路扑出来不然怎么给你说。。。

使用特权

评论回复
11
源泉蒋|  楼主 | 2016-4-7 20:25 | 只看该作者
ningling_21 发表于 2016-3-12 11:29
最简单的办法,用示波器测数据线波形,和18B20手册里的数据波形对比

谢谢

使用特权

评论回复
12
源泉蒋|  楼主 | 2016-4-7 20:26 | 只看该作者

找出问题了,是写字节的for语句括号括错了

使用特权

评论回复
13
源泉蒋|  楼主 | 2016-4-7 20:26 | 只看该作者
ningling_21 发表于 2016-3-12 12:02
你的电路硬件有没有问题?

已经好了,谢谢哈

使用特权

评论回复
14
源泉蒋|  楼主 | 2016-4-7 20:27 | 只看该作者
lisingch 发表于 2016-3-12 12:03
关键是时序,STC有个寄存器是分频的,你看看手册设置一下。

问题已经解决,谢谢各位

使用特权

评论回复
15
源泉蒋|  楼主 | 2016-4-7 20:28 | 只看该作者
星星ARM 发表于 2016-3-13 16:58
电路扑出来不然怎么给你说。。。

问题已经解决,谢谢各位

使用特权

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

本版积分规则

9

主题

34

帖子

0

粉丝