打印
[AVR单片机]

ds18b20读不出温度,跪求呀!!!

[复制链接]
3115|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oldnewma|  楼主 | 2013-7-30 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 oldnewma 于 2013-7-30 09:46 编辑

ds18b20 严格按时序走的,还用avr studio仿真过。时序都在要求的范围内,但是还是不出结果,调试好几天了。。真心跪求呀。。
环境是:iccavr  8M内部RC晶振
#include<iom16v.h>
#include<macros.h>  
#define uint unsigned int
#define DQ_IN DDRC&=~BIT(2)
#define DQ_OUT DDRC|=BIT(2)
#define DQ_SET PORTC|=BIT(2)
#define DQ_CLR PORTC&=~BIT(2)
#define DQ_R PINC&BIT(2)
uint table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};

void dely_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;++i)
  for(j=0;j<1000;++j);
}
void shuma(uint shuji,uint shuna) //数码管显示
{
DDRC|=BIT(6)|BIT(7);
DDRA=0xff;

PORTA=table[shuji];
PORTC|=BIT(6);
PORTC&=~BIT(6);

PORTA=~BIT(shuna);
PORTC|=BIT(7);
PORTC&=~BIT(7);
}
void delay_1us(void)                //1us延时函数
  {
  asm("nop");
  }

void delay_nus(unsigned int n)      //N us延时函数
  {
  unsigned int i=0;
  for (i=0;i<n;i++)
  delay_1us();
  }
  
void delay_1ms(void)                //1ms延时函数
  {
  unsigned int i;
  for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)      //N ms延时函数
  {
  unsigned int i=0;
  for (i=0;i<n;i++)
  delay_1ms();
  }
uint ds18b20_inital(void) //初始化
{
uint i,j;
DQ_OUT;
DQ_CLR;
//j=103;
//while(j>0) --j;
//DS18B20_us(480);
delay_nus(480);
DQ_SET;
delay_nus(100);
//j=30;
//while(j>0) --j;
//DS18B20_us(50);
DQ_IN;
i=DQ_R;
while(i==0x04);
//while(1) {shuma(9,5);}
return i;
}
void ds18b20_write_byte(uint value) //写位
{
uint i,j,temp;
DQ_OUT;
for(i=0;i<8;++i)
{

DQ_CLR;
//delay_nus(10);
j=6;
while(j>0) --j;
if((value&0x01))
   {
     DQ_SET;
    }else
        {         DQ_CLR;}
        //j=8;
        //while(j) --j;
        delay_nus(60);
     DQ_SET;
value=value>>1;
}
}
uint ds18b20_read_byte(void)//读取
{
uint i,value1=0,j;
for(i=0;i<8;i++)
{
value1=value1>>1;
DQ_OUT;
DQ_CLR;
j=6;
while(j>0) --j;
DQ_SET;
DQ_IN;
DQ_IN;
  if(DQ_R)
    value1|=0x80;

  j=80;
  while(j) --j;

}
return value1;

}
void main(void)
{
uint i,j,temp,j1,j2;

while(1)
{

   ds18b20_inital();
   ds18b20_write_byte(0xcc);
   ds18b20_write_byte(0x44);
   dely_ms(3);
   
   ds18b20_inital();
   ds18b20_write_byte(0xcc);
   ds18b20_write_byte(0xbe);
   i=ds18b20_read_byte();
   j=ds18b20_read_byte();

   temp=j*256+i;
   temp=temp*0.625;
   j1=temp/100;
   j=temp%100/10;
   j2=temp%100%10;
   for(i=0;i<20;++i)
   {
    shuma(j1,0);
        shuma(j2,2); //数据管显示
        shuma(j,1);
        shuma(10,1);        
   }
   
}
}

相关帖子

沙发
qin552011373| | 2013-7-30 18:02 | 只看该作者
我有程序  可以给你参考一下

使用特权

评论回复
板凳
qin552011373| | 2013-7-30 18:03 | 只看该作者
文件名:         DS18B20_config.h
内容描述:        DS18B20配置文件

使用特权

评论回复
地板
qin552011373| | 2013-7-30 18:03 | 只看该作者

#ifndef DS18B20_CONFIG_H_
#define DS18B20_CONFIG_H_

#define DS18B20_DDR DDRD
#define DS18B20_PORT PORTD
#define DS18B20_PIN PIND

#define DS18B20_DATA BIT5


#endif /* DS18B20_CONFIG_H_ */

使用特权

评论回复
5
qin552011373| | 2013-7-30 18:03 | 只看该作者
文件名:         DS18B20.h
内容描述:        DS18B20函数头文件

使用特权

评论回复
6
qin552011373| | 2013-7-30 18:03 | 只看该作者
#ifndef DS18B20_H_
#define DS18B20_H_

//函数原型声明
void DS18B20_Init(void);
void DS18B20_WriteOneByte(uint8 Data);
uint8 DS18B20_ReadOneByte(void);
void DS18B20_ReadTemperature(uint8 *u8_Temperature);

#endif /* DS18B20_H_ */

使用特权

评论回复
7
qin552011373| | 2013-7-30 18:04 | 只看该作者
文件名:         DS18B20.c
内容描述:        DS18B20函数

使用特权

评论回复
8
qin552011373| | 2013-7-30 18:04 | 只看该作者
#include "../../include.h"

#if EXTERNAL_MODULE_DS18B20_MODE !=0

void DS18B20_Init(void)
{
        SETBIT(DS18B20_DDR, DS18B20_DATA);
        CLRBIT(DS18B20_PORT, DS18B20_DATA);
        TARGET_Delayus(900, 0);
        SETBIT(DS18B20_PORT, DS18B20_DATA);
        CLRBIT(DS18B20_DDR, DS18B20_DATA);       
        TARGET_Delayus(480, 0);
        SETBIT(DS18B20_DDR, DS18B20_DATA);
}

void DS18B20_WriteOneByte(uint8 u8_Data)
{
        uint8 i,m;
       
        TARGET_CloseInterrupt();
        SETBIT(DS18B20_DDR, DS18B20_DATA);
        for(i = 0; i < 8; i++)
        {
                m = u8_Data & 0x01;
                if(m == 0x01)
                {
                        TARGET_Delayus(2, 0);
                        CLRBIT(DS18B20_PORT, DS18B20_DATA);
                        TARGET_Delayus(8, 0);
                        SETBIT(DS18B20_PORT, DS18B20_DATA);
                        TARGET_Delayus(85, 0);
                }
                else
                {
                        TARGET_Delayus(2, 0);
                        CLRBIT(DS18B20_PORT, DS18B20_DATA);
                        TARGET_Delayus(85, 0);
                        SETBIT(DS18B20_PORT, DS18B20_DATA);
                }
                u8_Data = u8_Data >> 1;
        }
        TARGET_OpenInterrupt();       
}

uint8 DS18B20_ReadOneByte(void)
{
        uint8 temp,k,n;
       
        TARGET_CloseInterrupt();
        temp = 0;
        for(n = 0; n < 8; n++)
        {
                SETBIT(DS18B20_DDR, DS18B20_DATA);
                CLRBIT(DS18B20_PORT, DS18B20_DATA);
                TARGET_Delayus(2, 0);
                SETBIT(DS18B20_PORT, DS18B20_DATA);
                CLRBIT(DS18B20_DDR, DS18B20_DATA);
                TARGET_Delayus(1, 0);
                k = DS18B20_PIN;     //读数据,从低位开始
                k &= DS18B20_DATA;
                if (k)
                {
                        temp |= (1 << n);
                }
                else
                {
                        temp &= ~(1 << n);
                }
                _delay_us(100);
                SETBIT(DS18B20_DDR, DS18B20_DATA);
                SETBIT(DS18B20_PORT, DS18B20_DATA);
        }
        TARGET_OpenInterrupt();       
        return temp;
}

void DS18B20_ReadTemperature( uint8 *u8_Temperature )
{
        uint8 teml, temh, temm, temh_d, teml_d, temm_d, count;
       
        DS18B20_Init();
        DS18B20_WriteOneByte(0xcc);
        DS18B20_WriteOneByte(0x44);
        TARGET_Delayms(200, 1);
        DS18B20_Init();
        DS18B20_WriteOneByte(0xcc);
        DS18B20_WriteOneByte(0xbe);
        teml = DS18B20_ReadOneByte();
        temh = DS18B20_ReadOneByte();
        temm = teml;
        temm &= 0x0F;
        teml >>= 4;
        temh <<= 4;
        count = teml | temh;
        temh_d = count / 10;
        temm_d = (temm * 6) / 10;
        teml_d = count % 10;
        u8_Temperature[0] = temh_d;
        u8_Temperature[1] = teml_d;
        u8_Temperature[2] = temm_d;
}

#endif

使用特权

评论回复
9
oldnewma|  楼主 | 2013-7-31 09:17 | 只看该作者
qin552011373 发表于 2013-7-30 18:02
我有程序  可以给你参考一下

k嗯嗯,多谢。。我看看。

使用特权

评论回复
10
qin552011373| | 2013-7-31 11:54 | 只看该作者
oldnewma 发表于 2013-7-31 09:17
k嗯嗯,多谢。。我看看。

调试成功的话及时结贴散分吧

使用特权

评论回复
11
minDragon| | 2013-7-31 16:52 | 只看该作者
先从DS18B20是否复位成功开始调试起吧~慢慢调试~仿真的时候你可以用仪表看下信号的波形~

使用特权

评论回复
12
ayb_ice| | 2013-8-1 08:09 | 只看该作者
百度一大堆

使用特权

评论回复
13
oldnewma|  楼主 | 2013-8-1 09:14 | 只看该作者
qin552011373 发表于 2013-7-31 11:54
调试成功的话及时结贴散分吧

没有 通。。。各种不通。。

使用特权

评论回复
14
oldnewma|  楼主 | 2013-8-1 09:15 | 只看该作者
minDragon 发表于 2013-7-31 16:52
先从DS18B20是否复位成功开始调试起吧~慢慢调试~仿真的时候你可以用仪表看下信号的波形~ ...

没有示波器。。只有万能表,郁闷中。

使用特权

评论回复
15
qin552011373| | 2013-8-1 09:18 | 只看该作者
oldnewma 发表于 2013-8-1 09:14
没有 通。。。各种不通。。

你的延时对不对   如果用我的程序还不通  九成的可能性是你的延时的问题  

使用特权

评论回复
16
oldnewma|  楼主 | 2013-8-1 09:59 | 只看该作者
qin552011373 发表于 2013-8-1 09:18
你的延时对不对   如果用我的程序还不通  九成的可能性是你的延时的问题   ...

我用的是avr转接板  接到51的开发板上的。延时 我用avr stdio 4调试的,调试延时都对的,就是不出对结果,现在超级无奈。

使用特权

评论回复
17
minDragon| | 2013-8-1 11:25 | 只看该作者
oldnewma 发表于 2013-8-1 09:15
没有示波器。。只有万能表,郁闷中。

proteus里面有虚拟仪器可以看波形的~左边Virtual Instruments Mode那里(或者你按下那些图标看看哪一个是)  第一个~你看下吧~

使用特权

评论回复
18
smckay| | 2013-8-1 16:12 | 只看该作者
oldnewma 发表于 2013-8-1 09:59
我用的是avr转接板  接到51的开发板上的。延时 我用avr stdio 4调试的,调试延时都对的,就是不出对结果 ...

你要看一下你的熔断丝FUSE设置的有没有问题,尤其是CLOCKDIV有没有设置分频,我以前遇到和你一样的问题,勾选了8分频,程序没错误,结果出了问题。。。。。

使用特权

评论回复
19
oldnewma|  楼主 | 2013-8-2 20:31 | 只看该作者
smckay 发表于 2013-8-1 16:12
你要看一下你的熔断丝FUSE设置的有没有问题,尤其是CLOCKDIV有没有设置分频,我以前遇到和你一样的问题, ...

没有找到你说的设置。能说清点不,万分感谢!

使用特权

评论回复
20
oldnewma|  楼主 | 2013-8-2 20:32 | 只看该作者
minDragon 发表于 2013-8-1 11:25
proteus里面有虚拟仪器可以看波形的~左边Virtual Instruments Mode那里(或者你按下那些图标看看哪一个是 ...

proteus没怎么用过。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

17

帖子

0

粉丝