显示的值总是00A0

[复制链接]
491|13
手机看帖
扫描二维码
随时随地手机跟帖
yinxiangh|  楼主 | 2017-12-17 16:09 | 显示全部楼层 |阅读模式
在psoc creator里写的读取ds18b20温度数据的程序,显示的值总是00A0,求帮忙看一下哪错了
pangb| | 2017-12-17 16:11 | 显示全部楼层

看什么呢

使用特权

评论回复
yinxiangh|  楼主 | 2017-12-17 16:16 | 显示全部楼层

#include <project.h>
#define uint unsigned int
uint temp; //定义整型的温度数据
float f_temp;

void delay(uint z)//延时
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void dsreset(void) //复位函数
{
        uint i;
        Pin_1_Write(0);
        i=103;
        while (i>0) i--;
        Pin_1_Write (1);
        i=4;
        while (i>0)i--;
}
int tempreadbit(void)//读一位数据
{
        uint i;
        int dat;
        Pin_1_Write(0);i++;
        Pin_1_Write(1);i++;i++;
        dat=Pin_1_Read();
        i=8;while(i>0)i--;
        return (dat);
}
uint tempread(void)//读一个字节
{
        uint i,j,dat;
        dat=0;
        for(i=1;i<=8;i++)
        {
                j=tempreadbit();
                dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在dat里
        }
        return (dat);
}


void tempwritebyte(uint dat)//向DS18B20写一个字节数据函数
{
        uint i;
        uint j;
        int testb;
        for(j=1;j<=8;j++)
        {
                testb=dat&0x01;
                dat=dat>>1;
                if(testb)  //写1
                {
                        Pin_1_Write(0);
                        i++;i++;
                        Pin_1_Write(1);
                        i=8;while(i>0)i--;
                }
                else
                {
                        Pin_1_Write(0); //写0
                        i=8;while(i>0)i--;
                        Pin_1_Write(1);
                        i++;i++;
                }
        }
}

void tempchange(void) //DS18B20开始获取温度并转换
{
        dsreset();
        delay(1);
        tempwritebyte(0xcc); //写跳过读ROM指令
        tempwritebyte(0x44); //写温度转换指令
}
uint get_temp()     //读取寄存器中存储的温度数据
{
        uint a,b;
        dsreset();
        delay(1);
        tempwritebyte(0xcc);
        tempwritebyte(0xbe);
        a=tempread();       //读低8位
        b=tempread();       //读高8位
        temp=b;
        temp<<=8;  //两个字节组合为一个字
        temp=temp|a;
        f_temp=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625
        temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
        f_temp=f_temp+0.05;
        return temp;    //temp是整型
}


int main()
{
        LCD_Start();
        LCD_PrintString("Temperature: ");
        while(1)
        {
     tempchange();
         LCD_Position(1u, 0u);
     LCD_PrintInt16(get_temp());
        }
}

使用特权

评论回复
chenjunt| | 2017-12-17 16:18 | 显示全部楼层

void tempchange(void) //DS18B20开始获取温度并转换
{
        dsreset();
        delay(1);
        tempwritebyte(0xcc); //写跳过读ROM指令
        tempwritebyte(0x44); //写温度转换指令
}
延时长点试试 2ms

使用特权

评论回复
ousj| | 2017-12-17 16:20 | 显示全部楼层
#include "ds18b20.h"


//t  = (ret*7+18)us
//2  = 32us
//5  = 52us
//10 = 87us
void Delay(int ret)         //ÑÓʱº¯Êý
{
    int i;
    for(i=0;i<ret;i++);
}

unsigned char Reset_DS18B20(void)
{
    unsigned char ret;
        DQ_IN;
        DQ_1;
   
    DQ_0;                  //¸´Î»Âö³å
    Delay(70);             //t>500us
    DQ_1;

    DQ_OUT;
    Delay(16);             //´æÔÚ¼ì²âµÍµçƽʱ¼ä£º60~240us   t>120us
   
        ret = PINB;

        if(ret & 0x20)
        {
             return 0x00;      //оƬ²»´æÔÚ»ò²»Õý³£¹¤×÷
        }
        else
        {
         Delay(50);        
             return 0x55;      //оƬ´æÔÚ
        }
}

void WR_One_Byte(unsigned char ret) //дһ¸ö×Ö½Ú
{
    unsigned char i;

    DQ_IN;
        DQ_1;
    for(i=0;i<8;i++)
    {
            DQ_0;
            Delay(0);                                   //15usÆðʼÐźÅ

        if(ret&0x01) DQ_1;        //Êý¾Ý
            Delay(4);
            
        DQ_1;  
        ret >>= 0x01;                          //1bit ½áÊø
                Delay(0);
    }
}

unsigned char RD_One_Byte(void ) //¶ÁÒ»×Ö½Ú
{
    unsigned char i,ret;
    ret=0;   
    for(i=0;i<8;i++)
    {
               DQ_IN;
            DQ_1;  

        DQ_0;                                //ÆðʼÐźÅ
            ret >>= 0x01;

        DQ_OUT;
            DQ_1;                     //ÊÍ·Å×ÜÏß

            if(PINB & 0x20) ret |= 0x80;
        Delay(5);                      //µÈ´ý¶ÁÒ»×Ö½Ú½áÊø
    }
    return ret;
}

void ST_Temp(void)
{
   if(Reset_DS18B20()==0x55)
   {
       Delay(300);              //Ô¼2ms
       WR_One_Byte(0xcc);       //Ìø¹ý64λROMµØÖ·
       WR_One_Byte(0x44);
   }
}
                                          
unsigned int RD_Temp(void)
{
   //float wendu;
   unsigned char TempL,TempH;
   unsigned int  Temp;

   if(Reset_DS18B20()==0x55)
   {
      Delay(300);                //Ô¼2ms

      WR_One_Byte(0xcc);
      WR_One_Byte(0xbe);

      TempL=RD_One_Byte();
      TempH=RD_One_Byte();

      Temp   = TempH;
      Temp <<= 0x08;
      Temp  |= TempL;

      if(Temp & 0xf000)
          {
              Temp   = 0;
          }
          return Temp;
      /*
          if(Temp & 0xf000)
          {
              Temp   = 0;
          }
          else
      {
              wendu  = Temp;
              wendu *= 0.0625;        //ζȶÁÈ¡
          Temp   = (unsigned int)wendu;
          //Temp   = (unsigned int)(wendu*10+0.5);
          }
      return Temp;*/
   }
   else
   {
      return 0;
   }
}

使用特权

评论回复
yinxiangh|  楼主 | 2017-12-17 16:23 | 显示全部楼层
谢谢,那个ds18b20.h文件在psoc creator里面好像没有,是自己写的吗?

使用特权

评论回复
morrisk| | 2017-12-17 16:24 | 显示全部楼层

是的,以前用AVR时写的

使用特权

评论回复
yinxiangh|  楼主 | 2017-12-17 16:26 | 显示全部楼层

我试过了,延长还是一样

使用特权

评论回复
zyf部长| | 2017-12-17 16:28 | 显示全部楼层

单总线上有上拉电阻吗?

使用特权

评论回复
xxmmi| | 2017-12-17 16:31 | 显示全部楼层
用示波器看看波形,延长时间一定要够长

使用特权

评论回复
yinxiangh|  楼主 | 2017-12-17 16:32 | 显示全部楼层

总线上有上拉电阻,用示波器看也只显示一小段矩形波,看不出有什么规律

使用特权

评论回复
yinxiangh|  楼主 | 2017-12-17 16:34 | 显示全部楼层
我参考了很多这种程序,上面那些代码也是按照书上的程序写的,结果读出的数据不变。

使用特权

评论回复
kangzj| | 2017-12-17 16:36 | 显示全部楼层

时序不对。示波器两两吧。

使用特权

评论回复
yinxiangh|  楼主 | 2017-12-17 16:39 | 显示全部楼层

嗯,我看下啊

使用特权

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

本版积分规则

723

主题

7134

帖子

2

粉丝