搜索
bottom↓
回复: 9

DS18B20问题

[复制链接]

出0入0汤圆

发表于 2012-9-4 21:05:56 | 显示全部楼层 |阅读模式
我是单片机新手,昨天开始编写DS18B20的驱动程序,现在碰到一点问题,希望高手指导一二!!

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-9-4 21:08:01 | 显示全部楼层
恩?为什么不能发程序??

出0入0汤圆

 楼主| 发表于 2012-9-4 21:10:48 | 显示全部楼层
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.5a Evaluation
Automatic Program Generator
?Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2012/9/4 星期二
Author  : Freeware, for evaluation and
non-commercial use only
Company :
Comments:


Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 4.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/
#include <mega16.h>
#include <alcd.h>
#include <delay.h>
#define DQ_18b20 0x01  //设置PDx口为数据总线接口
#define DQ_0() (DDRD.0=1)//数据总线拉低(占领总线)
#define DQ_1() (DDRD.0=0)//数据总线拉高(释放总线)
#define DQ_readbit PIND.0//读取数据总线上1bit的数据
/*************************** 将18b20与默认数据总线相连***************************/
void connect_18b20(void)
{
    DDRD.0=0; //将PDx口设置成输入模式
    PORTD.0=0;//上拉电阻设置无效
}
/****************************************************************************************/
/********************复位总线,检测有无芯片连接总线****************************/
unsigned char ds18b20_reset(void)
{
    unsigned char  judge_18b20;
     #asm("cli"); //关中断防干扰
    DQ_0(); //占领总线
     delay_us(500);//防止信号抖动(最短480us的低电平信号)
     DQ_1();//释放总线
     delay_us(68);//忙延时
     if( DQ_readbit)
            judge_18b20=0;//DS1820若不发出低电平脉冲则视作该线路上没有芯片安装
     else
            judge_18b20=1;//反之则检测到18b20安装
     #asm("sei");//开中断
     delay_us(440);//保证数据总线被释放
     return(judge_18b20);   
}
/****************************************************************************************/
/****************************写命令至DS18B20****************************************/
void ds18b20_write(unsigned char command)
{
        unsigned char count;//定义计数变量
       #asm("cli");//关中断
        for(count=0;count<8;count++)//一共写八位命令
        {
                DQ_0();//输入低电平信号
                delay_us(8);//在15us内输入信号
                if(command&0x01)
                        DQ_1();//高平为1,低平为0
                command>>=1;//为下一次写命令移位
                delay_us(62);
                DQ_1();//恢复高平            
        }
        #asm("sei");//开中断   
}
/****************************************************************************************/
/*********************************从DS18B20读命令***********************************/
unsigned char ds18b20_read(void)
{
        unsigned char data=0x00,count;//定义读数据变量,计数变量  
        #asm("cli");//关中断
        for(count=0;count<8;count++)
        {
                DQ_0();//拉低电平
                delay_us(2);//保证在15us前拉高
                DQ_1();//进入读数据状态
                data>>=1;//移位写下一个数据
                if(DQ_readbit)
                    data|=0x80;//若为1则写入最高位
                delay_us(65);
        }
        #asm("sei");//恢复中断
        return(data);        
}
/****************************************************************************************/
/*********************************读温度函数******************************************/
unsigned char temp_read(void)
{
        unsigned char t=0;//定义温度变量t
        if(ds18b20_reset())//如果初始化成功
        {
                ds18b20_write(0xcc);//跳过序列号识别
                ds18b20_write(0x44);//启动温度转换
                delay_us(100);
                ds18b20_reset();//初始化
                ds18b20_write(0xcc);//跳过序列号识别
                ds18b20_write(0xbe);//读暂存器
                delay_us(100);
                t=ds18b20_read();//读低字节
                t+=(ds18b20_read())<<8;
        }
        return (t);
}
/****************************************************************************************/

void main(void)
{
unsigned char temparature=0x00,display[16];
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;

UCSRB=0x00;

ACSR=0x80;
SFIOR=0x00;


ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;

lcd_init(16);
connect_18b20();//将PD0与总线相连
while (1)
      {
            unsigned char i  ;
            unsigned char test;
            test=ds18b20_reset()+48;
            temparature=temp_read() ;
            for(i=0;i<12;i++)
            {
                    if(temparature&0x01)
                    display=49;
                    else
                    display=48;
                    temparature>>=1;
            }
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts(display);
            lcd_gotoxy(0,1);
            lcd_putchar(test);
            lcd_gotoxy(1,1);
            delay_ms(500);
      }
}

出0入0汤圆

 楼主| 发表于 2012-9-4 21:12:35 | 显示全部楼层
用的是单线窃电的模式,在PD0口上拉一250的电阻接5V电源,但是在LCD上显示均为0,调了很久也不行,不知道哪里出问题啊,现在挺着急!!
希望高手能够指点一二!

出0入442汤圆

发表于 2012-9-4 21:27:05 | 显示全部楼层
很简单,循环的延时问题。1-Wire对时序要求非常严格,必须完全按时序来。

出0入0汤圆

 楼主| 发表于 2012-9-4 21:35:06 | 显示全部楼层
wye11083 发表于 2012-9-4 21:27
很简单,循环的延时问题。1-Wire对时序要求非常严格,必须完全按时序来。

我猜想也是时序问题,但是根据datasheet上的时序来做还是不行啊,调了很多次多不行

出0入442汤圆

发表于 2012-9-4 21:40:47 | 显示全部楼层
坛里有人测试过,那种延时1us都直接上5us了,非常不稳定。不要用。

出0入0汤圆

 楼主| 发表于 2012-9-4 21:44:27 | 显示全部楼层
wye11083 发表于 2012-9-4 21:40
坛里有人测试过,那种延时1us都直接上5us了,非常不稳定。不要用。

那延时最好用什么做比较好?

出0入442汤圆

发表于 2012-9-4 22:26:16 | 显示全部楼层
你先试验再说吧。总能找到方法。

出0入0汤圆

 楼主| 发表于 2012-9-9 17:23:31 | 显示全部楼层
wye11083 发表于 2012-9-4 22:26
你先试验再说吧。总能找到方法。

我找到问题的原因了,是因为我之前在protues里的时钟设定问题,用示波器测出来的,以后不能再犯这种低级错误了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 09:24

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

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