亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ch375hms.c

?? 是關于C8051系列的各個模塊的代碼
?? C
字號:
/* 2004.06.05
****************************************
**  Copyright  (C)  W.ch  1999-2004   **
**  Web:  http://www.winchiphead.com  **
****************************************
**  USB Host File Module      @CH375  **
**  TC2.0@PC, KC7.0@MCS51             **
****************************************
*/
/* U盤文件讀寫模塊, 連接方式: 串口+查詢 */
/* MCS-51單片機C語言示例程序 */
/* 因為使用U盤文件讀寫模塊而不是使用U盤文件級子程序庫,所以占用較少的單片機資源,可以使用89C51單片機測試 */
/* 以字節為單位進行U盤文件讀寫,單片機的RAM只需要幾十個字節,不需要外部RAM */

#include <reg51.h>
#include <absacc.h>
#include <string.h>
#include <stdio.h>

#define MAX_PATH_LEN			32		/* 最大路徑長度,含所有斜杠分隔符和小數點間隔符以及路徑結束符00H,CH375模塊支持的最大值是62,最小值是13 */
#include "..\CH375HM.H"

/* 電路連接方式
   單片機    模塊
    TXD   =  SIN
    RXD   =  SOUT
    P15   =  STA#
*/
sbit	P15					=	P1^5;
#define	CH375HM_STA				P15		/* 假定CH375模塊的STA#引腳連接到單片機的P15引腳 */

CMD_PARAM	idata	mCmdParam;			/* 默認情況下該結構將占用60字節的RAM,可以修改MAX_PATH_LEN常量,當修改為32時,只占用32字節的RAM */
unsigned char		TempLength;			/* 臨時緩沖區中的數據長度,從原文件中第二次讀出的字節數 */
unsigned char idata	TempBuffer[20];		/* 臨時緩沖區,存放從原文件中讀出的內容 */

sbit	LED_OUT		=	P1^4;			/* P1.4 低電平驅動LED顯示,用于監控演示程序的進度 */

/* 以毫秒為單位延時,適用于24MHz時鐘 */
void	mDelaymS( unsigned char delay )
{
	unsigned char	i, j, c;
	for ( i = delay; i != 0; i -- ) {
		for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz時鐘下延時500uS */
		for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz時鐘下延時500uS */
	}
}

/* 發送一個字節數據給CH375模塊 */
void	mSendByte( unsigned char c )
{
	TI = 0;
	SBUF = c;
	while ( TI == 0 );
}

/* 從CH375模塊接收一個字節數據 */
unsigned char	mRecvByte( )
{
	unsigned char	c;
	while ( RI == 0 );
	c = SBUF;
	RI = 0;
	return( c );
}

/* 執行命令 */
unsigned char	ExecCommand( unsigned char cmd, unsigned char len )
/* 輸入命令碼和輸入參數長度,返回操作狀態碼,輸入參數和返回參數都在CMD_PARAM結構中 */
{
	unsigned char		i, j, status;
	CH375HM_STA = 0;  /* 產生下降沿通知模塊,說明命令碼開始發送,請求開始執行命令 */
	CH375HM_STA = 0;  /* 僅作延時,低電平寬度不小于1uS */
	RI = 0;
	CH375HM_STA = 1;
	mSendByte( cmd );  /* 寫入命令碼 */
	mSendByte( len );  /* 寫入后續參數的長度 */
	if ( len ) {  /* 有參數 */
		for ( i = 0; i != len; i ++ ) mSendByte( mCmdParam.Other.mBuffer[ i ] );  /* 依次寫入參數 */
	}
	while ( 1 ) {  /* 處理數據傳輸,直到操作完成才退出 */
		status = mRecvByte( );  /* 等待模塊完成操作并返回操作狀態 */
		if ( status == ERR_SUCCESS ) {  /* 操作成功 */
			i = mRecvByte( );  /* 返回結果數據的長度 */
			if ( i ) {  /* 有結果數據 */
				j = 0;
				do {  /* 使用do+while結構是因為其效率高于for */
					mCmdParam.Other.mBuffer[ j ] = mRecvByte( );  /* 接收結果數據并保存到參數結構中 */
					j ++;
				} while ( -- i );
			}
			break;  /* 操作成功返回 */
		}
		else if ( status == USB_INT_DISK_READ || status == USB_INT_DISK_WRITE || status == USB_INT_DISK_RETRY ) {  /* 正在從U盤讀數據塊,請求數據讀出,正在向U盤寫數據塊,請求數據寫入,讀寫數據塊失敗重試 */
			break;  /* 本程序只使用以字節為單位的文件讀寫子程序,所以正常情況下不會收到該狀態碼,操作失敗返回 */
		}
		else {  /* 操作失敗 */
			if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) mDelaymS( 100 );  /* U盤剛剛連接或者斷開,應該延時幾十毫秒再操作 */
			break;  /* 操作失敗返回 */
		}
	}
	return( status );
}

/* 檢查操作狀態,如果錯誤則顯示錯誤代碼并停機 */
void	mStopIfError( unsigned char iError )
{
	unsigned char	led;
	if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */
/*	printf( "Error: %02X\n", (unsigned short)iError );*/  /* 顯示錯誤 */
	led=0;
	while ( 1 ) {
		LED_OUT = led&1;  /* LED閃爍 */
		mDelaymS( 100 );
		led^=1;
	}
}

main( ) {
	unsigned char	i;
	unsigned short	count;
	unsigned char	*pStr;
	LED_OUT = 0;  /* 開機后LED亮一下以示工作 */
	mDelaymS( 100 );  /* 延時100毫秒,CH375模塊上電后需要100毫秒左右的復位時間 */
	mDelaymS( 100 );
	LED_OUT = 1;
/* 設置與CH375模塊通訊的串口 */
	SCON = 0x50;
	PCON = 0x80;
	TMOD = 0x20;
	TH1 = 0xE6;  /* 24MHz晶振, 4800bps */
	TR1 = 1;
/* 由于4800bps較慢,所以下面用命令將其修改為9600bps */
	mCmdParam.BaudRate.mDivisor = 18432000/32/9600;  /* 輸入參數: 通訊波特率除數,假定模塊的晶體X2的頻率為18.432MHz */
	i = ExecCommand( CMD_BaudRate, 1 );  /* 設置串口通訊波特率 */
	mStopIfError( i );
	TH1 = 0xF3;  /* 24MHz晶振, 將自身串口的通訊波特率調整到9600bps */
	mDelaymS( 5 );  /* 延時5毫秒,確保CH375模塊切換到新設定的通訊波特率 */
/*	printf( "Start\n" );*/
	while ( 1 ) {  /* 主循環 */
/*		printf( "Wait\n" );*/
		while ( 1 ) {  /* 使用查詢方式看U盤是否連接 */
			i = ExecCommand( CMD_QueryStatus, 0 );  /* 查詢當前模塊的狀態 */
			mStopIfError( i );
			if ( mCmdParam.Status.mDiskStatus >= DISK_CONNECT ) break;  /* U盤已經連接 */
			mDelaymS( 100 );  /* 可以在打算讀寫U盤時再查詢,沒有必要一直連續不停地查詢,可以讓單片機做其它事,沒事可做就延時等待一會再查詢 */
		}
		mDelaymS( 200 );  /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */
		LED_OUT = 0;  /* LED亮 */
/* 檢查U盤是否準備好,大多數U盤不需要這一步,但是某些U盤必須要執行這一步才能工作 */
		for ( i = 0; i < 5; i ++ ) {
			mDelaymS( 100 );
//			printf( "Ready ?\n" );
			if ( ExecCommand( CMD_DiskReady, 0 ) == ERR_SUCCESS ) break;  /* 查詢磁盤是否準備好 */
		}
/* 讀取原文件 */
/*		printf( "Open\n" );*/
		strcpy( mCmdParam.Open.mPathName, "\\C51\\CH375HFT.C" );  /* 文件名,該文件在C51子目錄下 */
		i = ExecCommand( CMD_FileOpen, MAX_PATH_LEN );  /* 打開文件,輸入參數置為最大值,省得再計算參數長度 */
		TempLength = 0;
		if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) {  /* ERR_MISS_DIR說明沒有找到C51子目錄,ERR_MISS_FILE說明沒有找到文件 */
//			printf( "找不到原文件/C51/CH375HFT.C\n" );
		}
		else {  /* 找到文件\C51\CH375HFT.C或者出錯 */
			mStopIfError( i );
			mCmdParam.ByteRead.mByteCount = 6;  /* 請求讀出6字節數據, 單次讀寫的長度不能超過 sizeof( mCmdParam.ByteWrite.mByteBuffer ) */
			i = ExecCommand( CMD_ByteRead, 1 );  /* 以字節為單位讀取數據 */
			mStopIfError( i );
//			printf( "從文件中讀出的前6個字符是[" );
//			for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] );
//			printf( "]\n" );
//			if ( mCmdParam.ByteRead.mByteCount<6 ) printf( "已經到文件的末尾\n" );
			if ( mCmdParam.ByteRead.mByteCount==6 ) {  /* 未到文件末尾 */
				mCmdParam.ByteRead.mByteCount = 20;  /* 請求再讀出20字節數據, 單次讀寫的長度不能超過 sizeof( mCmdParam.ByteWrite.mByteBuffer ) */
				i = ExecCommand( CMD_ByteRead, 1 );  /* 以字節為單位讀取數據,接著剛才的向后讀 */
				mStopIfError( i );
				TempLength = mCmdParam.ByteRead.mByteCount;  /* 第二次讀出字節數 */
				memcpy( TempBuffer, mCmdParam.ByteRead.mByteBuffer, TempLength );  /* 暫存第二次讀出的數據以便寫入新文件中 */
//				printf( "從文件中讀出的第6個字符開始依次是[" );
//				for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] );
//				printf( "]\n" );
//				if ( mCmdParam.ByteRead.mByteCount<20 ) printf( "已經到文件的末尾\n" );
			}
/*			printf( "Close\n" );*/
			mCmdParam.Close.mUpdateLen = 0;
			i = ExecCommand( CMD_FileClose, 1 );  /* 關閉文件 */
			mStopIfError( i );
		}
/* 產生新文件 */
/*		printf( "Create\n" );*/
/*		strcpy( mCmdParam.Create.mPathName, "\\NEWFILE.TXT" );*/
		strcpy( mCmdParam.Create.mPathName, "\\雙擊我吧.TXT" );  /* 新文件名,在根目錄下 */
		i = ExecCommand( CMD_FileCreate, MAX_PATH_LEN );  /* 新建文件并打開,如果文件已經存在則先刪除后再新建 */
		mStopIfError( i );
/*		printf( "ByteLocate\n" );*/
//		mCmdParam.ByteLocate.mByteOffset = 0;  /* 移動到文件頭,用于重新回到文件頭,以便寫入數據覆蓋原數據 */
//		ExecCommand( CMD_ByteLocate, 4 );  /* 以字節為單位移動文件指針 */
//		mCmdParam.ByteLocate.mByteOffset = 0xFFFFFFFF;  /* 移動到文件尾,用于在CMD_FileOpen打開文件后,繼續追加數據到已打開文件的末尾 */
//		ExecCommand( CMD_ByteLocate, 4 );  /* 以字節為單位移動文件指針 */
/*		printf( "Write\n" );*/
		pStr = "Note: \xd\xa這個程序是以字節為單位進行U盤文件讀寫,單片機只需要有幾十字節的RAM,不需要外部RAM,\xd\xa首先從/C51/CH375HFT.C文件中讀出前20個字符,然后寫到本說明的下一行\xd\xa";
		count = strlen( pStr );  /* 準備寫入的數據的總長度 */
		while ( count ) {  /* 如果較大,分多次寫入 */
			if ( count < sizeof( mCmdParam.ByteWrite.mByteBuffer ) ) i = count;  /* 只剩最后一些數據要寫入 */
			else i = sizeof( mCmdParam.ByteWrite.mByteBuffer );  /* 數據較多,分多次寫入 */
			count -= i;  /* 計數 */
			memcpy( mCmdParam.ByteWrite.mByteBuffer, pStr, i );  /* 復制準備寫入的數據到參數結構中,源數據可以來自ADC等,本例是來自程序空間的說明信息 */
			pStr += i;
			mCmdParam.ByteWrite.mByteCount = i;  /* 指定本次寫入的字節數 */
			i = ExecCommand( CMD_ByteWrite, 1+i );  /* 以字節為單位向文件寫入數據 */
			mStopIfError( i );
		}
//		mCmdParam.ByteWrite.mByteCount = 0;  /* 指定寫入0字節,用于刷新文件的長度,注意如果字節數不為0那么CMD_ByteWrite只負責寫入數據而不修改文件長度 */
//		ExecCommand( CMD_ByteWrite, 1 );  /* 以字節為單位向文件寫入數據,因為是0字節寫入,所以只用于更新文件的長度,當階段性寫入數據后,可以用這種辦法更新文件長度 */
		memcpy( mCmdParam.ByteWrite.mByteBuffer, TempBuffer, TempLength );
		mCmdParam.ByteWrite.mByteCount = TempLength;  /* 將原文件中的20個字節的數據添加到新文件的末尾 */
		i = ExecCommand( CMD_ByteWrite, 1+TempLength );  /* 以字節為單位向文件寫入數據 */
		mStopIfError( i );
/*		printf( "Close\n" );*/
		mCmdParam.Close.mUpdateLen = 1;  /* 自動計算文件長度,當以字節為單位向文件寫入數據后,如果沒有用0長度的CMD_ByteWrite更新文件長度,那么可以在關閉文件時讓模塊自動更新文件長度 */
		i = ExecCommand( CMD_FileClose, 1 );  /* 關閉文件,當以字節為單位向文件寫入(追加)數據后,必須在用完文件后關閉文件 */
		mStopIfError( i );

/* 等待U盤斷開 */
/*		printf( "Take_out\n" );*/
		while ( 1 ) {  /* 使用查詢方式看U盤是否斷開 */
			i = ExecCommand( CMD_QueryStatus, 0 );  /* 查詢當前模塊的狀態 */
			mStopIfError( i );
			if ( mCmdParam.Status.mDiskStatus <= DISK_DISCONNECT ) break;  /* U盤已經斷開 */
			mDelaymS( 100 );  /* 沒有必要一直連續不停地查詢,可以讓單片機做其它事,沒事可做就延時等待一會再查詢 */
		}
		LED_OUT = 1;  /* LED滅 */
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕在线观看一区| 国产寡妇亲子伦一区二区| 中文字幕精品一区二区精品绿巨人| 欧美日韩国产在线观看| 91香蕉国产在线观看软件| 国产成+人+日韩+欧美+亚洲| 国产精品18久久久久久久久久久久| 久久99久久久欧美国产| 韩国av一区二区三区在线观看| 久久超级碰视频| 国产一区二区三区日韩| 国产成人亚洲综合色影视| 成人av网站免费| 91麻豆123| 日韩午夜小视频| 精品福利一区二区三区免费视频| 久久精品在这里| 亚洲综合自拍偷拍| 日韩高清不卡一区| 91丨porny丨户外露出| 色婷婷久久久亚洲一区二区三区 | 亚洲国产日韩一区二区| 日韩国产精品91| 国产99久久久国产精品免费看| 91免费观看视频| 宅男噜噜噜66一区二区66| 日韩欧美精品在线视频| 国产精品国产三级国产aⅴ中文 | 欧美手机在线视频| 精品欧美一区二区久久| 国产精品电影一区二区| 天堂久久一区二区三区| 成人久久久精品乱码一区二区三区| 成人aaaa免费全部观看| 欧美日韩国产在线观看| 欧美国产一区在线| 蜜臀久久99精品久久久画质超高清| 精品一区二区久久| 伊人性伊人情综合网| 美女性感视频久久| 91在线视频官网| 精品999在线播放| 亚洲一区二三区| 国产成人免费9x9x人网站视频| 欧美性色aⅴ视频一区日韩精品| 日韩精品一区二区三区中文精品| |精品福利一区二区三区| 美国十次了思思久久精品导航| 成人动漫视频在线| 久久毛片高清国产| 看片的网站亚洲| 91搞黄在线观看| 中文字幕精品—区二区四季| 久久精品国产一区二区三| 久久女同互慰一区二区三区| 五月激情综合网| 色婷婷综合久色| 国产精品萝li| 国产精品538一区二区在线| 欧美一区二区在线视频| 亚洲午夜国产一区99re久久| 99精品视频免费在线观看| 国产女主播一区| 国产成人免费视频| 久久―日本道色综合久久| 久久激情综合网| 欧美人xxxx| 午夜精品aaa| 欧美剧情片在线观看| 亚洲国产另类av| 欧美日韩国产免费一区二区 | 精品少妇一区二区三区视频免付费| 亚洲成人av电影在线| 精品视频一区二区三区免费| 亚洲一区二区三区不卡国产欧美| 色94色欧美sute亚洲13| 亚洲欧美激情插| 色视频成人在线观看免| 亚洲成在线观看| 欧美精品乱码久久久久久| 婷婷开心久久网| 9191精品国产综合久久久久久| 日韩精品亚洲专区| 精品噜噜噜噜久久久久久久久试看| 蜜桃av一区二区在线观看| 国产日产亚洲精品系列| 精品亚洲成a人在线观看 | 久久久激情视频| 国产成人8x视频一区二区| 国产日产欧美一区| 色噜噜狠狠成人中文综合| 亚洲一区影音先锋| 91超碰这里只有精品国产| 看片网站欧美日韩| 国产精品美女久久久久久久久 | 正在播放亚洲一区| 六月婷婷色综合| 国产日产欧美一区| 在线亚洲一区观看| 青椒成人免费视频| 中国av一区二区三区| 在线欧美小视频| 久久9热精品视频| 国产精品色一区二区三区| 欧美午夜影院一区| 国产麻豆日韩欧美久久| 亚洲精品综合在线| 亚洲精品在线三区| 91精品国产综合久久精品麻豆| 国产精品一级黄| 一区二区三区四区精品在线视频| 欧美一区二区三区性视频| 国产成人av电影在线观看| 亚洲国产一区二区三区青草影视| 欧美videossexotv100| 91浏览器在线视频| 国产毛片精品视频| 日本va欧美va精品发布| 亚洲图片激情小说| 久久久久99精品国产片| 欧美日韩五月天| 91视频观看免费| 国产成人自拍高清视频在线免费播放| 亚洲综合色网站| 国产精品国产三级国产普通话三级| 91精品国产综合久久婷婷香蕉| 91老司机福利 在线| 国产一区二区在线视频| 亚洲妇女屁股眼交7| 亚洲猫色日本管| 国产精品三级久久久久三级| 91麻豆精品国产91久久久久 | 国产欧美日韩不卡| 日韩一区二区三区四区五区六区| 91搞黄在线观看| 97成人超碰视| av午夜一区麻豆| 国产91丝袜在线18| 国产乱码精品一区二区三区五月婷| 日韩国产欧美在线观看| 亚洲chinese男男1069| 亚洲美女偷拍久久| 亚洲激情六月丁香| 一区二区三区欧美亚洲| 亚洲精品视频一区| 亚洲品质自拍视频| 亚洲欧美国产77777| 亚洲免费观看视频| 亚洲欧美一区二区三区极速播放| 1000精品久久久久久久久| 国产精品视频九色porn| 中文字幕精品三区| 中文一区二区完整视频在线观看| 久久影视一区二区| 亚洲国产精品av| 椎名由奈av一区二区三区| 亚洲欧美日韩国产成人精品影院 | 日韩一本二本av| 欧美成人vr18sexvr| 久久人人爽爽爽人久久久| 国产喂奶挤奶一区二区三区| 久久精品亚洲一区二区三区浴池| 精品美女一区二区| 久久久噜噜噜久久中文字幕色伊伊| 欧美写真视频网站| 国产一区二区三区电影在线观看| 黑人巨大精品欧美一区| 成人伦理片在线| 91美女视频网站| 欧美在线免费播放| 777欧美精品| 国产欧美va欧美不卡在线| 亚洲品质自拍视频| 天堂久久久久va久久久久| 韩国视频一区二区| 9l国产精品久久久久麻豆| 欧美日韩三级在线| 久久久久国产精品人| 亚洲精品免费电影| 美女视频黄 久久| 成人av电影免费观看| 欧美日韩亚洲高清一区二区| 亚洲精品在线观看网站| 亚洲美女在线国产| 久久99精品国产.久久久久| 91在线免费看| 91精品久久久久久久99蜜桃| 国产精品麻豆久久久| 日本在线不卡视频| jvid福利写真一区二区三区| 欧美一级理论性理论a| 中文字幕一区视频| 精品一区二区三区在线播放视频 | 欧美在线观看视频一区二区三区| 日韩一区二区中文字幕| 亚洲柠檬福利资源导航| 精品亚洲成a人在线观看| 欧美自拍偷拍一区| 国产精品视频你懂的| 韩日av一区二区|