#include <stdio.h>
#include <string.h>
#include "inc/C8051F380_defs.h"
#include "inc/head.h"
#include "inc/common.h"
#include "inc/USB_API.h"
U8 CHS; //低四位对应位为1表示信号通道是否采集到数据
U8 cnt; //PCA0计数器溢出次数,也就是当做PCA扩展的高8位
U8 xdata RXdata[20]={0x00};
xdata U8 Testnum; // 记录当前采集到的数据数目(第几发子弹数目)
xdata unsigned long T[2]={0}; // 前2通道时间间隔,后2通道时间间隔
float V1,V2;
U8 code baotou1[7]={0xEE,0xB1,0x10,0x00,0x03,0x00,0x01}; //包头+16进制ASCII码数据
U8 code baotou2[7]={0xEE,0xB1,0x10,0x00,0x03,0x00,0x02}; //包头+16进制ASCII码数据
U8 code baowei[4]={0xFF,0xFC,0xFF,0xFF}; //包尾
U8 xdata TXdata[20]={0x00};
U8 z,j; //前2通道数据,后2通道数据的字节长度
bit TX_flag,RX_flag; //发送和接收标志
xdata U32 TIME[4]={0}; //记录PCA0计数器捕获的当前值
xdata U8 buffer[8]; //USB接受缓存
bit USBEN;
bit USB_Work; //上位机向MCU发送working命令标志位
/**************************************************************************************
USB Descriptor Information Begin
**************************************************************************************/
#define USB_VID 0x10C4
#define USB_PID 0xEA61
U8 xdata USB_MfrStr[]={ //Manufacturer String
0x12,
0x03,
'K',0,
'I',0,
'N',0,
'G',0,
' ',0,
'D',0,
'O',0,
'U',0
};
U8 USB_ProductStr[]={ //Product Desc. String
0x10,
0x03,
'U',0,
'S',0,
'B',0,
' ',0,
'A',0,
'P',0,
'I',0
};
U8 xdata USB_SerialStr[]={ //Serial Number String
0x04,
0x03,
'1',0,
'.',0,
'0',0
};
// U8 USB_MaxPower = 50; //Max current = 100 mA = (50 * 2)
// U8 USB_PwAttributes = 0x80; // Bus-powered,remote wakeup not supported
// U16 USB_bcdDevice = 0x0100; //Device release number 1.00
/******************USB Descriptor Information END***************************/
void SaveTestData();
void CH1();
void CH2();
void UART1_send();
void start_CH();
void main(void)
{
DOG_Init();//关闭看门狗
EA=0; //关闭总中断
Init_Device();//初始化
//********************USB配置************************
USB_Clock_Start(); // Init USB clock *before* calling USB_Init
USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr, // USB_MaxPower = 50;
USB_SerialStr,50,0x80,0x0100); // USB_PwAttributes = 0x80;
// U16 USB_bcdDevice = 0x0100;
CLKSEL |= 0x03;
RSTSRC |= 0x02;
Timer1_Init();
CHS=0x00;
cnt=0x00;
USB_Int_Enable();
EIE2 |= 0x02; //开UART1中断
EA=1;
while(1)
{
if( CHS==0x03||CHS==0x07||CHS==0x0B||CHS==0x0F) //CH_1和CH_2通道采到数据
{
start_CH(); //重新开启所有通道
T[0]=TIME[1]-TIME[0]; //计算两通道之间的时间差
CH1(); //保存两通道之间的时间差到TXdata[20]
UART1_send(); //发送数据包到显示屏显示
CHS&=0xFC; //清零CH_1和CH_2通道开通标志
}
if(CHS>0x0B) //CH_3和CH_4通道采到数据
{
start_CH(); //重新开启所有通道
T[1]=TIME[3]-TIME[2]; //计算两通道之间的时间差
CH2(); //保存两通道之间的时间差到TXdata[20]
UART1_send(); //发送数据包到显示屏显示
CHS&=0xF3; //清零CH_1和CH_2通道开通标志
}
}
}
/**************************开启通道***********************/
void start_CH()
{
if(PCA0CPM0==0x00)
PCA0CPM0=0x21; //重新开启通道1
if(PCA0CPM1==0x00)
PCA0CPM1=0x21; //重新开启通道2
if(PCA0CPM2==0x00)
PCA0CPM2=0x21; //重新开启通道3
if(PCA0CPM3==0x00)
PCA0CPM3=0x21; //重新开启通道4
}
/***************************两通道之间时间差值**********************/
//void SaveTestData() //用来记录两通道之间的时间差
//{
// if( CHS==0x03||CHS==0x07||CHS==0x0B||CHS==0x0F) //判断CH-1和CH-2通道是否采到数据
// T[0]=TIME[1]-TIME[0]; //两靶之间的时间差
// else
// T[0]=0;
// if(CHS>0x0B) //判断CH-3和CH-4通道是否得到数据
// T[1]=TIME[3]-TIME[2]; //两靶之间的时间差
// else
// T[1]=0;
//}
void CH1() //将包头,数据,包尾放到一个数组当中
{
U8 i;
for(i=0;i<7;i++)
TXdata[i]=baotou1[i]; //将包头写进数组table
z=sprintf(TXdata+7,"%0lu",T[0]); //将数据跟在包头后面写进数组,并求出数据字节长度
for(i=0;i<4;i++) //将包尾跟在数据后面写进数组
TXdata[7+z+i]=baowei[i];
}
void CH2() //将包头,数据,包尾放到一个数组当中
{
U8 i;
for(i=0;i<7;i++)
TXdata[i]=baotou2[i]; //将包头写进数组table
z=sprintf(TXdata+7,"%0lu",T[1]); //将数据跟在包头后面写进数组,并求出数据字节长度
for(i=0;i<4;i++) //将包尾跟在数据后面写进数组
TXdata[7+z+i]=baowei[i];
}
/**********************串口发送***************************/
void UART1_send()
{
U8 num;
for(num=0;num<(z+11);num++)
{
SBUF1=TXdata[num]; //写sbuf1,发送包头+数据+包尾
while(!((SCON1&0x02)==0x02)); //检测TI1是否为1,不为1则等待
SCON1&=0xFD; //为1则TI1清0
}
}
/*******************USB中断服务程序***********************/
void USB_API_TEST_ISR(void) interrupt 17 //USB的API中断
{
U8 xdata INTVAL; //获取USB的中断源
INTVAL = Get_Interrupt_Source(); //获取中断源
if (INTVAL & RX_COMPLETE) //如果是接受中断,则从buffer中读取数据
{
Block_Read(buffer, 8);
USBEN = 1; //此时需要简析USB的Buffer数据
}
}
/*******************PCA中断服务子程序****************************/
void PCA_ISR(void) interrupt Interrupt_PCA0
{
if(CCF0) //CH_1触发
{
CF=0;
PCA0CPM0=0x00; //将CH-1通道封锁
CCF0=0; //捕获中断标志清零
if(PCA0H==0 && PCA0CP0==0xFF) //捕获比较寄存器采到全F,而此时PCA已经溢出计数时所以cnt+1;
cnt++;
CF=0;
CHS |=0x01; //表示通道1已经采集到了数据
TIME[0]=cnt;
TIME[0]<<=16;
TIME[0]+=PCA0CP0; //读取CH_1触发时PCA捕获的16位字节数
}
if(CCF1) //CH_2触发
{
PCA0CPM1=0x00; //将CH-2通道封锁
CCF1=0; //捕获中断标志清零
CHS |=0x02; //表示通道2已经采集到了数据
if(CF==1 && PCA0CP1<=0XC8)
cnt++;
TIME[1]=cnt; //读取PCA0CP1的值同时记录“扩展位”的值
TIME[1] <<=16;
TIME[1] +=PCA0CP1;
}
if(CCF2) //CH_3触发
{
PCA0CPM2=0x00; //将CH-3通道封锁
CCF2=0; //捕获中断标志清零
CHS |=0x04; //表示通道3已经采集到了数据
if(CF==1 && PCA0CP2<=0XC8)
cnt++;
CF=0;
TIME[2]=cnt;
TIME[2] <<=16;
TIME[2] +=PCA0CP2;
}
if(CCF3) //CH_4触发
{
PCA0CPM3=0x00; //将CH-4通道封锁
CCF3=0; //捕获中断标志清零
CHS |=0x08; //表示通道4已经采集到了数据
if(CF==1 && PCA0CP3<=0XC8)
cnt++;
TIME[3]=cnt;
TIME[3] <<=16;
TIME[3] +=PCA0CP3;
}
if((PCA0MD&0x01)==0x00) //触发PCA捕获中断之后使能PCA溢出中断
{
PCA0MD|=0x01;
CF=0;
}
if(CF==1) //判断是否触发溢出中断
{
CF=0;
cnt++; //溢出中断次数
}
}
void UART1_ISR(void) interrupt 16
{ U8 temp;
temp=SBUF1;
if((SCON1&0x01)==0x01) //RI1置1
{
SCON1&=0xFE; //清零RI1
RXdata[j]=temp; //数组容纳一个字节
j++;
if(j>=20)
{
j=0;
RX_flag=1; //接收完成标志
}
}
} |