我写的这个程序为什么不行啊,如果去掉有关IsSend变量的操作这程序就能完成功能了,我设置IsSend是个标志位,进行一次AD转换就IsSend=1,然后把转换数据写入USB上传缓冲区,用while(IsSend==1) {;} 等待数据取走,取走后就进入中断IsSend=0,然后继续循环;但加了IsSend这个变量程序就用不了了。去了就能用了。。。哪位哥哥能帮忙解答下啊! #pragma NOAREGS
#include #include #include #include "CH375INC.H"
#define AD_START P3_1 #define AD_OE P3_0 #define AD_EOC P3_4 //INT0 P3_2
unsigned char IsSend=0;
unsigned char volatile xdata CH372_CMD_PORT _at_ 0x0100; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH372_DAT_PORT _at_ 0x0000; /* CH375数据端口的I/O地址 */
unsigned char ad0809() { unsigned char x; AD_OE=0; AD_START=0; AD_START=1; AD_START=0; while(AD_EOC==0){;} AD_OE=1; x=P1; AD_OE=0; IsSend=1; return(x) ; }
/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根据单片机的时钟选择初值 */ }
/* 基本操作 */
void CH372_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); CH372_CMD_PORT=cmd; delay2us(); }
void CH372_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ delay2us( ); CH372_DAT_PORT=dat; }
unsigned char CH372_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
delay2us( ); return( CH372_DAT_PORT); }
/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }
/* CH375初始化子程序 */ void CH372_Init( ) { unsigned char i; /* 测试CH375是否正常工作,可选操作,通常不需要 */ CH372_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ CH372_WR_DAT_PORT( 0x55 ); /* 写入测试数据 */ i = ~ 0x55; /* 返回数据应该是测试数据取反 */ if ( CH372_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=160; i!=0; i-- ) { CH372_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ CH372_RD_DAT_PORT( ); } CH372_WR_CMD_PORT( 0 ); Delay50ms( ); Delay50ms( ); /* 延时50ms */ } /* 设置USB工作模式, 必要操作 */ CH372_WR_CMD_PORT( CMD_SET_USB_MODE ); CH372_WR_DAT_PORT(2 ); /* 设置为使用内置固件的USB设备方式 */ for ( i=200; i!=0; i-- ) /* 等待操作成功,通常需要等待10uS-20uS */ { if ( CH372_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; }
/* 下述启用中断,假定CH375连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ }
/* CH375中断服务程序,使用寄存器组1 */ void mCh372Interrupt( ) interrupt 0 using 1 {
unsigned char InterruptStatus; IE0 = 0;//清除中断标志 CH372_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH372_RD_DAT_PORT( ); /* 获取中断状态 */ switch ( InterruptStatus ) /* 分析中断状态处理 */
case USB_INT_EP2_OUT: /* 批量端点下传成功 */ { CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); break; } case USB_INT_EP2_IN: //数据发送成功中断程序 { IsSend=0; CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } }
void main( void ) { unsigned char UsbSendBuf ; Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH372_Init( ); /* 初始化CH375 */
EA = 1; /* 允许中断 */ do { UsbSendBuf=ad0809(); CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 ); CH372_WR_DAT_PORT(1); CH372_WR_DAT_PORT(UsbSendBuf); while(IsSend==1) {;} ; } while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */ }