搜索
bottom↓
回复: 6

求助 cvavr 编程的ds18b20在protues中不能成功读取温度值

[复制链接]

出0入0汤圆

发表于 2012-12-2 01:41:10 | 显示全部楼层 |阅读模式
本帖最后由 xuan12321 于 2012-12-2 01:42 编辑

刚开始用cvavr,很多都不怎么会弄,我的程序没有调用库里带的1wire函数,改了n久,就出现fff.f 、37.6、 -000.0,我调ds18b20 温度时,它们都不动的,估计是没有成功读数据来。这个问题纠结死我了,我把我的程序贴上来,求高人指点,有好心人事以前编过的话,希望能提供些参考程序(最好是能仿真的)最近在网上搜了很多程序,都是仿真不过的(端口我都是按照我的原理图从新设置的),这使我更纠结。
我用51单片机,用keil软件按时序图编过ds18b20 的程序,在protues中也仿真成功了,我下面的程序主要是根据那个程序,用cvavr编写的,求大侠指点迷津,小弟在此先谢过啦~
/***************************************************************************
我先给出我的端口定义的头文件,ds18b20函数我也是写在头文件里的。在定义头文件的下面
****************************************************************************/
#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

/********************************************************************************************************************
下面就会我编的ds18b20的函数,帮我看看是哪里出现的问题,这个程序仿真是,lcd一直显示的是037.6(我设置的是4位显示所以前面有个0);
*********************************************************************************************************************/


#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

/************************************主函数是****************************/
#include <dspredef.h>
#include <lcdfun.h>
#include <dsfun.h>

void main()
{
    lcdinit();

    while(1)
    {
        dschange();
        delay_ms(750);
        tmpdispose(dstmp());
        lcddiss(0,1,6,tmpcode);
    }
}
/*******************************显示函数式ok的,些的不好也不难出来献丑了***************求大侠帮我看看,有什么好的建议或者是好的参考程序可以发到我的邮箱里,我的邮箱是xuanfengdanxin_002@163.com******/

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-12-2 01:43:41 | 显示全部楼层
求大侠关注,求高人指点

出0入0汤圆

 楼主| 发表于 2012-12-2 11:54:59 | 显示全部楼层
求人指点,给点意见吧

出0入0汤圆

 楼主| 发表于 2012-12-4 20:07:04 | 显示全部楼层
咋就没人来呢,来了就留点痕迹啦,说不定能引起高手的关注的,

出0入0汤圆

发表于 2012-12-12 16:37:43 | 显示全部楼层
CVAVR没用过。ICC的程序我倒是有

出0入0汤圆

 楼主| 发表于 2012-12-12 23:06:44 | 显示全部楼层
哦,有仿真图和源程序么,有的话发到我邮箱里咯,164148250@qq.com先谢过啦,我现在遇到的问题是,我通过下面的延时程序:
void delayus(uchar xus)
{
    uchar a,b;
    for(b = xus;b > 0;b--)
        for(a = 5;a > 0;a--);            
}

void delay1ms()
{
    uchar a,b,c;
    for(c = 17;c > 0;c--)
        for(b = 134;b > 0;b--)
            for(a = 2;a > 0;a--);
}

void delayms(uint xms)
{
    uint i;
    for(i = 0;i < xms;i++)
        delay1ms();
}
我用的16M的晶振,按照ds18b20的时序进行仿真,结果在protues开始仿真的时候,感觉速度好慢,整个程序一个都没用超过两秒的延迟,结果,过了30多秒才开始读到数据,是不是在protues要调什么东西,让它和实物的运行时间一致啊?

出0入0汤圆

 楼主| 发表于 2012-12-12 23:16:36 | 显示全部楼层
我今天用下面程序调试了还是没结果
#include <mega16.h>

#define uchar unsigned char
#define uint unsigned int

/*******************lcd define*************/
#define lcdopen DDRB = 0xff;DDRC = 0xc0
#define lcden PORTC.6
#define lcdrs PORTC.7

/*******************DS18B20 define **********************/
#define dqout DDRA.7 = 1
#define dqin DDRA.7 = 0
#define dqset PORTA.7 = 1
#define dqcli PORTA.7 = 0
#define dq PINA.7  

/*****************variable define************************/

uchar numtable[] = "0123456789.+-";
uchar table1[]="hello20121212!";
uchar table2[]="temperature:";
uchar temperature[]={0,0,0,0,0,0};
/*****************delay function*****************/
void delayus(uchar xus)
{
     uchar a,b;
     for(b = xus;b > 0;b--)
         for(a = 5;a > 0;a--);            
}

void delay1ms()
{
     uchar a,b,c;
     for(c = 17;c > 0;c--)
         for(b = 134;b > 0;b--)
             for(a = 2;a > 0;a--);
}

void delayms(uint xms)
{
     uint i;
     for(i = 0;i < xms;i++)
         delay1ms();
}

/*****************lcd function******************/
void lcdwritedat(uchar rs,uchar dat)
{
     lcdrs = rs;
     PORTB = dat;
     delayus(16);
     lcden = 1;
     lcden = 0;
     if(!rs)delayus(16);
}

void lcdinit()
{
     delayms(40);
     lcdopen;
     lcdwritedat(0,0x38);
     lcdwritedat(0,0x01);
     lcdwritedat(0,0x06);
     lcdwritedat(0,0x0c);
}

void lcddis(uchar line,uchar addr,uchar digit,uchar *dat)
{
     uchar linecode,i;
     switch(line)
     {
     case 1:linecode = 0x00;break;
     case 2:linecode = 0x40;break;
     case 3:linecode = 0x14;break;
     case 4:linecode = 0x54;break;
     }
     lcdwritedat(0,0x80+addr+linecode);
     for(i = 0;i < digit;i++)
     lcdwritedat(1,dat[i]);
}
/**********************************DS18B20 function********************/
void dsinit()
{
     dqout;
     dqcli;
     delayus(480);
     dqset;
     
    delayus(480);  
}
uchar dsread()
{
     uchar i,k = 0;
     for(i = 8;i > 0;i--)
     {   
         dqout;
         dqcli;
         delayus(1);
         dqset;
         dqin;
         k >>= 1;
         if(dq)k |= 0x80;
         delayus(60);
     }
     return (k);
}

void dswrite(uchar dat)
{
     uchar i;
     dqout;
     for(i = 0;i < 8;i++)
     {
         dqcli;
         delayus(1);
         if(dat & 0x01)
         {
             dqset;
             delayus(60);
         }  
         else
         {
             dqcli;
             delayus(60);
             dqset;
             delayus(2);
         }
         dat >>= 1;
     }
         
}

void dschange()
{
     dsinit();

    dswrite(0xcc);
     dswrite(0x44);
}

void dstmp()
{
     uchar tmpl = 0,tmph = 0;
     uint t = 0;
     dsinit();

    dswrite(0xcc);
     dswrite(0xbe);
     tmpl = dsread();
     tmph = dsread();
     
    t = tmph;
     t <<= 8;
     t += tmpl;
     
    if(t <=0x7ff)
     temperature[0] = numtable[11];
     else
     {
         temperature[0] = numtable[12];
         t = ~t+1;
     }
     t *= 0.625;
     temperature[1] = numtable[t/1000];
     temperature[2] = numtable[(t % 1000)/100];
     temperature[3] = numtable[(t % 100)/10];
     temperature[4] = numtable[10];
     temperature[5] = numtable[t % 10];
     
   
}

//void displayt(uchar line,uchar address,uint t)
//{        
//        t *= 0.625;
//        lcdwritedat(0,0x80+(line-1)*0x40 +address);
//        if(tflag == 1)
//        lcdwritedat(1,'-');
//        else lcdwritedat(1,' ');
//
//        lcdwritedat(1,numtable[t / 1000]);
//        lcdwritedat(1,numtable[(t % 1000)/100]);
//        lcdwritedat(1,numtable[(t%100)/10]);
//        lcdwritedat(1,'.');
//        lcdwritedat(1,numtable[t%10]);
//}

void main()
{
     lcdinit();
     lcddis(1,0,14,table1);
     lcddis(2,0,12,table2);
     
   
    while(1)
     {
         dschange();
         delayms(750);
         dstmp();
         
         lcddis(3,0,6,temperature);
     }
}
得到的显示的数据时-000.0,估计是没读到真实数据。求高手点解~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 16:15

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

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