找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4667|回复: 0
收起左侧

【求助】cvavr 不用1wire函数编写ds18b20读不出温度

[复制链接]
ID:46918 发表于 2012-12-1 23:56 | 显示全部楼层 |阅读模式

最近几天,一直在用cvavr编写ds18b20的程序,用protues进行仿真,一直没成功过,很纠结。读出来的数据不是ffff,就是37.6,刚刚读出个-123.9出来了,调ds18b20 的温度lcd显示也不变,估计是没有读出数据来,求高手指点迷津,下面是程序,麻烦大侠指出问题所在,希望有好心人分享下杰作(最好是通过仿真的)如果是分模块做的希望把模块中的子程序也附上,本人刚上手,很多东西都不是很熟,有的话发我邮箱非常感谢!

我是用头文件的形式把ds要用的函数嵌进主函数的,我用的是lcd显示,lcd程序也是没有调用函数,是自己编的,是ok的,现在问题就是读不出数据来

要说明的几点就是我在<dspredef.h>中已经定义好了端口:

#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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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