打印

为什么c8051f380不能收数据,但是能发送出去

[复制链接]
1161|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
npt|  楼主 | 2016-4-9 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;              //接收完成标志
                }
        }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

npt

1

主题

1

帖子

0

粉丝