各位大侠,这个问题困扰我好几天了,我觉得自己水平虽然不算高,但搞单片机程序开发应该还可以,可这个看上去简单的程序我一直都无法解决。
我用的是 DYP-ME007TX串口超声波测距模块,这个在淘宝上有不少,这个模块只有三个引脚,分别是VCC、GND和OUT,它的特点是:
模块内部每50ms进行一次测距, 并从引脚输出一帧,含4个8位数据,帧格式为:0XFF+H_DATA+L_DATA+SUM
1.0XFF: 为一帧开始数据,用于判断。
2.H_DATA:距离数据的高8位。
3.L_DATA:距离数据的低8位。
4.SUM: 数据和,用于效验。其0XFF+H_DATA+L_DATA=SUM(仅低8位)
注:H_DATA与L_DATA合成16位数据,即以毫米为单位的距离值。
以上就是说明书中的参数。我使用CC2530来编程,想要把4个8位数据取出来。我用的是CC2530的P0.4口接收数据,烧入程序后用串口调试助手来看结果,可是一点儿输出都没有,单步运行也都是0,以下是我的程序,大家给找找问题吧。
#include <ioCC2530.h>
#include <string.h>
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr)[0])
typedef unsigned char uchar;
typedef unsigned int uint;
char RxBuf;
uchar count;
char RxData[33];
void DelayMS(uint msec)
{
uint i,j;
for(i=0;i<msec;i++)
for(j=0;j<1070;j++);
}
void InitUart(void)
{
PERCFG=0x00;
P0SEL|=0x0c; //P0用作串口
P0DIR&=~0x10; //P0.4定义为输入口
P2DIR&=~0xc0; //P0口优先座位UART0
P2INP|=0x20;
U0CSR|=0x80; //设置为UART方式
U0GCR|=11;
U0BAUD|=216; //波特率设为115200
UTX0IF=0; //UART0 TX中断标志初始置位0
U0CSR|=0x40; //允许接收
IEN0|=0x84; //开总中断,允许接收中断
}
void UartSendString(char *Data,int len)
{
uint i;
for(i=0;i<len;i++)
{
U0DBUF=*Data++;
while(UTX0IF==0);
UTX0IF=0;
}
}
#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF=0; //清中断标志
RxBuf=U0DBUF;
}
void main(void)
{
CLKCONCMD&=~0x40; //设置系统时钟源为32M晶振
while(CLKCONSTA&0x40); //等待晶振稳定为32M
CLKCONCMD&=~0x47; //设置系统主时钟频率为32M
InitUart();
P0SEL&=0xef;
memset(RxData,0,32);
char str[9]="distance:"; //新增
while(1)
{
if(RxBuf!=0&&count<32)
{
RxData[count++]=RxBuf;
UartSendString(str,9);
UartSendString(RxData,32);
}
else
{
if(count>=32)
{
count=0; //计数清零
memset(RxData,0,32);
}
}
RxBuf=0;
}
} |