标题:
msp430f5529的超声波测距,一直在lcd上显示0m?求大神指点
[打印本页]
作者:
两个半橙子
时间:
2021-6-9 22:45
标题:
msp430f5529的超声波测距,一直在lcd上显示0m?求大神指点
#include <lcd.h>
#include <msp430f5529.h>
#include <string.h>
unsigned char Range[]= " maxD: 50 M ";
unsigned char distance[] = "distance:";
unsigned char ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
uint lastCCR1;
unsigned int t=0;
unsigned long S=0;
unsigned char disbuff[4] = {0,0,0,0};
void delayms(unsigned int m)
{
unsigned int i, j;
for(i=0; i<m; i++)
for(j=0; j<1000; j++);
}
void Conut(void)
{
S=(t*1.7)/100; //算出来是CM
if((S>=700)) //超出测量范围显示“-”
{
DisplayOneChar(10, 1, ASCII[11]);
DisplayOneChar(11, 1, ASCII[10]); //显示点
DisplayOneChar(12, 1, ASCII[11]);
DisplayOneChar(13, 1, ASCII[11]);
DisplayOneChar(14, 1, ASCII[12]); //显示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%100%10;
DisplayOneChar(10, 1, ASCII[disbuff[0]]);
DisplayOneChar(11, 1, ASCII[10]); //显示点
DisplayOneChar(12, 1, ASCII[disbuff[1]]);
DisplayOneChar(13, 1, ASCII[disbuff[2]]);
DisplayOneChar(14, 1, ASCII[12]); //显示M
}
}
void StartModule() //启动模块
{
uint i;
P6OUT|=BIT0 ; //启动一次模块
__delay_cycles(20); //20个机器周期,20μs
P6OUT&=~BIT0 ;
}
void Initclock()
{
UCSCTL3 = SELREF_2;//FLL参考时钟源REFO
UCSCTL4 |= SELA_2; //先设置ACLK为REFO
//测试晶振是否失效,并清除故障失效标志位
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除XT2、XT1、DCO故障失效标志位
SFRIFG1 &= ~OFIFG; //清除晶振故障失效中断标志位
}while (SFRIFG1&OFIFG); //测试晶振故障失效中断标志位
__bis_SR_register(SCG0); //关闭FLL
UCSCTL1 = DCORSEL_5; //选择DCO的工作频率范围
UCSCTL2 |= 249; //(259+1)*32768 = 8Mhz
__bic_SR_register(SCG0); //启用FLL
__delay_cycles(2500000); //延时,等待DCO工作稳定
UCSCTL4 |=SELM_3 + SELS_3; //主时钟、子时钟均配置为dcoclk
UCSCTL5 |=DIVM_3 + DIVS_3; //主时钟、子时钟8分频
}
void SetTIMEA()
{
t=0;
lastCCR1=0;
TA0CTL = CM_3+TACLR+TASSEL_2+ID_2+MC_2+TAIE; //计数清0,选子系统时钟做时钟源,连续计数模式,定时器允许中断
}
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P6DIR|=BIT0;
P1DIR&=~BIT2;
P1SEL|=BIT2;
Initclock();
P6OUT&=~BIT0 ;
InitLcd1602();
SetTIMEA();
TA0CCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
LcdShowStr(2,0,Range);
LcdShowStr(0,1,distance);
_EINT();
while(1)
{
StartModule();
Conut();
delayms(10);
}
}
#pragma vector = TIMER0_A1_VECTOR //CCR1捕获产生中断
__interrupt void TIMER0_A1__ISR(void)
{
TA0CCTL1&=~CCIFG;//中断标志清零
switch(__even_in_range(TA0IV,14))
{
case 0:
break;
case 2: //CCR1捕获中断
if(P1IN&BIT2==1)
{
lastCCR1 = TA0CCR1;
TA0CCTL1 = CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
}
else
{
_DINT(); //关闭全局中断
t=TA0CCR1-lastCCR1;
TA0CCR1 = 0;
TA0CCTL1= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
_EINT();
}
break;
case 4:
break;
case 6:
break;
case 8:
break;
case 0x0A:
break;
case 0x0C:
break;
case 0x0E: //定时器溢出中断
if(TA0CCTL1&COV)
TA0CCTL1&=~COV;
break;
default:
break;
}
}
作者:
lidalinqing
时间:
2021-7-6 01:00
兄弟你定义的接口是哪里?我怎么看不懂
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1