单片机/MCU论坛
直播中

张扬

5年用户 7经验值
私信 关注
[问答]

温度传感器DS18B20在MSP430F5529单片机上工作程序,运行没问题但是没有反应?

以下是我的程序,我使用了LED绿灯(4.7)检测程序运行情况,结果灯根本没亮,程序卡在了第一个初始化函数中??还有,我对F5529的时钟频率设置不太了解,所以延时函数延迟的时间不知道该怎么计算,延时函数的参数都是从网上参考来的,但是参考时钟没有进行设置,这样会不会有影响?

#include
#define PD P6DIR|=BIT0
#define PO P6OUT|=BIT0
#define P_D P6DIR&=~BIT0
#define P_O P6OUT&=~BIT0
#define PIR P6IN&BIT0

int error;
int n;
int j;
int i;
unsigned int temp=0;
unsigned char temp_low;
unsigned char temp_high;
unsigned int T=0;
float ssd = 0;
int TC =0;

int tiNIT(void)
{
        _DINT();
        //一个时钟周期为0.04us(25MHz)??不确定!此处存疑
        PD;
        PO;
        __delay_cycles(8);//延时
        P_O;
        __delay_cycles(4000);//
        P_D; //方向改为输入
        PO;
        __delay_cycles(320);
        if(PIR==1)
        {
                error=1;//初始化错误
                P1DIR|=BIT0;
                P1OUT|=BIT0; //LED红灯提示初始化错误
        }
        else
        {
                error=0;
                __delay_cycles(1120);
                PD;
                PO;
        }
        _EINT();
        return error;
}

void Write(char unsigned Bdata)
{
        _DINT();
        for(i=0;i<8;i++)
        {
                P_O;
                __delay_cycles(375);
                if(Bdata&0x01) PO;//如果二进制这一位是1,那么输出高电平,换言之告诉传感器,这一位是1
                else P_O;//如果二进制这一位是0,那么输出低电平,换言之告诉传感器,这一位是0
                __delay_cycles(1125);//45us
                PO;
                Bdata >>= 1;
                //__delay_cycles(250); //延时10us(百度上说这一步不需要,看情况)
        }
        _EINT();
}

unsigned char READ(void)//数据读取,一个字节
{
        unsigned char mid=0;
        _DINT();
        for(j=0;j<8;j++)
        {
                mid>>=1;
                P_O;
                __delay_cycles(75);
                PO;
                __delay_cycles(125);
                P_D;//改端口方向为接收数据
                if(PIR)
                        mid|=0x80;//如果温度传感器传回来是高电平(或者1),那么mid(二进制)最高位先置为1.
                PD;//改方向为输出
                __delay_cycles(1500);
        }
        _EINT();
        return mid;
}

void Skip(void)
{
  Write(0XCC);
}

void Convert(void)
{
  Write(0x44);
}

void Read_SP(void)
{
  Write(0xbe);
}

unsigned int ReadTemp(void)
{
  temp_low = READ(); //读低位
  temp_high = READ(); //读高位
  temp = (temp_high<<8) | temp_low;//合并高低8位
  return temp;
}

void Init_DS()
{
          short int r=1;
          while(r)
          {
                  r=TINIT();//初始化传感器 并进行检测是否初始化成功
          }
          for(n = 20;n > 0;n--)
                  __delay_cycles(20000000);//延时16秒
          Skip(); //向温度传感器发送跳过读取ID号指令
          Convert(); //向温度传感器发送温度转换指令
}

void main(void)
{
        Init_DS();
        while(TINIT());//再次初始化传感器 并进行检测是否初始化成功
        P4DIR|=BIT7;//通过LED绿灯检测程序的执行情况
        P4OUT|=BIT7;
        for(n = 20;n > 0;n--)
                __delay_cycles(20000000);//延时16秒
        Skip(); //向温度传感器发送跳过读取ID号指令
        Read_SP();
        T=ReadTemp();
        ssd = T*0.0625;//计算摄氏度
        TC=(int)(ssd*10+0.5);
        while(1);
}


已退回5积分

回帖(1)

万航渡路

2019-2-11 15:40:22
建议还是看下时钟频率,不然拿别人的直接用不确定是不是对的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分