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

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

?? ch375451.c

?? CH372的單片機編程,VC編程,VB編程,dephi編程
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*; CH375/CH372/CH451 EVT
; U2(AT89C51) Program
;
; Website:  http://winchiphead.com
; Email:    tech@winchiphead.com
; Author:   W.ch 2003.12
;
;****************************************************************************
*/

/* MCS-51單片機C語言的示例程序 */

#include <reg52.h>
#include <string.h>
#include "..\..\MCU_IF1\MCS51C\CH375INC.H"

typedef	struct	_COMMAND_PACKET	{	/* 自定義的命令包結構 */
	unsigned char	mCommandCode;		/* 命令請求碼,見下面的定義 */
	unsigned char	mCommandCodeNot;	/* 命令碼的反碼,用于校驗命令包 */
	union	{
		unsigned char	mParameter[5];	/* 參數 */
		struct {
			unsigned char	mBufferID;  /* 緩沖區識別碼,本程序針對MCS51單片機定義: 1-專用功能寄存器SFR, 2-內部RAM, 3-外部RAM, 不過本程序實際只演示內部RAM */
			unsigned int	mBufferAddr;	/* 讀寫操作的起始地址,尋址范圍是0000H-0FFFFH,低字節在前 */
			unsigned int	mLength;	/* 數據塊總長度,低字節在前 */
		} buf;
	} u;
}	mCOMMAND_PACKET,	*mpCOMMAND_PACKET;

#define		CONST_CMD_LEN		0x07	/* 命令塊的長度 */
/* 由于命令與數據都是通過數據下傳管道(USB端點2的OUT)下傳, 為了防止兩者混淆,
 我們可以在計算機應用程序與單片機程序之間約定, 命令塊的長度總是7, 而數據塊的長度肯定不是7, 例如64,32等
 另外, 可以約定, 命令塊的首字節是命令碼, 等等
 本程序約定命令碼: 80H-0FFH是通用命令,適用于各種應用
                   00H-7FH是專用命令,針對各種應用特別定義 */
/* 通用命令 */
#define		DEF_CMD_GET_INFORM		0x90	/* 獲取下位機的說明信息,長度不超過64個字符,字符串以00H結束 */
#define		DEF_CMD_TEST_DATA		0x91	/* 測試命令,下位機將PC機發來的命令包的所有數據取反后返回 */
#define		DEF_CMD_CLEAR_UP		0xA0	/* 在上傳數據塊之前進行同步,實際是讓下位機清除上傳緩沖區的已有內容 */
#define		DEF_CMD_UP_DATA			0xA1	/* 從下位機的指定地址的緩沖區中讀取數據塊(上傳數據塊) */
#define		DEF_CMD_DOWN_DATA		0xA2	/* 向下位機的指定地址的緩沖區中寫入數據塊(下傳數據塊) */
/* 專用命令 */
#define		DEMO_CH451_CMD			0x56	/* PC發送命令給CH451,用于演示CH451的功能 */
/* 對于MCS51單片機在使用通用命令時,還需要指定緩沖區識別碼 */
#define		ACCESS_MCS51_SFR		1		/* 讀寫51單片機的SFR */
#define		ACCESS_MCS51_IRAM		2		/* 讀寫51單片機的內部RAM */
#define		ACCESS_MCS51_XRAM		3		/* 讀寫51單片機的外部RAM */

unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1;		/* CH375命令端口的I/O地址 */
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0;		/* CH375數據端口的I/O地址 */

/* 有關CH451的定義,演示板的連接方式 */
sbit   CH451_dclk=P1^7;      /* 串行數據時鐘上升延激活 */
sbit   CH451_din=P1^6;	     /* 串行數據輸出,接CH451的數據輸入 */
sbit   CH451_load=P1^5;      /* 串行命令加載,上升延激活 */
sbit   CH451_dout=P3^3;      /* INT1,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出 */
unsigned char CH451_KEY;				/* 存放鍵盤中斷中讀取的鍵值 */
unsigned char LAST_KEY;					/* 保存上次的鍵值 */

mCOMMAND_PACKET	CMD_PKT;				/* 命令包結構緩沖區 */
unsigned char data *CurrentRamAddr;		/* 進行數據塊傳輸時保存被讀寫的緩沖區的起始地址 */
unsigned char CurrentRamLen;			/* 進行數據塊傳輸時保存剩余長度 */
bit		FLAG_INT_WAIT;		/* 中斷等待標志,1指示有中斷數據正在CH375中等待發送 */
unsigned char CH451_CMD_H;	/* PC機發給CH451的高4位命令,為0FFH則命令無效 */
unsigned char CH451_CMD_L;  /* PC機發給CH451的低8位命令 */
unsigned char code InformString[16] = "CH375/CH451\x0";	/* 信息字符串 */

/* 延時2微秒,不精確 */
void	Delay2us( )
{
	unsigned char i;
#define DELAY_START_VALUE	1  /* 根據單片機的時鐘選擇初值,20MHz以下為0,30MHz以上為2 */
	for ( i=DELAY_START_VALUE; i!=0; i-- );
}

/* 延時50毫秒,不精確 */
void	Delay50ms( )
{
	unsigned char i, j;
	for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );
}

/* 將PC機的低字節在前的16位字數據轉換為C51的高字節在前的數據 */
unsigned int	BIG_ENDIAN( unsigned int value )
{
	unsigned int  in, out;
	in = value;
	((unsigned char *)&out)[1] = ((unsigned char *)&in)[0];
	((unsigned char *)&out)[0] = ((unsigned char *)&in)[1];
	return( out );
}

/* CH375初始化子程序 */
void	CH375_Init( )
{
	unsigned char i;
	FLAG_INT_WAIT = 0;  /* 清發送中斷等待標志 */
/* 測試CH375是否正常工作,可選操作,通常不需要 */
#ifdef TEST_CH375_FIRST
	CH375_CMD_PORT = CMD_CHECK_EXIST;  /* 測試CH375是否正常工作 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = 0x55;  /* 寫入測試數據 */
	Delay2us( );
	i = ~ 0x55;  /* 返回數據應該是測試數據取反 */
	if ( CH375_DAT_PORT != i ) {  /* CH375不正常 */
		for ( i=80; i!=0; i-- ) {
			CH375_CMD_PORT = CMD_RESET_ALL;  /* 多次重復發命令,執行硬件復位 */
			Delay2us( );
		}
		CH375_CMD_PORT = 0;
		Delay50ms( );  /* 延時50ms */
	}
#endif
#ifdef USE_MY_USB_ID
/* 設置外部自定義的USB設備VID和PID,可選操作,不執行該命令則使用默認的VID和PID */
	CH375_CMD_PORT = CMD_SET_USB_ID;  /* 設置外部自定義的USB設備VID和PID,可選操作 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = (unsigned char)MY_USB_VENDOR_ID;  /* 寫入廠商ID的低字節 */
	CH375_DAT_PORT = (unsigned char)(MY_USB_VENDOR_ID>>8);  /* 寫入廠商ID的高字節 */
	CH375_DAT_PORT = (unsigned char)MY_USB_DEVICE_ID;  /* 寫入設備ID的低字節 */
	CH375_DAT_PORT = (unsigned char)(MY_USB_DEVICE_ID>>8);  /* 寫入設備ID的高字節 */
	Delay2us( );
#endif
/* 設置USB工作模式, 必要操作 */
	CH375_CMD_PORT = CMD_SET_USB_MODE;
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = 2;  /* 設置為使用內置固件的USB設備方式 */
	for ( i=100; i!=0; i-- ) {  /* 等待操作成功,通常需要等待10uS-20uS */
		if ( CH375_DAT_PORT==CMD_RET_SUCCESS ) break;
	}
/*	if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */
/* 下述啟用中斷,假定CH375連接在INT0 */
	IT0 = 0;  /* 置外部信號為低電平觸發 */
	IE0 = 0;  /* 清中斷標志 */
	EX0 = 1;  /* 允許CH375中斷 */
}

/* 加載上傳數據 */
void	LoadUpData( unsigned char data *Buf, unsigned char Len )
{
	unsigned char i;
	CH375_CMD_PORT = CMD_WR_USB_DATA7;  /* 向USB端點2的發送緩沖區寫入數據塊 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	CH375_DAT_PORT = Len;  /* 首先寫入后續數據長度 */
	for ( i=0; i<Len; i++ ) CH375_DAT_PORT = Buf[i];  /* 加載數據 */
}

/* CH375中斷服務程序INT0,使用寄存器組1 */
void	mCH375Interrupt( ) interrupt 0 using 1
{
	unsigned char InterruptStatus;
	unsigned char length, c1, len1, len2, i;
#define		cmd_buf		((unsigned char data *)(&CMD_PKT))
	CH375_CMD_PORT = CMD_GET_STATUS;  /* 獲取中斷狀態并取消中斷請求 */
	Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
	InterruptStatus = CH375_DAT_PORT;  /* 獲取中斷狀態 */
	IE0 = 0;  /* 清中斷標志,對應于INT0中斷 */
	if ( InterruptStatus == USB_INT_EP2_OUT ) {  /* 批量端點下傳成功 */
		CH375_CMD_PORT = CMD_RD_USB_DATA;  /* 從當前USB中斷的端點緩沖區讀取數據塊,并釋放緩沖區 */
		Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
		length = CH375_DAT_PORT;  /* 首先讀取后續數據長度 */
		if ( length == CONST_CMD_LEN ) {  /* 命令塊長度總是CONST_CMD_LEN,分析并處理命令 */
/* 分析通過USB接收到的命令塊,長度總是CONST_CMD_LEN,首字節為命令,其余為可選的參數,這種命令結構是由單片機和計算機應用層之間自行定義的 */
			for ( i=0; i<CONST_CMD_LEN; i++ ) cmd_buf[i] = CH375_DAT_PORT;  /* 接收命令包的數據 */
			if ( CMD_PKT.mCommandCode != (unsigned char)( ~ CMD_PKT.mCommandCodeNot ) ) return;  /* 命令包反碼校驗錯誤 */
			switch ( CMD_PKT.mCommandCode ) {  /* 分析命令碼,switch可以用多個if/else代替 */
				case DEF_CMD_GET_INFORM:  /* 獲取下位機的說明信息,長度不超過64個字符,字符串以00H結束 */
					CH375_CMD_PORT = CMD_WR_USB_DATA7;  /* 向USB端點2的發送緩沖區寫入數據塊 */
					Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
					CH375_DAT_PORT = 16;  /* 首先寫入后續數據長度 */
					for ( i=0; i<16; i++ ) CH375_DAT_PORT = InformString[i];  /* 加載數據 */
					break;
				case DEF_CMD_TEST_DATA:  /* 測試命令,下位機將PC機發來的命令包的所有數據取反后返回 */
					CH375_CMD_PORT = CMD_WR_USB_DATA7;  /* 向USB端點2的發送緩沖區寫入數據塊 */
					Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
					CH375_DAT_PORT = CONST_CMD_LEN;  /* 首先寫入后續數據長度 */
					for ( i=0; i<CONST_CMD_LEN; i++ ) CH375_DAT_PORT = ~ cmd_buf[i];  /* 加載數據,數據取反后返回,由計算機應用程序測試數據是否正確 */
					break;
				case DEF_CMD_CLEAR_UP:  /* 在上傳數據塊之前進行同步,實際是讓下位機清除上傳緩沖區的已有內容 */
/* 連續上傳數據塊之前進行同步,實際是讓單片機清除上傳緩沖區的已有內容
; 如果上一次進行數據上傳時,計算機提前結束上傳,那么有可能在上傳緩沖區中遺留有數據,所以在第二次上傳前需要清除上傳緩沖區 */
					CH375_CMD_PORT = CMD_SET_ENDP7;  /* 設置USB端點2的IN,也就是批量上傳端點 */
					Delay2us( );  /* 如果時鐘頻率低于16MHz則無需該指令延時 */
					CH375_DAT_PORT = 0x0e;  /* 同步觸發位不變,設置USB端點2的IN正忙,返回NAK */
					break;
				case DEF_CMD_UP_DATA:  /* 從下位機的指定地址的緩沖區中讀取數據塊(上傳數據塊) */
/* 連續上傳數據塊, 本程序實際只演示內部RAM */
/*					switch ( CMD_PKT.u.buf.mBufferID ) {
						case ACCESS_MCS51_SFR:  讀寫51單片機的SFR
						case ACCESS_MCS51_IRAM:  讀寫51單片機的內部RAM
						case ACCESS_MCS51_XRAM:  讀寫51單片機的外部RAM
					} */
					CurrentRamAddr = (unsigned char)BIG_ENDIAN( CMD_PKT.u.buf.mBufferAddr );  /* 起始地址,對于內部RAM只用低8位地址 */
					CurrentRamLen = (unsigned char)BIG_ENDIAN( CMD_PKT.u.buf.mLength );  /* 數據塊長度,對于內部RAM總長度不可能超過256 */
					len1 = CurrentRamLen >= CH375_MAX_DATA_LEN ? CH375_MAX_DATA_LEN : CurrentRamLen;  /* 數據上傳,準備第一組數據 */
					LoadUpData( CurrentRamAddr, len1);  /* 加載上傳數據 */
					CurrentRamLen -= len1;
					CurrentRamAddr += len1;
					break;
				case DEF_CMD_DOWN_DATA:  /* 向下位機的指定地址的緩沖區中寫入數據塊(下傳數據塊) */
/* 連續下傳數據塊, 本程序實際只演示外部RAM */
					CurrentRamAddr = BIG_ENDIAN( CMD_PKT.u.buf.mBufferAddr );  /* 起始地址 */
					CurrentRamLen = BIG_ENDIAN( CMD_PKT.u.buf.mLength );  /* 數據塊長度 */
					break;
				case DEMO_CH451_CMD:  /* PC發送命令給CH451,用于演示CH451的功能 */
/*; 為了防止在CH375中斷服務程序打斷主程序中的CH451_READ而執行CH451_WRITE產生錯誤
; 所以在此保存CH451的命令碼由主程序在空閑時發給CH451 */
					CH451_CMD_L = CMD_PKT.u.mParameter[1];  /* 低8位命令 */
					CH451_CMD_H = CMD_PKT.u.mParameter[2];  /* 高4位命令 */
					break;
				default:
					break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产亚洲在线| 欧美大肚乱孕交hd孕妇| 91丨porny丨国产| 972aa.com艺术欧美| 色婷婷综合久久久中文一区二区| 91在线观看高清| 精品视频999| 国产蜜臀97一区二区三区| 一区二区在线免费| 麻豆国产一区二区| 成人av资源在线| 欧美一级片在线看| 中文字幕一区二区在线观看| 丝袜诱惑亚洲看片| 丁香亚洲综合激情啪啪综合| 777久久久精品| 国产精品乱码一区二三区小蝌蚪| 亚洲地区一二三色| 99久久婷婷国产综合精品电影 | 爽爽淫人综合网网站| 亚洲欧美日韩久久精品| 在线精品视频一区二区| 亚洲国产日韩精品| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美大片国产精品| 亚洲激情欧美激情| 成人国产精品免费观看动漫| 精品女同一区二区| 免费不卡在线视频| 欧美一级生活片| 麻豆成人免费电影| 欧美mv日韩mv| 久久99国内精品| 欧美福利电影网| 日韩在线一区二区| 欧美在线观看视频一区二区| 国产精品美女一区二区| 成人性视频免费网站| 久久九九99视频| 色综合网站在线| 日韩不卡一区二区| 日韩手机在线导航| 精品制服美女丁香| 国产精品久久久久久久裸模| 色欧美片视频在线观看| 亚洲综合一区二区三区| 欧美日韩极品在线观看一区| 免费成人在线播放| 国产午夜精品福利| 欧美午夜在线一二页| 91女人视频在线观看| 国产精品欧美一区二区三区| 欧美性色黄大片| 国内精品自线一区二区三区视频| 国产人成亚洲第一网站在线播放| 97久久精品人人做人人爽50路| 亚洲一区二区三区在线看| 精品国产三级a在线观看| 色一情一乱一乱一91av| 美腿丝袜在线亚洲一区| 成人欧美一区二区三区白人| 欧美视频日韩视频| 国产在线视频精品一区| 一区二区三区.www| 久久综合九色综合97_久久久| 99这里都是精品| 国产精品一区二区视频| 亚洲精品国产品国语在线app| 日韩精品在线网站| 日本高清不卡一区| 黄色小说综合网站| 蜜桃久久av一区| 蜜臀精品一区二区三区在线观看| 久久久午夜精品| 91精品久久久久久蜜臀| 高清不卡一区二区在线| 国产精品一二三四| 国产91露脸合集magnet| 日韩国产欧美视频| 天天综合天天做天天综合| 亚洲自拍偷拍欧美| 亚洲国产一二三| 午夜精品视频一区| 久久精品国产亚洲a| 国产精品99久久久久久宅男| 国产麻豆精品在线观看| 成人免费高清视频在线观看| 欧美日韩精品一区二区三区| 欧美一区二区视频免费观看| 国产精品美女一区二区在线观看| 伊人婷婷欧美激情| 国产一区二区在线影院| 日本久久电影网| 精品国产免费人成在线观看| 亚洲综合色网站| 成人小视频在线观看| 91精品欧美综合在线观看最新 | 中文字幕佐山爱一区二区免费| 亚洲欧美一区二区三区极速播放| 亚洲综合色区另类av| 久久99国产精品尤物| 色婷婷精品久久二区二区蜜臀av| 日韩一区二区电影在线| 亚洲三级久久久| 国内精品嫩模私拍在线| 欧美日韩一区三区| 久久色在线观看| 天天亚洲美女在线视频| 99re视频这里只有精品| 精品奇米国产一区二区三区| 亚洲卡通动漫在线| 成人爽a毛片一区二区免费| 欧美一区二区三区的| 亚洲精品国产第一综合99久久| 国产激情精品久久久第一区二区| 欧美久久久久久久久久| 亚洲成人动漫精品| 在线观看免费成人| 亚洲男人的天堂av| 91蝌蚪porny| 亚洲黄色录像片| 欧美伊人久久大香线蕉综合69| 国产精品久久看| 丁香婷婷综合激情五月色| 久久亚洲一区二区三区明星换脸| 免费在线观看一区二区三区| 91麻豆精品久久久久蜜臀| 亚洲主播在线播放| 欧美福利视频一区| 久久国产生活片100| 精品国产网站在线观看| 国产高清精品久久久久| 国产欧美一区二区精品忘忧草| 欧美三级韩国三级日本一级| 一个色综合网站| 精品少妇一区二区三区日产乱码| 麻豆成人av在线| 国产精品国产三级国产专播品爱网 | 色网站国产精品| 亚洲成人黄色影院| 国产肉丝袜一区二区| 91福利社在线观看| 美女视频免费一区| 国产精品国产三级国产aⅴ无密码| 色老头久久综合| 国产精品亚洲第一区在线暖暖韩国 | 久久久久国色av免费看影院| 欧美亚洲高清一区| 国产不卡在线播放| 亚洲国产三级在线| 国产亚洲精品福利| 日韩午夜中文字幕| 成人免费视频一区二区| 精品一区二区三区香蕉蜜桃 | 日韩欧美在线网站| 日本高清不卡视频| av高清不卡在线| 国产一区二区三区免费| 亚洲bdsm女犯bdsm网站| 国产精品免费免费| 国产午夜精品理论片a级大结局| 国产午夜亚洲精品午夜鲁丝片| 欧美日韩五月天| 欧美亚洲综合在线| 色天使色偷偷av一区二区| 99久久久国产精品免费蜜臀| 国产麻豆精品95视频| 蜜桃av一区二区| 免费在线视频一区| 久久国产综合精品| 青青草国产成人99久久| 日韩不卡在线观看日韩不卡视频| 亚洲午夜久久久久久久久电影院| 国产精品成人免费在线| 国产精品久久久久影院色老大| 亚洲国产成人一区二区三区| 国产午夜一区二区三区| 亚洲蜜桃精久久久久久久| 亚洲一区二区三区在线播放| 日本人妖一区二区| 久久成人18免费观看| 国产黄人亚洲片| 一本一本大道香蕉久在线精品 | 亚洲成人tv网| 国内精品伊人久久久久av一坑| 国产乱码精品一区二区三区忘忧草| 成人免费的视频| 欧美肥妇bbw| 国产精品久久三区| 蜜臂av日日欢夜夜爽一区| 99久久久无码国产精品| 欧美日韩亚洲综合在线 | 国产精品国产三级国产普通话蜜臀 | 成人午夜精品在线| 欧美性xxxxxxxx| 国产精品久久777777| 美国一区二区三区在线播放| 91亚洲永久精品| 精品久久久久久久久久久院品网| 亚洲日本va午夜在线电影|