?? ch375451.lst
字號:
C51 COMPILER V7.06 CH375451 02/21/2008 17:32:43 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CH375451
OBJECT MODULE PLACED IN CH375451.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CH375451.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*; CH375/CH372/CH451 EVT
2 ; U2(AT89C51) Program
3 ;
4 ; Website: http://winchiphead.com
5 ; Email: tech@winchiphead.com
6 ; Author: W.ch 2003.12
7 ;
8 ;****************************************************************************
9 */
10
11 /* MCS-51單片機C語言的示例程序 */
12
13 #include <reg52.h>
14 #include <string.h>
15 #include "CH375INC.H"
16
17 typedef struct _COMMAND_PACKET { /* 自定義的命令包結(jié)構(gòu) */
18 unsigned char mCommandCode; /* 命令請求碼,見下面的定義 */
19 unsigned char mCommandCodeNot; /* 命令碼的反碼,用于校驗命令包 */
20 union {
21 unsigned char mParameter[5]; /* 參數(shù) */
22 struct {
23 unsigned char mBufferID; /* 緩沖區(qū)識別碼,本程序針對MCS51單片機定義: 1-專用功能寄存器SFR, 2-內(nèi)部RAM, 3-
-外部RAM, 不過本程序?qū)嶋H只演示內(nèi)部RAM */
24 unsigned int mBufferAddr; /* 讀寫操作的起始地址,尋址范圍是0000H-0FFFFH,低字節(jié)在前 */
25 unsigned int mLength; /* 數(shù)據(jù)塊總長度,低字節(jié)在前 */
26 } buf;
27 } u;
28 } mCOMMAND_PACKET, *mpCOMMAND_PACKET;
29
30 #define CONST_CMD_LEN 0x07 /* 命令塊的長度 */
31 /* 由于命令與數(shù)據(jù)都是通過數(shù)據(jù)下傳管道(USB端點2的OUT)下傳, 為了防止兩者混淆,
32 我們可以在計算機應用程序與單片機程序之間約定, 命令塊的長度總是7, 而數(shù)據(jù)塊的長度肯定不是7, 例如64,32等
33 另外, 可以約定, 命令塊的首字節(jié)是命令碼, 等等
34 本程序約定命令碼: 80H-0FFH是通用命令,適用于各種應用
35 00H-7FH是專用命令,針對各種應用特別定義 */
36 /* 通用命令 */
37 #define DEF_CMD_GET_INFORM 0x90 /* 獲取下位機的說明信息,長度不超過64個字符,字符串以00H結(jié)束 */
38 #define DEF_CMD_TEST_DATA 0x91 /* 測試命令,下位機將PC機發(fā)來的命令包的所有數(shù)據(jù)取反后返回 */
39 #define DEF_CMD_CLEAR_UP 0xA0 /* 在上傳數(shù)據(jù)塊之前進行同步,實際是讓下位機清除上傳緩沖區(qū)的已有內(nèi)容 */
40 #define DEF_CMD_UP_DATA 0xA1 /* 從下位機的指定地址的緩沖區(qū)中讀取數(shù)據(jù)塊(上傳數(shù)據(jù)塊) */
41 #define DEF_CMD_DOWN_DATA 0xA2 /* 向下位機的指定地址的緩沖區(qū)中寫入數(shù)據(jù)塊(下傳數(shù)據(jù)塊) */
42 /* 專用命令 */
43 #define DEMO_CH451_CMD 0x56 /* PC發(fā)送命令給CH451,用于演示CH451的功能 */
44 /* 對于MCS51單片機在使用通用命令時,還需要指定緩沖區(qū)識別碼 */
45 #define ACCESS_MCS51_SFR 1 /* 讀寫51單片機的SFR */
46 #define ACCESS_MCS51_IRAM 2 /* 讀寫51單片機的內(nèi)部RAM */
47 #define ACCESS_MCS51_XRAM 3 /* 讀寫51單片機的外部RAM */
48
49 unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */
50 unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */
51
52 /* 有關(guān)CH451的定義,演示板的連接方式 */
53 sbit CH451_dclk=P1^7; /* 串行數(shù)據(jù)時鐘上升延激活 */
54 sbit CH451_din=P1^6; /* 串行數(shù)據(jù)輸出,接CH451的數(shù)據(jù)輸入 */
C51 COMPILER V7.06 CH375451 02/21/2008 17:32:43 PAGE 2
55 sbit CH451_load=P1^5; /* 串行命令加載,上升延激活 */
56 sbit CH451_dout=P3^3; /* INT1,鍵盤中斷和鍵值數(shù)據(jù)輸入,接CH451的數(shù)據(jù)輸出 */
57 unsigned char CH451_KEY; /* 存放鍵盤中斷中讀取的鍵值 */
58 unsigned char LAST_KEY; /* 保存上次的鍵值 */
59
60 mCOMMAND_PACKET CMD_PKT; /* 命令包結(jié)構(gòu)緩沖區(qū) */
61 unsigned char data *CurrentRamAddr; /* 進行數(shù)據(jù)塊傳輸時保存被讀寫的緩沖區(qū)的起始地址 */
62 unsigned char CurrentRamLen; /* 進行數(shù)據(jù)塊傳輸時保存剩余長度 */
63 bit FLAG_INT_WAIT; /* 中斷等待標志,1指示有中斷數(shù)據(jù)正在CH375中等待發(fā)送 */
64 unsigned char CH451_CMD_H; /* PC機發(fā)給CH451的高4位命令,為0FFH則命令無效 */
65 unsigned char CH451_CMD_L; /* PC機發(fā)給CH451的低8位命令 */
66 unsigned char code InformString[16] = "CH375/CH451\x0"; /* 信息字符串 */
67
68 /* 延時2微秒,不精確 */
69 void Delay2us( )
70 {
71 1 unsigned char i;
72 1 #define DELAY_START_VALUE 1 /* 根據(jù)單片機的時鐘選擇初值,20MHz以下為0,30MHz以上為2 */
73 1 for ( i=DELAY_START_VALUE; i!=0; i-- );
74 1 }
75
76 /* 延時50毫秒,不精確 */
77 void Delay50ms( )
78 {
79 1 unsigned char i, j;
80 1 for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );
81 1 }
82
83 /* 將PC機的低字節(jié)在前的16位字數(shù)據(jù)轉(zhuǎn)換為C51的高字節(jié)在前的數(shù)據(jù) */
84 unsigned int BIG_ENDIAN( unsigned int value )
85 {
86 1 unsigned int in, out;
87 1 in = value;
88 1 ((unsigned char *)&out)[1] = ((unsigned char *)&in)[0];
89 1 ((unsigned char *)&out)[0] = ((unsigned char *)&in)[1];
90 1 return( out );
91 1 }
92
93 /* CH375初始化子程序 */
94 void CH375_Init( )
95 {
96 1 unsigned char i;
97 1 FLAG_INT_WAIT = 0; /* 清發(fā)送中斷等待標志 */
98 1 /* 測試CH375是否正常工作,可選操作,通常不需要 */
99 1 #ifdef TEST_CH375_FIRST
CH375_CMD_PORT = CMD_CHECK_EXIST; /* 測試CH375是否正常工作 */
Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
CH375_DAT_PORT = 0x55; /* 寫入測試數(shù)據(jù) */
Delay2us( );
i = ~ 0x55; /* 返回數(shù)據(jù)應該是測試數(shù)據(jù)取反 */
if ( CH375_DAT_PORT != i ) { /* CH375不正常 */
for ( i=80; i!=0; i-- ) {
CH375_CMD_PORT = CMD_RESET_ALL; /* 多次重復發(fā)命令,執(zhí)行硬件復位 */
Delay2us( );
}
CH375_CMD_PORT = 0;
Delay50ms( ); /* 延時50ms */
}
#endif
114 1 #ifdef USE_MY_USB_ID
/* 設(shè)置外部自定義的USB設(shè)備VID和PID,可選操作,不執(zhí)行該命令則使用默認的VID和PID */
CH375_CMD_PORT = CMD_SET_USB_ID; /* 設(shè)置外部自定義的USB設(shè)備VID和PID,可選操作 */
C51 COMPILER V7.06 CH375451 02/21/2008 17:32:43 PAGE 3
Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
CH375_DAT_PORT = (unsigned char)MY_USB_VENDOR_ID; /* 寫入廠商ID的低字節(jié) */
CH375_DAT_PORT = (unsigned char)(MY_USB_VENDOR_ID>>8); /* 寫入廠商ID的高字節(jié) */
CH375_DAT_PORT = (unsigned char)MY_USB_DEVICE_ID; /* 寫入設(shè)備ID的低字節(jié) */
CH375_DAT_PORT = (unsigned char)(MY_USB_DEVICE_ID>>8); /* 寫入設(shè)備ID的高字節(jié) */
Delay2us( );
#endif
124 1 /* 設(shè)置USB工作模式, 必要操作 */
125 1 CH375_CMD_PORT = CMD_SET_USB_MODE;
126 1 Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
127 1 CH375_DAT_PORT = 2; /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */
128 1 for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */
129 2 if ( CH375_DAT_PORT==CMD_RET_SUCCESS ) break;
130 2 }
131 1 /* if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */
132 1 /* 下述啟用中斷,假定CH375連接在INT0 */
133 1 IT0 = 0; /* 置外部信號為低電平觸發(fā) */
134 1 IE0 = 0; /* 清中斷標志 */
135 1 EX0 = 1; /* 允許CH375中斷 */
136 1 }
137
138 /* 加載上傳數(shù)據(jù) */
139 void LoadUpData( unsigned char data *Buf, unsigned char Len )
140 {
141 1 unsigned char i;
142 1 CH375_CMD_PORT = CMD_WR_USB_DATA7; /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
143 1 Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
144 1 CH375_DAT_PORT = Len; /* 首先寫入后續(xù)數(shù)據(jù)長度 */
145 1 for ( i=0; i<Len; i++ ) CH375_DAT_PORT = Buf[i]; /* 加載數(shù)據(jù) */
146 1 }
147
148 /* CH375中斷服務程序INT0,使用寄存器組1 */
149 void mCH375Interrupt( ) interrupt 0 using 1
150 {
151 1 unsigned char InterruptStatus;
152 1 unsigned char length, c1, len1, len2, i;
153 1 #define cmd_buf ((unsigned char data *)(&CMD_PKT))
154 1 CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態(tài)并取消中斷請求 */
155 1 Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
156 1 InterruptStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */
157 1 IE0 = 0; /* 清中斷標志,對應于INT0中斷 */
158 1 if ( InterruptStatus == USB_INT_EP2_OUT ) { /* 批量端點下傳成功 */
159 2 CH375_CMD_PORT = CMD_RD_USB_DATA; /* 從當前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */
160 2 Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
161 2 length = CH375_DAT_PORT; /* 首先讀取后續(xù)數(shù)據(jù)長度 */
162 2 if ( length == CONST_CMD_LEN ) { /* 命令塊長度總是CONST_CMD_LEN,分析并處理命令 */
163 3 /* 分析通過USB接收到的命令塊,長度總是CONST_CMD_LEN,首字節(jié)為命令,其余為可選的參數(shù),這種命令結(jié)構(gòu)是由單片機和
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -