找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5283|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

【求助】cvavr 不用1wire函數(shù)編寫ds18b20讀不出溫度

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:46918 發(fā)表于 2012-12-1 23:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式

最近幾天,一直在用cvavr編寫ds18b20的程序,用protues進(jìn)行仿真,一直沒成功過,很糾結(jié)。讀出來的數(shù)據(jù)不是ffff,就是37.6,剛剛讀出個(gè)-123.9出來了,調(diào)ds18b20 的溫度lcd顯示也不變,估計(jì)是沒有讀出數(shù)據(jù)來,求高手指點(diǎn)迷津,下面是程序,麻煩大俠指出問題所在,希望有好心人分享下杰作(最好是通過仿真的)如果是分模塊做的希望把模塊中的子程序也附上,本人剛上手,很多東西都不是很熟,有的話發(fā)我郵箱非常感謝!

我是用頭文件的形式把ds要用的函數(shù)嵌進(jìn)主函數(shù)的,我用的是lcd顯示,lcd程序也是沒有調(diào)用函數(shù),是自己編的,是ok的,現(xiàn)在問題就是讀不出數(shù)據(jù)來

要說明的幾點(diǎn)就是我在<dspredef.h>中已經(jīng)定義好了端口:

#ifndef _dspredef_h_
#define _dspredef_h_

#include <mega16.h>

#include <delay.h>

//#define nop() #asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")
                   
            


#define uchar unsigned char
#define uint unsigned int

#define openlcd DDRC = 0xc0;DDRB = 0xff
#define lcden PORTC.6
#define lcdrs PORTC.7

#define outdsdq DDRA.7 = 1
#define indsdq DDRA.7 = 0
#define ds18dqw PORTA.7
#define ds18dqr PINA.7

 


#endif

上面的是定義文件

#ifndef _dsfun_h_
#define _dsfun_h_

#include <dspredef.h>

uchar numtable[] = "0123456789. -";
uchar tmpcode[6] = {0,0,0,0,0,0};

uchar dsreset()
{
    uchar a;
    outdsdq;
    ds18dqw = 0;
   
    #asm("cli")
    delay_us(500);
    #asm("sei")
   
    ds18dqw = 1;
    
    #asm("cli")
    delay_us(100);
    #asm("sei")
   
    indsdq;
    a = ds18dqr;
    a = ds18dqr;
   
    #asm("cli")
    delay_us(500);
    #asm("sei")
   
    return (a);
      
}

uchar dsread()
{
    uchar i,k = 0,buf;
    i = 8;
    while(i--)
    {  
        outdsdq;
        ds18dqw = 0;
       
        #asm("cli")
        delay_us(10);
        #asm("sei")
       
        ds18dqw = 1;
        indsdq;
        k >>= 1;
        buf = ds18dqr;
        buf = ds18dqr;
        if(buf)k |= 0x80;
       
        #asm("cli")
        delay_us(50);
        #asm("sei")
       
    }
    return (k);
}

void dswrite(uchar dat)
{
    uint j;
    outdsdq;
    for(j = 1;j <= 8;j++)
    {
        ds18dqw = 0;
       
        #asm("cli")
        delay_us(10);
        #asm("sei")
       
        if(dat & 0x01)
        {
            ds18dqw =1;
           
//            #asm("cli")
//            delay_us(45);
//            #asm("sei")
        }
//        else
//        {
//            ds18dqw = 0;
//           
//            #asm("cli")
//            delay_us(45);
//            #asm("sei")
//           
//            ds18dqw = 1;
//            
//            #asm("cli")
//            delay_us(35);
//            #asm("sei")
//        }
        #asm("cli")
        delay_us(100);
        #asm("sei")
        ds18dqw = 1;  
        dat >>= 1;
    }
}

void dschange()
{
    dsreset();
    dswrite(0xcc);
    dswrite(0x44);  
}

uint dstmp()
{
    uchar tmpl,tmph;
    uint tmp;
    dsreset();
    dswrite(0xcc);
    dswrite(0xbe);
    tmpl = dsread();
    tmph = dsread();
   
    tmp = tmpl;
    tmp <<= 8;
    tmp |= tmph;
   
    return (tmp);
   
       
}

void tmpdispose(uint t)
{  
    if(t <= 0x07ff)
    tmpcode[0] = numtable[11];
    else
    {
        tmpcode[0] = numtable[12];
        t = ~t +1;
    }
    t *= 0.625;
    tmpcode[1] = numtable[t / 1000];
    tmpcode[2] = numtable[(t % 1000) / 100];
    tmpcode[3] = numtable[(t % 100) / 10];
    tmpcode[4] = numtable[10];
    tmpcode[5] = numtable[t % 10];
}

#endif

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表