请教 单片机上传数据给CH375程序 是否正确?

哦!这回是明白了 。谢谢指导!


再请教15楼一个问题:我的目的是单片机传输数据给PC机并显示。这个过程我能已经编写完成了,但是“PC先下传一包数据的目的就是告诉单片机已经枚举成功了,可以进行数据传输了”这个过程我怎么结合到我的上传数据给PC机中?程序如下: #pragma NOAREGS #include #include #include #include "CH375INC.H" #define uint unsigned int; #define uchar unsigned char; unsigned char volatile xdata CH375_CMD_PORT _at_ 0x7FFF; unsigned char volatile xdata CH375_DAT_PORT _at_ 0x3FFF;

sbit clock=P1^0; sbit date_out=P1^1; sbit cs=P1^2; uchar volt;

/*A/D转换过程*/ uchar TLC549_ADC(void) { uchar i,temp; cs=1; clock=0; cs=0; _nop_(); _nop_(); for(i=0;i<8;i++) { temp<<=1; temp|=date_out; clock=1; _nop_(); clock=0; } cs=1; for(i=17;i!=0;i--) _nop_(); return(temp); } void Data_Conversion(void) { unsigend char AD_Data; AD_Data=TLC549_ADC(); Volt=5.0/256*AD_Data*1000; }

/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根据单片机的时钟选择初值 */ }

/* 基本操作 */

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); CH375_CMD_PORT=cmd; }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ CH375_DAT_PORT=dat;

}

unsigned char CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */

return( CH375_DAT_PORT ); }

/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );

} void Delay1( ) { unsigned char i, j; for ( i=400; i!=0; i-- ) for ( j=500; j!=0; j-- ); } /* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 测试CH375是否正常工作,可选操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 写入测试数据 */ i = ~ 0x55; /* 返回数据应该是测试数据取反 */ if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); /* 延时50ms */ } /* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 设置为使用内置固件的USB设备方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; }

}

/* CH375中断服务程序,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; EA = 0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */ USB_INT_EP2_IN: { /* 批量数据发送成功 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( 1); /* 首先写入后续数据长度 */ CH375_WR_DAT_PORT( ad ); /* ad为A/D转换器采集的8位数据*/ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ } EA=1; }

main( ) { uchar ad; Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ Delay1( ); CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( 1); /* 首先写入后续数据长度 */ CH375_WR_DAT_PORT( ad ); /* ad为A/D转换器采集的8位数据*/ EA = 1; /* 允许中断 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ while ( 1 );/* 以下指令开始工作循环,等待PC机命令进行操作,不精确只要能取走ad的数据即可*/ { ad=Data_Conversion(); } }


TEST.C中不是已经有这个过程了么,你把TEST目录下的上下位机程序详细看看 其实过程很简单,就是上位机先发送一包数据,作为下位机发送数据的起始信号,如果还有疑惑的地方,请电话沟通吧:025-52638368


只有登录才能回复,可以选择微信账号登录