欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
msp430f5529單片機hc-sr04超聲波模塊程序 串口輸出
[打印本頁]
作者:
LinbeiA
時間:
2022-7-11 19:55
標題:
msp430f5529單片機hc-sr04超聲波模塊程序 串口輸出
測距并通過串口打印的例程
單片機源程序如下:
#include "User_Uart.h"
#include "driverlib.h"
void UCS_Init(void)
{
// P1DIR |= BIT0; // ACLK set out to pins
// P1SEL |= BIT0;
P2DIR |= BIT2; // SMCLK set out to pins
P2SEL |= BIT2;
// P7DIR |= BIT7; // MCLK set out to pins
// P7SEL |= BIT7;
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 Uart_Init(void) // 115200 8N1
{
P4SEL |= BIT4+BIT5; // P4.4,5 = USA1 TXD/RXD
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL__SMCLK ; // SMCLK
UCA1BR0 = 34; // 4MHz 115200 (see User's Guide)
// UCA1BR0 = 輸入的時鐘源/串口通信速率 (取整)
UCA1BR1 = 0; // 4MHz 115200
UCA1MCTL = UCBRS_6; // 輸入的時鐘源/串口通信速率的余數*8
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
// __bis_SR_register(GIE); // Enter LPM0, interrupts enabled
}
#define Trig1(a) if(a==1) P1OUT |= BIT3; else P1OUT &= ~BIT3
unsigned int cap_new = 0; // 首次捕捉的ta0r值
unsigned int cap_old = 0; // 二次捕捉的ta0r值
//char test_num = 10; // 測量次數
char cap_N = 0; // 溢出次數
char state = 0x00; // zhuangtai
long cap_data = 0; // 距離值
//unsigned int dat[test_num]; //通過數組存10次測量值
void Hc_sr_Init(void) // 超聲波模塊初始化
{
/*
* P1.2 為echo引腳 捕獲模式
* P1.2 具有端口中斷的通用數字I / O ,TA0 CCR1捕獲:CCI1A輸入,比較:Out1輸出 BSL接收輸入
* P1.3 為Trig 數字i/o模式
* P1.3 具有端口中斷的通用數字I / O , TA0 CCR2捕獲:CCI2A輸入,比較:Out2輸出
*/
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);
}
#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;
UARTprintf("\n\ncap_data: %u mm",cap_data);
TA0CCTL1 &= ~CM_2;
TA0CCTL1 |= CM_1;
}else UARTprintf("\nstate: %x",state); // 判斷CM位捕捉模式
// UARTprintf("\n yes! ccr1 \nTA0 CCR1: %u TA0R: %u",TA0CCR1,TA0R);
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;
}
}
void main (void)
{
WDT_A_hold(WDT_A_BASE);
Uart_Init();
UCS_Init();
Hc_sr_Init();
__bis_SR_register(GIE);
UARTprintf("\nInitialization is complete!");
while(1)
{
Hc_sr_Open();
__delay_cycles(1000000);
}
}
復制代碼
代碼下載:
HCSR04.zip
(655.34 KB, 下載次數: 48)
2022-7-11 19:53 上傳
點擊文件名下載附件
作者:
Ks21y
時間:
2022-7-29 01:48
頭文件用不了
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1