磁罗经数据处理

//磁罗经数据处理
#include
#include //_nop_()要用
#define uchar unsigned char
#define uint unsigned int
sbit BUSY=P3^4; //忙标志
sbit VEL=P3^5; //极性标志
sbit DE=P3^3; //驱动器使能,1有效,接单片机的P3.3
sbit RE=P3^2; //接收器使能,0有效,接单片机的P3.2
uchar datah; //datah=p1,所采集数据的高8位
uchar datal; //datal=p0,所采集数据的低8位
float data_hl,data_tmp1; //datahl=datah+datal,数据合成,并转成浮点数
float data_tmp2;
uint data_tmp3; //临时整形变量
float fbl=360.0/4096.0; //分辨率
uchar bzbuf1[]="$HEHDT,"; //第一组字符串,见电、磁罗经通信协议
uchar sbuff[5]; //罗经航向数据
uchar bzbuf2[]=",T*"; //第二组字符串,见电、磁罗经通信协议


void init(void) // 初始化函数


{
TMOD=0x20; //方式2的波特率设定
SCON=0x50; //10位异步收发(8位数据),波特率可变,由定时器1的溢出率控制
TH1=0xFD;
TL1=0xFD;
TR1=1;
PCON=0x00; //SMOD=0
EA=0;
}


void getdata(void) //数据采集及处理函数
{

//P2=0x0F;
//P0=0xFF;
while(BUSY==1);

datah=P2; //读端口数据
datal=P0;
BUSY=1;
datah=P2&0x0f; //将P2口高4位屏蔽
data_hl=(float)datah*256.0+(float)datal; //将P0\P2口获得的数据转换成浮点数
data_tmp1=fbl*data_hl;
data_tmp2=data_tmp1*100;
data_tmp3=(uint)data_tmp2;
if(data_tmp3%10>=5)
data_tmp3=data_tmp3+10;
data_tmp3=data_tmp3/10;
sbuff[0]=data_tmp3/1000+0x30;
sbuff[1]=data_tmp3%1000/100+0x30;
sbuff[2]=data_tmp3%100/10+0x30;
sbuff[3]=0x2e;
sbuff[4]=data_tmp3%10+0x30;

}

void send(uchar m) //单字节数据发送函数
{
TI=0;
SBUF=m;
while(!TI);
TI=0;
}



void senddata(void) //多字节数据发送函数
{
uchar i,tmp;
uchar checksum=0;
DE=1;
RE=1;

for(i=0;i<7;i++) //发送第一组字符串"$HEHDT," 并累积计算校验和
{
send(bzbuf1[i]);
checksum=checksum+bzbuf1[i];
}
for(i=0;i<5;i++) //发送罗经航向数据并累积计算校验和
{
send(sbuff[i]);
checksum=checksum+sbuff[i];
}
for(i=0;i<3;i++) //发送第二组字符串",T*" 并累积计算校验和
{
send(bzbuf2[i]);
checksum=checksum+bzbuf2[i];
}
send(checksum); //发送校验和
tmp=0x0d;
send(tmp); //发送
tmp=0x0a;
send(tmp); //发送

}


void main() //主函数
{
init(); // 调用初始化函数,设定串行口和定时器工作模式
while(1)
{

getdata(); //调用数据采集及处理函数

senddata(); //调用多字节数据发送函数
_nop_();
}


}

相关文档
最新文档