我写了一段程序,烧到单片机,单片机和ch372都可以工作。
//使用25M晶振,STC12c5a60s2单片机 //#pragma NOAREGS #include //#include #include #define uchar unsigned char #define uint unsigned int
sbit INT=P3^2; // CH372中断信号输出端 sbit A0=P1^0; // CH372总线选择端 sbit UCS=P3^5; // CH372 片选 端 sbit UWR=P3^6; // CH372写数据 端 sbit URD=P3^7; // CH372 读数据端
sbit EOC=P3^3; // AD转换状态端 sbit CS=P1^2; // AD片选端 sbit RD=P3^4; // AD读数据端 sbit conv=P1^3;
sbit bz=P4^4; //P4^4口,存储正负标志位
void init_CH372(); void delay2us(); void CH375_WR_CMD_PORT(uchar cmd ) ; void CH375_WR_DAT_PORT(uchar dat ); unsigned char CH375_RD_DAT_PORT( void ); void ad7892_init(); void pwm(); //uchar data buffer2[48] ; uchar idata buffer1[ 64 ],buffer2[64]; uchar i; //uchar flag1=0,flag2=1; uchar flag=0,flag1=0,s=2; // uchar dat1=0,dat2=0,dat3=0,temp=0;
main() { uchar a=0; uchar j; P4SW=0X10; //将NA引脚设置为普通IO口,P4^4口 IPH=0x04; //PX1H=1 PX1=1; //中断1优先级高 EX1=1; //允许外部中断1 EA=1; //总中断允许 ad7892_init(); //初始化ad转换器 init_CH372(); //ch372初始化 // P4M0=0x00; // P4M1=0x10;//P4^4口配置成高阻输入模式 // P0M0=0x00; // P0M1=0xff;//P0口配置成高阻输入模式 // P1M0=0x00; // P1M1=0xe0;// P1^5,P1^6,P1^7分别配置成高阻输入模式 pwm(); //产生pwm波,以控制ad转换频
////////////////////////////////////////////// while(1) { if(flag==1) //buffer1已满,可以输出 { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 delay2us(); CH375_WR_DAT_PORT( 64 ); //首先写入后续数据长度 delay2us(); for ( j = 0; j < 64; j ++ ) CH375_WR_DAT_PORT( buffer1[j ] ); // 向ch372写入64个数据 flag=1; //保持flag不变,只在buffer1满时才改变flag的值 } else { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 delay2us(); CH375_WR_DAT_PORT(64 ); //首先写入后续数据长度 delay2us(); for ( j = 0; j < 64; j ++ ) CH375_WR_DAT_PORT( buffer2[ j ] ); // 向ch372写入64个数据 flag=0; //保持flag不变,只在buffer2满时才改变flag的值 } }
////////////////////////////////////////////////////////////////
} void ad7892_init() { CS=1; EOC=1; RD=1; conv=1; } void init_CH372() { uint m; CH375_WR_CMD_PORT( CMD_SET_USB_MODE );//设置USB工作模式 delay2us(); CH375_WR_DAT_PORT( 2 ); //模式代码为02H时切换到已启用的USB设备方式,内置固件模式。 for ( m=1000; m!=0; m-- ) // 等待操作成功,通常需要等待10uS-20uS { if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } IT0 = 0; // 置外部信号为低电平触发 IE0 = 0; // 清中断标志 EX0 = 1; // 允许CH375中断,假定CH375的INT#引脚连接到单片机的INT0 }
void delay2us() { uchar m; for ( m = 5; m != 0; m -- ); }
void CH375_WR_CMD_PORT( uchar cmd ) //向ch372写命令函数 {
P2=cmd; //写入命令码 A0=1; //A0=1时写命令,A0=0时写数据 URD=1; //读禁止 UCS=0; //片选选通 UWR=0; //写允许 delay2us(); UWR=1; UCS=1; A0=0; P2=0xFF; //单片机的端口全部拉高 delay2us();
} void CH375_WR_DAT_PORT( unsigned char dat ) //向ch372写数据函数 {
P2=dat; A0=0; UCS=0; UWR=0; delay2us(); //延时用,因为单片机运行比较慢,可省略,运算快的处理器不可省略 UWR=1; UCS=1; P2=0xFF; //单片机的端口全部拉高 delay2us(); } unsigned char CH375_RD_DAT_PORT( void ) //从ch372读数据 {
uchar temp; P2=0xFF; //单片机的端口全部拉高 A0=0; UCS=0; URD=0; temp=P2; URD=1; UCS=1; P2=0xFF; //单片机的端口全部拉高 return temp; }
void mCh375Interrupt( ) interrupt 0 {
uchar InterruptStatus; CH375_WR_CMD_PORT( CMD_GET_STATUS ); // 获取中断状态并取消中断请求 InterruptStatus = CH375_RD_DAT_PORT( ); // 获取中断状态
switch ( InterruptStatus ) { case USB_INT_EP2_OUT: //接受到批量数据 (计算机发送数据,372接受) { break; } case USB_INT_EP2_IN: // 批量数据发送成功 { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 释放当前USB缓冲区 break; } default: // 其它中断,未用到,解锁后退出即可 { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 释放当前USB缓冲区 break; } } } void ad_int() interrupt 2 //ad中断函数,完成接收数据 { uchar dat1=0,dat2=0,dat3=0,temp=0; CS=0; RD=0; dat3=bz; dat1=P0; temp=P1; CS=1; RD=1; // if(dat3>0) //如果为负数则转换成其补码 // { // dat1=dat1^0xff; // temp=temp^0xe0; // } // else // { // dat1=P0; // temp=P1; // } dat2=(temp&0xe0)>>5; dat3=dat3<<7; dat2=dat2|dat3; if(i<64&&flag==0) //写buffer1 { buffer1[i++]=dat1; buffer1[i++]=dat2; if(i==64) //buffer1写满 { flag=1; i=0; } } else if(i<64&&flag==1) //写buffer2 { buffer2[i++]=dat1; buffer2[i++]=dat2; if(i==64) //buffer2写满 { flag=0; i=0; } } } void pwm() { CCON=0; //初始化PCA控制寄存器 PCA时钟停止运行,清除CF标志,清除所有模式中断标志, CL=0; //复位PCA基础时钟 CH=0; CMOD=0x02; //设置PCA时钟源 FOCS/12 ;除能PCA时钟溢出中断标志 CCAP0H=CCAP0L=0X80;//0X10 PWM0输出占空比为15/16的方波 CCAPM0=0x42; //模式零工作在8位PWM模式,无PCA中断
CCAP1H=CCAP1L=0XFF; PCA_PWM1=0X03; CCAPM1=0X42; CR=1; //开时钟 } 可是我改为下面代码是,却不能发现硬件 //使用25M晶振,STC12c5a60s2单片机 #pragma NOAREGS #include //#include #include #define uchar unsigned char #define uint unsigned int
sbit INT=P3^2; // CH372中断信号输出端 sbit A0=P1^0; // CH372总线选择端 sbit UCS=P3^5; // CH372 片选 端 sbit UWR=P3^6; // CH372写数据 端 sbit URD=P3^7; // CH372 读数据端
sbit EOC=P3^3; // AD转换状态端 sbit CS=P1^2; // AD片选端 sbit RD=P3^4; // AD读数据端 sbit conv=P1^3;
sbit bz=P4^4; //P4^4口,存储正负标志位
void init_CH372(); void delay2us(); void CH375_WR_CMD_PORT(uchar cmd ) ; void CH375_WR_DAT_PORT(uchar dat ); unsigned char CH375_RD_DAT_PORT( void ); void ad7892_init(); void pwm(); //uchar data buffer2[48] ; uchar idata buffer1[ 64 ],buffer2[64]; uchar i; //uchar flag1=0,flag2=1; uchar flag=0,s=2,f1=0,f2=0; // uchar dat1=0,dat2=0,dat3=0,temp=0;
main() { // uchar a=0; uchar j; P4SW=0X10; //将NA引脚设置为普通IO口,P4^4口 IPH=0x04; //PX1H=1 PX1=1; //中断1优先级高 EX1=1; //允许外部中断1 EA=1; //总中断允许 ad7892_init(); //初始化ad转换器 init_CH372(); //ch372初始化 // P4M0=0x00; // P4M1=0x10;//P4^4口配置成高阻输入模式 // P0M0=0x00; // P0M1=0xff;//P0口配置成高阻输入模式 // P1M0=0x00; // P1M1=0xe0;// P1^5,P1^6,P1^7分别配置成高阻输入模式 pwm(); //产生pwm波,以控制ad转换频
////////////////////////////////////////////// while(1) { if(flag==1) //buffer1已满,可以输出 { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 delay2us(); CH375_WR_DAT_PORT( 64 ); //首先写入后续数据长度 delay2us(); while(flag==0) { if(f1==1) { ////////////// for ( j = 0; j < 64; j ++ ) CH375_WR_DAT_PORT( buffer1[i-1 ] ); // 向ch372写入64个数据 CH375_WR_DAT_PORT( buffer1[ i] ); // 向ch372写入64个数据 f1=0; } } // flag=1; //保持flag不变,只在buffer1满时才改变flag的值 } else { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 delay2us(); CH375_WR_DAT_PORT(64 ); //首先写入后续数据长度 delay2us(); while(flag==1)