基于MSP430的超声波测距和 温度DS18B20组合嵌套问题?

2019-07-15 16:26发布

#include <msp430x14x.h>
#include"1602.h"
#include"18b20.h"
#define CPU_F ((double)8000000)
#define Delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define Delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//P20为TRIG口 P11为Ecoh口
#define Trig_H P2OUT|=BIT0;
#define Trig_L P2OUT&=~BIT0;
uchar table[]="Distance:" ;
uint lastCCR0;
uint j;
uint JIU_L=0,k,wan=0,qian=0,bai=0,shi=0,ge=0;
/*************************主函数*************************/

void main( void )
{

    P1DIR=0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;

    WDTCTL = WDTPW + WDTHOLD;           //关狗



    BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2 开启 LFXT1 工作在低频模式 ACLK

    DCOCTL=DCO2+DCO1+DCO0;//DCO 为最高频率  
    TACTL|=TASSEL_1+MC_2+TACLR;
    CCTL0=CM_3+CCIS_0+SCS+CAP+CCIE;
    k=0;
    j=0;
    lastCCR0=0;
    CCR0=0;


    LcdReset();
    zifuchuan("Temper is:");
    write_com(0x80+0x40);
    zifuchuan("Distance:");//循环读数显示
    _EINT(); //打开全局中断
    while(1)
    {
      display(Do1Convert());
      Trig_H;
      Delay_us(30);
      Trig_L;
      JIU_L =(int)((float)k*100*1700/32768);
      if(JIU_L>4500)
      JIU_L=0;
      //qian=JIU_L/1000;
      bai=(JIU_L%1000)/100;
      shi=(JIU_L%100)/10;
      ge=JIU_L%10;
      write_com(0x80+0X40+9);

      //write_data(0x30+qian);显示温度 不显示 测距!!

      write_data(0x30+bai);

      write_data(0x2e);

      write_data(0x30+shi);
      write_data(0x30+ge);

      write_data('m');

    }         
}
#pragma vector=tiMERA0_VECTOR
__interrupt void timerccro(void)
{


  k=CCR0-lastCCR0;
  lastCCR0=CCR0;


}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
liangji584521
1楼-- · 2019-07-15 18:26
显示温度 不显示 测距啊!
/*******************************************
函数名称:DelayNus
功    能:实现N个微秒的延时
参    数:n--延时长度
返回值  :无
说明    :定时器A的计数时钟是1MHz,CPU主频8MHz
          所以通过定时器延时能够得到极为精确的
          us级延时
********************************************/





/*******************************************
函数名称:Init_18B20
功    能:对DS18B20进行复位操作
参    数:无
返回值  :初始化状态标志:1--失败,0--成功
********************************************/
uchar Init_18B20(void)
{
    uchar Error;
   
    DQ_out;
    _DINT();
    DQ0;
    Delay_us(500);
    DQ1;
    Delay_us(55);
    DQ_in;
    _NOP();
    if(DQ_val)      
    {
        Error = 1;          //初始化失败
    }
    else
    {
        Error = 0;          //初始化成功
    }
    DQ_out;
    DQ1;
    _EINT();
   
    Delay_us(400);
   
    return Error;
}
/*******************************************
函数名称:Write_18B20
功    能:向DS18B20写入一个字节的数据
参    数:wdata--写入的数据
返回值  :无
********************************************/
void Write_18B20(uchar wdata)
{
    uchar i;
   
    _DINT();
    for(i = 0; i < 8;i++)
    {
        DQ0;
        Delay_us(6);            //延时6us
        if(wdata & 0X01)    DQ1;
        else                DQ0;
        wdata >>= 1;
        Delay_us(50);           //延时50us
        DQ1;
        Delay_us(10);           //延时10us
    }
    _EINT();
}
/*******************************************
函数名称:Read_18B20
功    能:从DS18B20读取一个字节的数据
参    数:无
返回值  :读出的一个字节数据
********************************************/
uchar Read_18B20(void)
{
    uchar i;
    uchar temp = 0;
   
    _DINT();
    for(i = 0;i < 8;i++)
    {
        temp >>= 1;
        DQ0;
        Delay_us(6);            //延时6us
        DQ1;
        Delay_us(8);            //延时9us
        DQ_in;
        _NOP();
        if(DQ_val)   temp |= 0x80;
        Delay_us(45);           //延时45us
        DQ_out;
        DQ1;
        Delay_us(10);           //延时10us
    }
    _EINT();
   
    return  temp;
}

/*******************************************
函数名称:Skip
功    能:发送跳过读取产品ID号命令
参    数:无
返回值  :无
********************************************/
void Skip(void)
{
    Write_18B20(0xcc);
}
/*******************************************
函数名称:Convert
功    能:发送温度转换命令
参    数:无
返回值  :无
********************************************/
void Convert(void)
{
    Write_18B20(0x44);
}
/*******************************************
函数名称:Read_SP
功    能:发送读ScratchPad命令
参    数:无
返回值  :无
********************************************/
void Read_SP(void)
{
    Write_18B20(0xbe);
}
/*******************************************
函数名称:ReadTemp
功    能:从DS18B20的ScratchPad读取温度转换结果
参    数:无
返回值  :读取的温度数值
********************************************/
uint ReadTemp(void)
{
    uchar temp_low;
    uint  temp;
   
    temp_low = Read_18B20();      //读低位
    temp = Read_18B20();     //读高位
    temp = (temp<<8) | temp_low;
   
    return  temp;
}


uint Do1Convert(void)
{
    uchar i;
    uchar temp_low;
    uint  temp;
    do
    {
        i = Init_18B20();
    }
    while(i);
    //此处的i就是等于前面的Error,Error = 1,就会出现死循环,表示18B20可能坏了

    Write_18B20(0xcc);//送跳过读取产品ID号命令
  
     Write_18B20(0x44);//发送温度转换命令
    for(i = 20;i > 0;i--)  
        Delay_us(60000); //延时800ms以上
    do
    {
        i = Init_18B20();
    }
    while(i);
    //此处的i就是等于前面的Error,Error = 1,就会出现死循环,表示18B20可能坏了
   
    Write_18B20(0xcc);//送跳过读取产品ID号命令
   
     Write_18B20(0xbe);//发送读ROM命令
      
    temp_low = Read_18B20();      //读低位
    temp = Read_18B20();     //读高位
    temp = (temp<<8) | temp_low;
   
   if(temp<0x0fff)
   tflag=0;
    else
   {temp=~temp+1;
  tflag=1;
   }

tvalue=temp*(0.625);//温度值扩大10倍,精确到1位小数

  return tvalue;
}

void display(int dat)
{

disdata[0]=dat/1000;
disdata[1]=dat%1000/100;
disdata[2]=dat%100/10;
disdata[3]=dat%10;

write_com(0x80+10);
write_data(disdata[1]+0x30);
write_data(disdata[2]+0x30);write_data(0x2e);
write_data(disdata[3]+0x30);
//write_com(0x80+0x43);
//write_data(disdata[3]+0x30);
write_data(0xdf);//写入摄氏度的小圈
write_data('C');

}
关键问题 不知道 是什么原因影响
小余小乖
2楼-- · 2019-07-16 00:08
把CCR0的值赋大点
419521564
3楼-- · 2019-07-16 02:16
后哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
午后的阵雨
4楼-- · 2019-07-16 07:20
Trig_H;
       Delay_us(30);
       Trig_L;
       JIU_L =(int)((float)k*100*1700/32768);
       if(JIU_L>4500)
这块有问题,Trig先发送一个不少于18us的高电平,然后再发出低电平,接下来还要判断Echo
15895913958
5楼-- · 2019-07-16 09:11
 精彩回答 2  元偷偷看……
brucewilber
6楼-- · 2019-07-16 13:49
下来看看~~~~~~~~~~~~~~~

一周热门 更多>