打印

各位430大神,帮帮小弟吧

[复制链接]
1932|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
430菜鸟|  楼主 | 2011-7-27 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我用430编写的18b20测温的程序,读出的错温度数据是恒为E01F 为什么啊?
#include "msp430X42X.h"
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define DQ_H P2DIR&=~BIT2
#define DQ_L P2DIR|=BIT2
#define DQ_0 P2OUT&=~BIT2
unsigned char temp1,temp2;
void writebit(unsigned char bit)
{
  DQ_H;
  DQ_L;
  DQ_0;
  delay_us(3);
  if(bit) DQ_H;
  else
  {
    DQ_L;
    DQ_0;
  }
  delay_us(60);
}
unsigned char readbit()
{
  char bit;
  DQ_H;
  DQ_L;
  DQ_0;
  delay_us(3);
  DQ_H;
  delay_us(3);
  if(P2IN&BIT2) bit=1;
  else bit=0;
  delay_us(60);
  return(bit);
}
void write_byte(unsigned char byte)
{
  int i;
  for(i=0;i<8;i++)
  {
     writebit(byte&0x01);
      byte=byte>>1;
      _NOP();
  }
}
unsigned char read_byte()
{
  int t;
  unsigned char ans=0;
  for(t=0;t<8;t++)
  {
    ans=ans<<1;
    ans|=readbit();
    _NOP();
  }
  return(ans);
}
int reset()
{
  int t;
  DQ_H;
  _NOP();
  _NOP();
  DQ_L;
  DQ_0;
  delay_us(500);
  DQ_H;
  delay_us(100);
  if((P2IN&BIT2)==0) t=1;
  else t=0;
  delay_us(480);
  return(t);
}
void main()
{
  WDTCTL=WDTPW+WDTHOLD;
  FLL_CTL0|=XCAP18PF;
  while(1)
  {
   while(!reset())
   {
   }
   write_byte(0xCC);
   write_byte(0x44);
   delay_us(5000);
   while(!reset())
   {
   }
   write_byte(0xCC);
   write_byte(0xBE);
   delay_us(500000);
   temp1=read_byte();
   temp2=read_byte();
  }
}

相关帖子

沙发
毅如靳往| | 2011-7-27 23:16 | 只看该作者
没用过430,不过可能是时序的问题,建议你好好看看芯片手册的读时序

使用特权

评论回复
板凳
430菜鸟|  楼主 | 2011-7-28 11:04 | 只看该作者
自己顶

使用特权

评论回复
地板
永远的不知| | 2011-7-28 18:11 | 只看该作者
1# 430菜鸟

您参考下这个代码吧,主要是把时序和流程弄清楚。

/****************************************Copyright (c)**************************************************
**                                   太原理工大学测控技术研究所
**                               新型传感器与智能控制教育部重点实验室   
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: ds18b20.c
**创   建   人: 贺 虎
**最后修改日期: 2005年12月12日
**描        述: 利用但总线DS18B20测温程序,并在LCD显示,取三位有效小数位。整数部分两位。共5位显示
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <msp430x44x.h>

#define SEGE 0X80
#define SEGH 0X40
#define SEGF 0X20
#define SEGC 0X10
#define SEGG 0X08
#define SEGD 0X04
#define SEGB 0X02
#define SEGA 0X01
const unsigned char digit[10] = {
  SEGA|SEGB|SEGC|SEGD|SEGE|SEGF,  /* "0" LCD segments a+b+c+d+e+f */
  0x12,  /* "1" */
  0x8F,  /* "2" */
  0x1F,  /* "3" */
  0x3A,  /* "4" */
  0x3D,  /* "5" */
  0xBD,  /* "6" */
  0x13,  /* "7" */
  0xBF,  /* "8" */
  0x3F   /* "9" */

};


#define DQ1 P4OUT|=BIT4
#define DQ0 P4OUT&=~BIT4

float   Temper=0.0;
int     temperature=0;
unsigned char Error = 0;
//----------------------------------
//功能:us 级别延时
// n=10,则延时10*5+6=56uS
//----------------------------------
void DelayNus(unsigned int n)
{
    while(n--){};
}
//-----------------------------------
//功能:写18B20
//-----------------------------------
void Write_18B20(unsigned char n)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ0;
        DelayNus(1);//延时13us 左右
        if((n&0X01)==0X01)  DQ1;
        else DQ0;
        n=n>>1;
        DelayNus(9);//延时50us 以上
        DQ1;
    }
}
//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void)
{
    unsigned char i;
    unsigned char temp;
    for(i=0;i<8;i++)
    {
        temp=temp>>1;
        DQ0;
        _NOP();//延时1us
        DQ1;
        _NOP();_NOP();//延时5us
        _NOP();_NOP();_NOP();
        P4DIR&=~BIT4;
        if((P4IN&BIT4)==0)
        {
            temp=temp&0x7F;
        }else
        {
            temp=temp|0x80;
        }
        DelayNus(7);//延时40us
        P4DIR|=BIT4;
        DQ1;
    }
    return    temp;
}
//-----------------------------------
void Init (void)
{
    DQ0;
    DelayNus(50);//延时500us
    DQ1;
    DelayNus(17);//延时90us
    P4DIR&=~BIT4;
    if((P4IN&BIT4)==BIT4)        //0001 1111b=1f
    {
        Error =1;    //失败1
        P4DIR|=BIT4;
    }else
    {
        Error = 0;//初始化成功
        P4DIR|=BIT4;
        DQ1;
    }
}
//----------------------------------
void Skip(void)
{
    Write_18B20(0xcc);
}
//----------------------------------
void Convert (void)
{
    Write_18B20(0x44);
}

//----------------------------------
void ReadDo (void)
{
    Write_18B20(0xbe);
}
//----------------------------------

void ReadTemp (void)
{
    char temp_low,temp_high; //温度值
    temp_low=Read_18B20(); //读低位
    temp_high=Read_18B20(); //读高位
    temperature=(temp_high&0x0f);
    temperature<<=8;
    temperature|=temp_low;
    Temper=temperature*0.0625;
}

void GetTemp(void){
        Init();
        Skip();
        Convert();
        DelayNus(60000);
        DelayNus(60000);
        DelayNus(60000);//延时1s以上
        Init();
        Skip();
        ReadDo();
        ReadTemp();
}

void InitLcd(void){
  LCDCTL = LCDON + LCD4MUX + LCDSG0_1;      // LCD on, 4-Mux, segments S0-S15
  BTCTL = BT_fLCD_DIV128;                   // LCD clock freq is ACLK/128
  P5SEL = 0xFC;                             // Select P5.2-7 as Com and Rxx
}
void display_number(unsigned long value, int start, int width)
{
    int i;
    for (i = 0;  i < width;  i++)
    {
        LCDMEM[7 + i - start] = digit[value%10]; // remainder = character in table to display
        value /= 10;
    }
}
void Lcd_Clr(void)
{
  volatile unsigned char i;
  for (i=0; i<7; i++)
  {
    LCDMEM = 0;
  }
}
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD; // 停狗
    P4DIR |=BIT4;
    DQ1;
    InitLcd();
    Lcd_Clr();

    while(1)
        {
            GetTemp();
            display_number((unsigned long int)(Temper*1000),7,5);
            LCDMEM[3] |= SEGH;
        }
}

使用特权

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

本版积分规则

1

主题

10

帖子

1

粉丝