有没有大佬知道这个Echo和Trig的引脚分别改成2.4和2.5该怎么改

/*
 HC-SR04超声波测距OLE屏显示程序
 接收来自HC-SR04的数据,将成功接收到的数据打印到OLED屏幕上
 SR04: Echo  --> P1.2
       Trig  --> P1.3
 OLED: CLK   --> P3.5
       SDA   --> P3.6
*/

#include <User_config.h>
#include "oled.h"

// 宏定义:超声波Trig触发引脚
#define Trig1(a)  if(a==1) P1OUT |= BIT3; else P1OUT &= ~BIT3

unsigned int cap_new = 0;           // 首次捕捉的ta0r值
unsigned int cap_old = 0;           // 二次捕捉的ta0r值
char cap_N = 0;                     // 溢出次数
char state = 0x00;                  // zhuangtai
long cap_data = 0;                  // 距离值
//unsigned int dat[test_num];       //通过数组存10次测量值

void UCS_Init(void)                 //更改系统时钟为外部4mhz晶振时钟
{
    P2DIR |= BIT2;                            // SMCLK set out to pins
    P2SEL |= BIT2;

    P5SEL |= BIT2+BIT3;                       // Port select XT2

    UCSCTL6 &= ~XT2OFF;                       // Enable XT2
    UCSCTL3 |= SELREF_2;                      // FLLref = REFO
                                              // Since LFXT1 is not used,
                                              // sourcing FLL with LFXT1 can cause
                                              // XT1OFFG flag to set
    UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO

    // Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settles
    do
    {
      UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                              // Clear XT2,XT1,DCO fault flags
      SFRIFG1 &= ~OFIFG;                      // Clear fault flags
    }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

    UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to
                                              // expected frequency
    UCSCTL4 |= SELS_5 + SELM_5;               // SMCLK=MCLK=XT2
}


void Hc_sr_Init(void)               //初始化HC_SR04引脚
{
   /*
    *  P1.2 为echo引脚       TA0 CCR1捕获模式
    *  P1.3 为Trig          通用数字i/o模式
    */
    P1OUT &= ~( BIT2 + BIT3 );
    P1DIR |=  BIT3;
    P1SEL |=  BIT2;
    /*
     * note:由于选用的是P1.2 根据端口定义可知,使用的是TA0CCR1,捕获输入引脚通过TA0CCTL1寄存器控制,
     * 捕获值存储在TA0CCR1中。
     * TASSEL:SNCLK; 分频:4MHz/8 = 500k;计数模式:0  ==> 0xFFFF;
     * TA0CCTL1:上升沿捕获 ;同步捕捉;捕获模式;CCI1A输入;
     */
    TA0CTL   = TASSEL__SMCLK + ID__8 + MC_2 + TACLR + TAIE;
    TA0CCTL1 = CM_1 + SCS +CAP + CCIE + CCIS_0;
}

void Hc_sr_Open(void)           //生成一个持续10us的高电平
{
    Trig1(1);
    __delay_cycles(40);
    Trig1(0);
}

int main(void) {

    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    UCS_Init();
    Hc_sr_Init();
    OLED_Init();                 //OLED初始化
    OLED_Clear();                //OLED清屏
    __bis_SR_register(GIE);

    while(1){
        Hc_sr_Open();
        __delay_cycles(1000000);

        OLED_ShowString(80,1,"DIS",20);
        OLED_ShowCHinese(20,0,0);//超
        OLED_ShowCHinese(40,0,1);//声
        OLED_ShowCHinese(60,0,2);//波
        OLED_ShowString(100,3,"mm",60);

    }
}

#pragma vector=TIMER0_A1_VECTOR                 //外部中断
__interrupt void TIMER0_A1_ISR(void)
{
    switch(__even_in_range(TA0IV,14))
    {
      case  0:break;                                 // No interrupt
      case  2:
          state =  TA0CCTL1 >> 14;
          TA0CCTL1 &= ~CCIFG;
          if( TA0CCTL1 & CM_1)
          {
              cap_new = TA0CCR1;
              TA0CCTL1 &= ~CM_1;
              TA0CCTL1 |=  CM_2;
          }
          else if ( TA0CCTL1 & CM_2)
          {
              cap_old = TA0CCR1;
              cap_data = ( cap_old - cap_new ) * 0.34;
              TA0CCTL1 &= ~CM_2;
              TA0CCTL1 |=  CM_1;
              OLED_ShowNum(20,3,cap_data,6,20);
          }
      break;                          // CCR1 not used
      case  4: break;                          // CCR2 not used
      case  6: break;                          // reserved
      case  8: break;                          // reserved
      case 10: break;                          // reserved
      case 12: break;                          // reserved
      case 14:
          TA0CTL &= ~TAIFG;
          if(cap_old   < cap_new ){
              cap_N += 1;
          }
          break;                          // overflow
      default: break;
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值