我用c8051f340單片機(jī)驅(qū)動(dòng)ch375,有問題請教高手

我用c8051f340單片機(jī)驅(qū)動(dòng)ch375,用的是LIB5,但是連ch375初始化都不成功,是不是因?yàn)閱纹瑱C(jī)速度過快,應(yīng)該怎么修改呀 附程序: sbit DAT=P3^1; sbit test=P1^7; sbit CH375_CS = P2^5; sbit CH375_WR = P2^6; sbit CH375_RD = P2^1; sbit CH375_A0 = P1^6; sbit oe=P1^6; //sbit RST=P4^2; UINT8 changenumber; UINT8 xdata time[14]; UINT8 xdata timercur[7]; UINT8 xdata *p; UINT8 Error; UINT8 *result;

//UINT8 i,j,k,m; sbit ACC0=ACC^0; sbit ACC7=ACC^7;

void menu1(); void readtime(void); void BCD_to_INT(); void displaytimeset(); void deleteGLUsers(); void menu2(void); void DelUsers(); void AddUsers(); void DelUsers(void); bit ISendByte16(UINT8 sla,UINT16 suba,UINT8 c); bit IRcvByte16(UINT8 sla,UINT16 suba,UINT8 *c); void ChangeUsers_del(UINT8 xdata i); void COMSendUINT8(UINT8 command,UINT8 param,UINT8 size,UINT8 flag); void COMWriteByte(unsigned char kk); void ChangeEdit(UINT8 ii);//主菜單1選擇菜單 void menu1(); void deleteGLUsers(); void display_26(); void delay(void); UINT8 KeyScan(void); ////////////////////////////////////////////////////////////// #define MAX_BYTE_IO 35 /* 以字節(jié)為單位單次讀寫文件時(shí)的最大長度,默認(rèn)值是29,值大則占用內(nèi)存多,值小則超過該長度必須分多次讀寫 */

/* 以下定義的詳細(xì)說明請看CH375HF5.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"內(nèi)部復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */ /*#define LIB_CFG_UPD_SIZE 1*/ /* 在添加數(shù)據(jù)后是否自動(dòng)更新文件長度: 0為"不更新",1為"自動(dòng)更新" */ /* 默認(rèn)情況下,如果扇區(qū)數(shù)/字節(jié)數(shù)不為0那么CH375FileWrite/CH375ByteWrite只負(fù)責(zé)寫入數(shù)據(jù)而不修改文件長度, 如果需要每次寫完數(shù)據(jù)后會(huì)自動(dòng)修改/更新文件長度,那么可以使全局變量CH375LibConfig的位4為1, 如果長時(shí)間不寫入數(shù)據(jù)則應(yīng)該更新文件長度,防止突然斷電后前面寫入的數(shù)據(jù)與文件長度不相符, 如果確定不會(huì)突然斷電或者后面很快有數(shù)據(jù)不斷寫入則不必更新文件長度,可以提高速度并減少U盤損耗(U盤內(nèi)部的內(nèi)存壽命有限,不宜頻繁改寫) */

/* 只使用單片機(jī)內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區(qū), 以字節(jié)為單位讀寫文件不需要文件數(shù)據(jù)讀寫緩沖區(qū)FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */ /* 由于單片機(jī)內(nèi)置的外部RAM只有1KB, 有些單片機(jī)還要去掉256字節(jié)內(nèi)部RAM, 只剩下768字節(jié)的外部RAM, 其中前512字節(jié)由CH375子程序用于磁盤數(shù)據(jù)緩沖 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */

#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */

#include "..\CH375HF5.H"

/* 在P1.4連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)U盤插入后亮 */ sbit P1_4 = P1^4; #define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高電平 */ #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_5 = P1^5; /* 在P1.5連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤操作時(shí)亮 */ #define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ #define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_6 = P1^6; /* 在P1.6連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤寫操作時(shí)亮 */ #define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */ #define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */ void mDelay100mS( ); /* 本例用I/O引腳模擬產(chǎn)生CH375的并口讀寫時(shí)序 */ /* 本例中的硬件連接方式如下(實(shí)際應(yīng)用電路可以參照修改下述3個(gè)并口讀寫子程序) */ /* 單片機(jī)的引腳 CH375芯片的引腳 P3.2 INT# P1.0 A0 P1.1 CS# 如果模擬出的并口上只有CH375,那么CS#可以直接接低電平,強(qiáng)制片選 P1.2 WR# P1.3 RD# P0(8位端口) D7-D0 */

void mDelay1_2uS( ) /* 至少延時(shí)1.2uS,根據(jù)單片機(jī)主頻調(diào)整 */ { mDelay100mS( ); return; }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時(shí)序,所以進(jìn)行初始化 */ { delay(); CH375_CS = 1; delay(); CH375_WR = 1; delay(); CH375_RD = 1; delay(); CH375_A0 = 0; delay(); P0 = 0xFF; /* 并口輸入 */ delay(); }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { delay(); mDelay100mS( ); mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)1uS */ delay(); P0 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ delay(); CH375_A0 = 1; delay(); CH375_CS = 0; delay(); CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ delay(); CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ delay(); CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ delay(); CH375_CS = 1; delay(); CH375_A0 = 0; delay(); P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ delay(); mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)2uS */ mDelay100mS( ); delay(); }

void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { delay(); P0 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ delay(); CH375_A0 = 0; delay(); CH375_CS = 0; delay(); CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口 */ delay(); CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ delay(); CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ delay(); CH375_CS = 1; delay(); P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ delay(); mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; delay(); mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ delay(); P0 = 0xFF; /* 輸入 */ delay(); CH375_A0 = 0; delay(); CH375_CS = 0; delay(); CH375_RD = 0; /* 輸出有效寫控制信號, 讀CH375芯片的數(shù)據(jù)端口 */ delay(); CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ delay(); mData = P0; /* 從CH375的并口輸入數(shù)據(jù) */ delay(); CH375_RD = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ delay(); CH375_CS = 1; delay(); return( mData ); }

/* 如果單片機(jī)與CH375是串口連接,那么參考下面的子程序 void CH375_PORT_INIT( ) { SCON = 0xD0; 設(shè)置串口為9位數(shù)據(jù) 設(shè)置波特率和其它串口參數(shù) }

void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }

void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }

UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } */

/* 延時(shí)100毫秒,不精確 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }

/* 將程序空間的字符串復(fù)制到內(nèi)部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

/* 檢查操作狀態(tài),如果錯(cuò)誤則顯示錯(cuò)誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯(cuò)誤 */ while ( 1 ) { LED_OUT_ACT( ); /* LED閃爍 */ mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } } void delay(void)//延時(shí)程序 { UINT8 j,i; i=0; // while(i<30) while(i<10) { j=0; while(j<10) { j++; } i++; } } /* 為printf和getkey輸入輸出初始化串口 */ void Reset() //液晶復(fù)位 { //reset 低復(fù)位 _|- reset=0; delay(); delay(); //_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); reset=1; } void main( ) { UINT8 k; UINT8 i, month, hour; UINT16 date, adc, len; PCA0MD &= ~0x40; //關(guān)閉看門狗 OSCICN

是不是庫初始化返回0X81?如果是的話,那不應(yīng)該是你的程序問題,而是你的硬件連線有問題: xWriteCH375Cmd(0X06); xWriteCH375Data(0X55); i=xReadCH375Data(); 看下i的值是多少,正常情況下輸入0X55的話,返回的侄應(yīng)該是你輸入數(shù)據(jù)的取反,其次,你是用并口還是串口和我們的375通信?怎么有2套讀寫子函數(shù)??如果是并口的話,沒必要加那么多的延時(shí),按照下面的寫就可以了: void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { delay(); delay();//2US P0 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ nop; nop;//大于100NS CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ CH375_A0 = 0; P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ delay(); delay();//2US }

void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { delay();delay();//1US P0 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ delay(); }

UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; delay(); delay();//1US P0 = 0xFF; /* 輸入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 輸出有效寫控制信號, 讀CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ mData = P0; /* 從CH375的并口輸入數(shù)據(jù) */ CH375_RD = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; delay();//1US return( mData ); }


謝謝樓上的 我用的是并口通信,初始化芯片沒有返回值.程序死在初始化那里了


運(yùn)行函數(shù) xWriteCH375Cmd(0X06); xWriteCH375Data(0X55); i=xReadCH375Data(); 得到的i值是0xff;


應(yīng)該是你的硬件上還存在問題,你先按照說明手冊上的電路圖檢查連線是否正確,TXD是不是接地了等等;再查查CH375是不是正常工作了(晶振有沒起振,復(fù)位是不是完全了),可以查看25腳(RST)26腳(RST#)的電壓,正常的話應(yīng)該是25腳為低,26腳為高;還有就是可以通過示波器觀察讀寫信號是否正常,命令數(shù)據(jù)是否發(fā)下去了。


運(yùn)行函數(shù) xWriteCH375Cmd(0X06); xWriteCH375Data(0X55); i=xReadCH375Data(); 得到的i值是0xff

樓主這三句加到哪兒調(diào)試啊,我也是每次初始化就死了,也想看看返回值,可是不知道加哪兒?


硬件平臺一樣,我也遇到了上述情況。


同上做測試命令,如果不過說明要么您的硬件有問題,按照我們手冊上給的原理圖接,要么時(shí)序有問題,用示波器檢查時(shí)序是否滿足我們手冊上給的時(shí)序要求


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频