搜索
bottom↓
回复: 1

马老师,您好!请帮我看看为什么读DS18B20的序列号全部为00?(附程序)

[复制链接]

出0入0汤圆

发表于 2007-8-12 11:14:27 | 显示全部楼层 |阅读模式
晶振:11.0592MHZ

#include <iom169.h>

#include <stdio.h>

#include <inavr.h>

#define uint unsigned int

#define uchar unsigned char

#define SETBIT(x,y) x |= (1 << y)

#define CLRBIT(x,y) x &= ~(1 << y)

#define enable485_senddata SETBIT(PORTF,3)

uchar adress_data[8];



/*************************************************************

函数功能:USART_senddata

应用范围:

入口参数:

出口参数:

*************************************************************/

void USART_senddata(void)

{

     uchar a;

     enable485_senddata;

     for(a=0;a<8;a++)

     {

         while(!(UCSR0A&0x20));

         UDR0 = adress_data[a];

         UCSR0A=UCSR0A&0x00;

      }

}



void MCU_initial(void)

{

    __enable_interrupt();//全局中断使能

    DDRA = 0xFF;

    DDRF = 0xF8;

    TCCR1A = 0;          //5us

    TCCR1B = 1;

    TCNT1 = 65480;

    TIMSK1 = 0;

    UBRR0H = 0x00;       //SCI initial

    UBRR0L = 0x47;       //set bouad 9600

    UCSR0B = 0x98;       //RXCIE=1,TXCIE=0

    UCSR0C = 0x06;

}

void timer1_delay(uint timer_delay)

{

    uint number;

    TCNT1 = 65480;//5us

    for(number = timer_delay;number > 0;number --)

    {

         while((TIFR1&0x01==0));

         CLRBIT(TIFR1,0);

         TCNT1 = 65480;

    }

}

/*************************************************************

函数功能: Initial

应用范围:

入口参数:

出口参数:

*************************************************************/

void Initial(void)

{

    DDRE=0x04;

    CLRBIT(PORTE,2);

    timer1_delay(100);//500us

    DDRE=0;

    SETBIT(PORTE,2);

    timer1_delay(10);//40us

    while((PINE&0x04)==0x04);

    timer1_delay(40);//200us

    while(PINE&0x04==0);

    timer1_delay(40);//200us

}

/*************************************************************

函数功能: Write

应用范围:

入口参数:

出口参数:

*************************************************************/

void Write(uchar write_data)

{

    uchar j;

    DDRE=DDRE|0x04;

    for(j=0;j<8;j++)

    {

        DDRE=DDRE|0x04;

        SETBIT(PORTE,2);

        nop;

        CLRBIT(PORTE,2);

        timer1_delay(2);//15us

        if(write_data%2==1)

        {SETBIT(PORTE,2);}

        else

        {CLRBIT(PORTE,2);}

        timer1_delay(10);//40us

        write_data=write_data>>1;

    }

}

/*************************************************************

函数功能: Read

应用范围:

入口参数:

出口参数:

*************************************************************/

uchar read(void)

{

    uchar i,a;

   a=0;

    for(i=0;i<8;i++)

    {

        DDRE=DDRE|0x04;

        SETBIT(PORTE,2);

        timer1_delay(1);//5us

        CLRBIT(PORTE,2);

        timer1_delay(1);//5us

        DDRE=DDRE&0xFB;

        SETBIT(PORTE,2);

        timer1_delay(2);//10us

        if(PINE&0x04==0x04)

        {a=a>>1;a=a+0x80;}

        else

        {a=a>>1;a=a+0x00;}

        timer1_delay(9);//45us

        SETBIT(PORTE,2);

        timer1_delay(1);//5us

    }

    return(a);

}



void main (void)

{

    uchar b;

    MCU_initial();

    for(;;)

    {

         Initial();//复位1820

         Write(0x33);//读ROM命令

         for(b=0;b<8;b++)

         {adress_data=read();}//读64位序列号

         USART_senddata();用串口将读出的数据发出去

    }

}

延时用的是定时器1做延时

上述程序运行的结果是第一次读出的序列号为8个FF,从第二次开始就是8个0

请问为什么?谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-8-12 16:04:08 | 显示全部楼层
建议你去找个CVAVR环境,使用CVAVR吧,那里有对18B20操作的函数和例子,省你不少时间。



你的水平使用其它的C有点吃力,因为你的基础没打好。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 23:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表