找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1529|回复: 1
打印 上一主题 下一主题
收起左侧

msp430f5529单片机hc-sr04超声波模块程序 串口输出

[复制链接]
跳转到指定楼层
楼主
ID:1039180 发表于 2022-7-11 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测距并通过串口打印的例程

单片机源程序如下:

  1. #include "User_Uart.h"
  2. #include "driverlib.h"

  3. void UCS_Init(void)
  4. {
  5. //    P1DIR |= BIT0;                          // ACLK set out to pins
  6. //    P1SEL |= BIT0;
  7.     P2DIR |= BIT2;                            // SMCLK set out to pins
  8.     P2SEL |= BIT2;
  9. //    P7DIR |= BIT7;                          // MCLK set out to pins
  10. //    P7SEL |= BIT7;

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

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

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

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

  29. void Uart_Init(void)                           // 115200 8N1
  30. {
  31.     P4SEL |= BIT4+BIT5;                        // P4.4,5 = USA1 TXD/RXD
  32.     UCA1CTL1 |= UCSWRST;                       // **Put state machine in reset**
  33.     UCA1CTL1 |= UCSSEL__SMCLK ;                // SMCLK
  34.     UCA1BR0 = 34;                              // 4MHz 115200 (see User's Guide)
  35.                                                // UCA1BR0 = 输入的时钟源/串口通信速率 (取整)
  36.     UCA1BR1 = 0;                               // 4MHz 115200
  37.     UCA1MCTL = UCBRS_6;                        // 输入的时钟源/串口通信速率的余数*8
  38.     UCA1CTL1 &= ~UCSWRST;                      // **Initialize USCI state machine**
  39. //    __bis_SR_register(GIE);       // Enter LPM0, interrupts enabled
  40. }


  41. #define Trig1(a)  if(a==1) P1OUT |= BIT3; else P1OUT &= ~BIT3

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

  49. void Hc_sr_Init(void)           // 超声波模块初始化
  50. {
  51.    /*
  52.     *  P1.2 为echo引脚             捕获模式
  53.     *  P1.2 具有端口中断的通用数字I / O ,TA0 CCR1捕获:CCI1A输入,比较:Out1输出  BSL接收输入
  54.     *  P1.3 为Trig          数字i/o模式
  55.     *  P1.3 具有端口中断的通用数字I / O , TA0 CCR2捕获:CCI2A输入,比较:Out2输出
  56.     */
  57.     P1OUT &= ~( BIT2 + BIT3 );
  58.     P1DIR |=  BIT3;
  59.     P1SEL |=  BIT2;
  60.     /*
  61.      * note:由于选用的是P1.2 根据端口定义可知,使用的是TA0CCR1,捕获输入引脚通过TA0CCTL1寄存器控制,
  62.      *-捕获值存储在TA0CCR1中。
  63.      * TASSEL:SNCLK; 分频:4MHz/8 = 500k;计数模式:0  ==> 0xFFFF;
  64.      * TA0CCTL1:上升沿捕获 ;同步捕捉;捕获模式;CCI1A输入;
  65.      */
  66.     TA0CTL   = TASSEL__SMCLK + ID__8 + MC_2 + TACLR + TAIE;
  67.     TA0CCTL1 = CM_1 + SCS +CAP + CCIE + CCIS_0;
  68. }

  69. void Hc_sr_Open(void)           //生成一个持续10us的高电平
  70. {
  71.     Trig1(1);
  72.     __delay_cycles(40);
  73.     Trig1(0);
  74. }

  75. #pragma vector=TIMER0_A1_VECTOR
  76. __interrupt void TIMER0_A1_ISR(void)
  77. {
  78.     switch(__even_in_range(TA0IV,14))
  79.     {
  80.       case  0:break;                                 // No interrupt
  81.       case  2:
  82.           state =  TA0CCTL1 >> 14;
  83.           TA0CCTL1 &= ~CCIFG;
  84.           if( TA0CCTL1 & CM_1){
  85.               cap_new = TA0CCR1;
  86.               TA0CCTL1 &= ~CM_1;
  87.               TA0CCTL1 |=  CM_2;
  88.           }else if ( TA0CCTL1 & CM_2){
  89.               cap_old = TA0CCR1;
  90.               cap_data = ( cap_old - cap_new ) * 0.34;
  91.               UARTprintf("\n\ncap_data: %u mm",cap_data);
  92.               TA0CCTL1 &= ~CM_2;
  93.               TA0CCTL1 |=  CM_1;
  94.           }else UARTprintf("\nstate: %x",state);     // 判断CM位捕捉模式
  95. //          UARTprintf("\n yes! ccr1 \nTA0 CCR1: %u  TA0R: %u",TA0CCR1,TA0R);
  96.           break;                          // CCR1 not used
  97.       case  4: break;                          // CCR2 not used
  98.       case  6: break;                          // reserved
  99.       case  8: break;                          // reserved
  100.       case 10: break;                          // reserved
  101.       case 12: break;                          // reserved
  102.       case 14:
  103.           TA0CTL &= ~TAIFG;
  104.           if(cap_old   < cap_new ){
  105.               cap_N += 1;
  106.           }
  107.           break;                          // overflow
  108.       default: break;
  109.     }
  110. }

  111. void main (void)
  112. {
  113.     WDT_A_hold(WDT_A_BASE);
  114.     Uart_Init();
  115.     UCS_Init();
  116.     Hc_sr_Init();
  117.     __bis_SR_register(GIE);
  118.     UARTprintf("\nInitialization is complete!");
  119.     while(1)
  120.     {
  121.         Hc_sr_Open();
  122.         __delay_cycles(1000000);
  123.     }
  124. }
复制代码

代码下载:
HCSR04.zip (655.34 KB, 下载次数: 48)


评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:935312 发表于 2022-7-29 01:48 | 只看该作者
头文件用不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表