我選擇的硬件是CH372,89S52,MAX539(DA),MAX144(AD),以實(shí)現(xiàn)PC機(jī)通過(guò)USB接口的數(shù)據(jù)采集及控制。其中AD DA 模塊的程序已搞定,卻不知道如何添加到例子程序TEST.C中,上位機(jī)的程序也沒(méi)看懂(對(duì)如此復(fù)雜程序看來(lái)就頭疼).想請(qǐng)教: (1)如何將AD DA 模塊的程序添加到例子程序TEST.C中 (2)例子中上位機(jī)的程序哪些參數(shù)用來(lái)存放我要發(fā)送和接受的數(shù)據(jù). EMAIL:個(gè)人信息保護(hù),已隱藏 QQ:157267953 DA程序如下: #include #include
#define uint unsigned int #define uchar unsigned char
uint DATA;
sbit P1_1=P1^1;
void dac(); void delayms(unsigned int ms);
main() { delayms(250); DATA=0x6660; //DATA在實(shí)際操作中應(yīng)為由PC機(jī)傳輸?shù)絾纹瑱C(jī)的數(shù)據(jù),此處為了檢驗(yàn)而賦了值 dac(); delayms(2000); }
void dac() {
SCON=0; P1_1=0; SBUF=DATA&0xff; while(!TI); TI=0; SBUF=DATA>>8; while(!TI); TI=0; P1_1=1; }
void delayms(unsigned int ms) // 延時(shí)子程序 { unsigned int i; while(ms--) { for(i = 0; i < 120; i++); } }
TEST.C 下載到單片機(jī)中的程序: #pragma NOAREGS #include #include #include "..\..\MCU_IF2\C\CH375INC.H" /* 頭文件,在網(wǎng)上下載的CH372或者CH375評(píng)估板資料中有 */
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */
/* 延時(shí)2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根據(jù)單片機(jī)的時(shí)鐘選擇初值 */ }
/* 延時(shí)1微秒,不精確,因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無(wú)需延時(shí) */ //void delay1us( ) //{ // unsigned char i; // for ( i = 1; i != 0; i -- ); //}
/* 基本操作 */
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫(xiě)入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) */ delay2us(); CH375_CMD_PORT=cmd; /* ******************** 注釋中是用普通I/O引腳模擬8位并口的時(shí)序,CH375_CS引腳是可選的,可以一直接GND強(qiáng)制片選 CH375_D0_D7 = cmd; CH375_A0 = 1; 選擇CH375的命令口 // CH375_D0_D7_DIR = output; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸出方向 CH375_RD = 1; 如果I/O默認(rèn)電平是高電平,那么這是可選操作 CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; CH375_CS = 1; CH375_A0 = 0; // CH375_D0_D7_DIR = input; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 CH375_D0_D7 = 0xFF; 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 ******************** */ delay2us(); }
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫(xiě)入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ CH375_DAT_PORT=dat; /* ******************** 注釋中是用普通I/O引腳模擬8位并口的時(shí)序 CH375_D0_D7 = dat; // CH375_D0_D7_DIR = output; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸出方向 CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; CH375_CS = 1; // CH375_D0_D7_DIR = input; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 CH375_D0_D7 = 0xFF; 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 ******************** */ // delay1us(); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無(wú)需延時(shí) */ }
unsigned char CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ // delay1us(); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無(wú)需延時(shí) */ /* ******************** 注釋中是用普通I/O引腳模擬8位并口的時(shí)序 // CH375_D0_D7_DIR = input; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 CH375_D0_D7 = 0xFF; 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平,便于輸入 CH375_CS = 0; CH375_RD = 0; // CH375_CS = 0; 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_RD產(chǎn)生寬度至少為80nS的低電平脈沖 unsigned char dat = CH375_D0_D7; CH375_RD = 1; CH375_CS = 1; CH375_D0_D7 = 0xFF; 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 return( dat ); ******************** */ return( CH375_DAT_PORT ); }
/* 延時(shí)50毫秒,不精確 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }
/* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 測(cè)試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測(cè)試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫(xiě)入測(cè)試數(shù)據(jù) */ i = ~ 0x55; /* 返回?cái)?shù)據(jù)應(yīng)該是測(cè)試數(shù)據(jù)取反 */ if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); /* 延時(shí)50ms */ } /* 設(shè)置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } /* if ( i==0 ) { CH372/CH375存在硬件錯(cuò)誤 }; */ /* 下述啟用中斷,假定CH375連接在INT0 */ IT0 = 0; /* 置外部信號(hào)為低電平觸發(fā) */ IE0 = 0; /* 清中斷標(biāo)志 */ EX0 = 1; /* 允許CH375中斷 */ }
/* CH375中斷服務(wù)程序,使用寄存器組1 */ void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ /* 測(cè)試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測(cè)試數(shù)據(jù)是否正確 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }
main( ) { Delay50ms( ); /* 延時(shí)等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號(hào)則不必延時(shí) */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允許中斷 */ while ( 1 ); /* 以下指令開(kāi)始工作循環(huán),等待PC機(jī)命令進(jìn)行操作 */ }
PC中的應(yīng)用程序: #include #include #include #include #include
#include "CH375DLL.H" // CH375的動(dòng)態(tài)鏈接庫(kù)
// 我們?cè)谟?jì)算機(jī)和單片機(jī)的應(yīng)用程序之間約定下傳數(shù)據(jù)的首字節(jié)是命令碼 #define TEST_DATA 0x21 // 測(cè)試數(shù)據(jù)正確性
//程序入口 void main ( ) { int key; unsigned char mBuffer[100]; unsigned char mReadBuf[100]; unsigned long i, mLength, mTestCount, mErrCnt, mStep, mTotal;
printf( "\nCH372/CH375 Bulk Data Test Program V1.1 , Copyright (C) W.ch 2004.12\n" ); printf( "test data correctness \n" );
// 需要使用DLL則需要先加載,沒(méi)有此句則會(huì)自動(dòng)加載 printf( "*** Load DLL: CH375DLL.DLL \n" ); if ( LoadLibrary( "CH375DLL.DLL" ) == NULL ) return; // 加載DLL失敗,可能未安裝到系統(tǒng)中
printf( "*** CH375OpenDevice: 0# \n" ); if ( CH375OpenDevice( 0 ) == INVALID_HANDLE_VALUE ) return; /* 使用之前必須打開(kāi)設(shè)備 */
CH375SetTimeout( 0, 5000, 5000 ); // 設(shè)置USB數(shù)據(jù)讀寫(xiě)的超時(shí),超過(guò)5000mS未完成讀寫(xiě)將強(qiáng)制返回,避免一直等待下去
mErrCnt=0;
printf( "*** Step-1: test data correctness: 10000000 times, random length and data\n" ); for ( mTestCount=0; mTestCount<10000000; ++mTestCount ) // 循環(huán)測(cè)試 { mStep=mTestCount&0x03; switch( mStep ) { case 0: memset( mBuffer, 0x00, 64 ); // 發(fā)送全00H/返回全FFH break; case 1: memset( mBuffer, 0xff, 64 ); // 發(fā)送全FFH/返回全00H break; default: for ( i=0; i<64; i++ ) mBuffer[i]