#include<msp430x16x.h>
void UARTSnd(unsigned char dat);
void UART_init();
void clock_int();
unsigned long LastRcvData;
unsigned char GLength;
unsigned char RcvIndex;
unsigned char GLengthHigh,GLengthLow;
//********************时钟初始化*******************//
void clock_int()
{
unsigned int i;
P5DIR|=0x70;
P5SEL|=0x70; //P5.4 MCLK输出,P5.5 SMCLK输出,P5.6 ACLK输出4KHZ
BCSCTL1 |= ~XT2OFF+XTS; //XT2和LFXT1全部打开
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (i = 0xFF; i > 0; i--); // 稳定时间
}
while ((IFG1 & OFIFG)!=0); // 若振荡器失效标志存在
BCSCTL2 |=SELM1+SELM0+SELS+DIVS_3; // SMCLK = XT2/8 = 1MHz,MCLK=LFXT1=32.768KHZ
}
//********************波特率初始化*******************//
void UART_init()
{
// UCTL0|=SWRST; //这之后才能对串口模块其它寄存器做修改
UTCTL0=SSEL1; //UCLK=SMCLK=1MHZ
UBR00=0x68;
UBR10=0x00; //在1000000HZ下进行9600波特率的通信
UMCTL0=0x01; //波特率分频因子
UCTL0=CHAR; //8位字符长度
// UCTL0&=~SWRST; //使能USART,这之后发送模块才能工作
ME1|=URXE0+UTXE0; //允许USART0 TXD/RXD
IE1|=URXIE0; //使能接收中断
P3SEL|=0x30; //p3.4,5用作USART0 TXD/RXD
P3DIR|=0x10; //p3.4输出
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
//while(!(IFG1&UTXIFG0)); //TX or RX?
while((IFG1 & UTXIFG0)==0); //USART0接收缓存有数据吗,UTXIFG0发送中断标志,TX缓存空闲否?
//TXBUF0=RXBUF0; //读出接收到的数据
//IFG1|=~URXIFG0;
LastRcvData=RXBUF0; //输入缓存器转换成字符
if(RcvIndex==0)
{
GLengthHigh=LastRcvData;
RcvIndex++;
}
else if(RcvIndex==1)
{
GLengthLow=LastRcvData;
RcvIndex=0;
}
}
//********************发超声波脉冲*******************//
void MeterLenByUART()
{
TXBUF0=0x55; //向缓冲区写入字符
while((UTCTL1&0x01)==0);//正在传输数据或发送
//缓冲器UTXBUF有数据循环
//跳出则发送移位寄存器和UTXBUF为空
//查询等待一次发送完毕
//UARTSnd(0X55);
//串口模式下只需要在Trig/TX 管脚输入0X55(波特率9600),
//系统便可发出8 个40KHZ 的超声波脉冲,然后检测回波信号。
//当检测到回波信号后,模块还要进行温度值的测量,然后根据
//当前温度对测距结果进行校正,将校正后的结果通过Echo/RX管脚输出
}
//********************主函数*******************//
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
clock_int();
UART_init();
_EINT(); //通用中断允许
while(1)
{
unsigned long PreLength;
MeterLenByUART();
PreLength=GLengthHigh;
PreLength<<=8;
PreLength+=GLengthLow;
}
}
串口发送0x55波特率,超声波测距模块返回2个字节的数据,如何将两个字节都接收到而不是仅有一个低字节的返回值,向各位前辈请教喽~本人是刚刚学习430有什么表达不清楚或者不对的地方请各位能否尽量帮小女子指点一二
此帖出自
小平头技术问答
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
//while(!(IFG1&UTXIFG0)); //TX or RX?
while((IFG1 & UTXIFG0)==0); //USART0接收缓存有数据吗,UTXIFG0发送中断标志,TX缓存空闲否?
//TXBUF0=RXBUF0; //读出接收到的数据
//IFG1|=~URXIFG0;
LastRcvData=RXBUF0; //输入缓存器转换成字符
TXBUF0=LastRcvData;
if(RcvIndex==0)
{
GLengthHigh=LastRcvData;
RcvIndex++;
}
else if(RcvIndex==1)
{
GLengthLow=LastRcvData;
PreLength=GLengthHigh;
PreLength<<=8;
PreLength+=GLengthLow;
RcvIndex=0;
}
}
不过还是要感谢你的回复哟,你说的方法我会尝试一下的~
一周热门 更多>