我寫了一段程序,燒到單片機,單片機和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寫數(shù)據(jù) 端 sbit URD=P3^7; // CH372 讀數(shù)據(jù)端
sbit EOC=P3^3; // AD轉(zhuǎn)換狀態(tài)端 sbit CS=P1^2; // AD片選端 sbit RD=P3^4; // AD讀數(shù)據(jù)端 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引腳設(shè)置為普通IO口,P4^4口 IPH=0x04; //PX1H=1 PX1=1; //中斷1優(yōu)先級高 EX1=1; //允許外部中斷1 EA=1; //總中斷允許 ad7892_init(); //初始化ad轉(zhuǎn)換器 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(); //產(chǎn)生pwm波,以控制ad轉(zhuǎn)換頻
////////////////////////////////////////////// while(1) { if(flag==1) //buffer1已滿,可以輸出 { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 delay2us(); CH375_WR_DAT_PORT( 64 ); //首先寫入后續(xù)數(shù)據(jù)長度 delay2us(); for ( j = 0; j < 64; j ++ ) CH375_WR_DAT_PORT( buffer1[j ] ); // 向ch372寫入64個數(shù)據(jù) flag=1; //保持flag不變,只在buffer1滿時才改變flag的值 } else { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 delay2us(); CH375_WR_DAT_PORT(64 ); //首先寫入后續(xù)數(shù)據(jù)長度 delay2us(); for ( j = 0; j < 64; j ++ ) CH375_WR_DAT_PORT( buffer2[ j ] ); // 向ch372寫入64個數(shù)據(jù) 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 );//設(shè)置USB工作模式 delay2us(); CH375_WR_DAT_PORT( 2 ); //模式代碼為02H時切換到已啟用的USB設(shè)備方式,內(nèi)置固件模式。 for ( m=1000; m!=0; m-- ) // 等待操作成功,通常需要等待10uS-20uS { if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } IT0 = 0; // 置外部信號為低電平觸發(fā) 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寫命令函數(shù) {
P2=cmd; //寫入命令碼 A0=1; //A0=1時寫命令,A0=0時寫數(shù)據(jù) 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寫數(shù)據(jù)函數(shù) {
P2=dat; A0=0; UCS=0; UWR=0; delay2us(); //延時用,因為單片機運行比較慢,可省略,運算快的處理器不可省略 UWR=1; UCS=1; P2=0xFF; //單片機的端口全部拉高 delay2us(); } unsigned char CH375_RD_DAT_PORT( void ) //從ch372讀數(shù)據(jù) {
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 ); // 獲取中斷狀態(tài)并取消中斷請求 InterruptStatus = CH375_RD_DAT_PORT( ); // 獲取中斷狀態(tài)
switch ( InterruptStatus ) { case USB_INT_EP2_OUT: //接受到批量數(shù)據(jù) (計算機發(fā)送數(shù)據(jù),372接受) { break; } case USB_INT_EP2_IN: // 批量數(shù)據(jù)發(fā)送成功 { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 釋放當前USB緩沖區(qū) break; } default: // 其它中斷,未用到,解鎖后退出即可 { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 釋放當前USB緩沖區(qū) break; } } } void ad_int() interrupt 2 //ad中斷函數(shù),完成接收數(shù)據(jù) { 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) //如果為負數(shù)則轉(zhuǎn)換成其補碼 // { // 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ǔ)時鐘 CH=0; CMOD=0x02; //設(shè)置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; //開時鐘 } 可是我改為下面代碼是,卻不能發(fā)現(xiàn)硬件 //使用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寫數(shù)據(jù) 端 sbit URD=P3^7; // CH372 讀數(shù)據(jù)端
sbit EOC=P3^3; // AD轉(zhuǎn)換狀態(tài)端 sbit CS=P1^2; // AD片選端 sbit RD=P3^4; // AD讀數(shù)據(jù)端 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引腳設(shè)置為普通IO口,P4^4口 IPH=0x04; //PX1H=1 PX1=1; //中斷1優(yōu)先級高 EX1=1; //允許外部中斷1 EA=1; //總中斷允許 ad7892_init(); //初始化ad轉(zhuǎn)換器 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(); //產(chǎn)生pwm波,以控制ad轉(zhuǎn)換頻
////////////////////////////////////////////// while(1) { if(flag==1) //buffer1已滿,可以輸出 { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 delay2us(); CH375_WR_DAT_PORT( 64 ); //首先寫入后續(xù)數(shù)據(jù)長度 delay2us(); while(flag==0) { if(f1==1) { ////////////// for ( j = 0; j < 64; j ++ ) CH375_WR_DAT_PORT( buffer1[i-1 ] ); // 向ch372寫入64個數(shù)據(jù) CH375_WR_DAT_PORT( buffer1[ i] ); // 向ch372寫入64個數(shù)據(jù) f1=0; } } // flag=1; //保持flag不變,只在buffer1滿時才改變flag的值 } else { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 delay2us(); CH375_WR_DAT_PORT(64 ); //首先寫入后續(xù)數(shù)據(jù)長度 delay2us(); while(flag==1)