A. 關於單片機EEPROM存儲器使用問題
埠 自己改一下
接法..隨便找兩個io口.
上拉5-10k電阻就好了.
24c01總共就只有128位元組
而且寫入的時候都知道忘那裡寫
你自己自然清楚什麼時候..24c01滿了.
這個東西都是固定地址.
又不是硬碟這種..還要什麼時候滿
SDA EQU P2.0
SCL EQU P2.1
Address EQU 08H
I2CData EQU 09H
ORG 0040H
LJMP START;轉入主程序.
START:
MOV SP,#60H
MOV Address,#00H
MOV I2CData,#55H
MOV P0,I2CDATA
CALL DELAY
CALL I2C_WRITE ;寫入數據.
MOV I2CDATA,#0AAH
MOV P0,I2CDATA
CALL DELAY
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A ;讀出數據.
MOV P0,I2CDATA
CALL DELAY
NOP
NOP
LJMP START
//*******************************************
/*------------------------------------------------------
讀一個位元組 Address地址 Data讀出的數據
------------------------------------------------------*/
I2C_READ:
I2C_READ_A:
LCALL I2C_START
MOV A,#10100000B //從器件地址位是000,並且對從器件進行寫操作。
//不要有所疑問為什麼這么操作。因為這是一個選擇性讀的操作,主器件發送從器件地址和它想讀取的位元組數據的地址執行一個偽寫操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_A ;=1,表示無確認,再次發送 C為1轉移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
I2C_READ_B:
LCALL I2C_START
MOV A,#10100001B //從器件地址位是000,並且對從器件進行讀操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_B //C=1轉移,表示無確認,再次發送。
LCALL I2C_RECEIVE8BIT
MOV I2CData,A
LCALL I2C_ACK
LCALL I2C_STOP
RET
//*******************************************************
//*******************************************************
;接收八位數據
//主器件接收從器件指定地址的8位數據。
I2C_RECEIVE8BIT:
MOV B,#08H
CLR A
SETB SDA
I2C_RECEIVE8IT_A:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,I2C_RECEIVE8IT_A
RET
//*******************************************************
//*******************************************************
/*------------------------------------------------------
寫一個位元組 Address地址 I2CDatata寫入的數據
------------------------------------------------------*/
I2C_WRITE:
I2C_WRITE_A:
LCALL I2C_START //調用I2C匯流排的起始信號的程序。
MOV A,#10100000B //從器件地址位是000,並且對從器件進行寫操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_WRITE_A //=1,表示無確認,再次發送。 C為1轉移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,I2CData
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
//***************************************
//**********************************
;發送開始信號
//I2C匯流排的起始信號的程序。
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
//***********************************
//***********************************
;送八位數據
//主器件送從器件8位數據。
I2C_SEND8BIT:
MOV B,#08H
I2C_SEND8BIT_A:
RLC A
MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,I2C_SEND8BIT_A
RET
//************************************
//*************************************
;發送接收確認信號
I2C_ACk:
SETB SDA
SETB SCL
NOP
NOP
JB SDA,I2C_ACK0 //SDA為1跳轉。
CLR C
SJMP I2C_ACK_END
I2C_ACK0:
SETB C
I2C_ACK_END:
CLR SCL
RET
//**************************************
//**************************************
;發送結束信號
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
//***************************************
//***************************************
delay:
MOV R7,#0FFH
DEL1:
MOV R6,#0FFH
DEL2:
MOV R5,#10
DEL3:
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
//***************************************
B. 單片機上電沒運行,要檢查什麼
單片機上電後沒有運轉,首先要檢查什麼?
首先應該確認電源電壓是否正常。用電壓表測量接地引腳跟電源引腳之間的電壓,看是否是電源電壓,例如常用的5V。
接下來就是檢查復位引腳電壓是否正常。分別測量按下復位按鈕和放開復位按鈕的電壓值,看是否正確。
然後再檢查晶振是否起振了,一般用示波器來看晶振引腳的波形,注意應該使用示波器探頭的X10檔。另一個辦法是測量復位狀態下的IO口電平,按住復位鍵不放,然後測量IO口(沒接外部上拉的P0口除外)的電壓,看是否是高電平,如果不是高電平,則多半是因為晶振沒有起振。
另外還要注意的地方是,如果使用片內ROM的話(大部分情況下如此,現在已經很少有用外部擴ROM的了),一定要將EA引腳拉高,否則會出現程序亂跑的情況。有時用模擬器可以,而燒入片子不行,往往是因為EA引腳沒拉高的緣故(當然,晶振沒起振也是原因只一)。經過上面幾點的檢查,一般即可排除故障了。如果系統不穩定的話,有時是因為電源濾波不好導致的。在單片機的電源引腳跟地引腳之間接上一個0.1uF的電容會有所改善。遇到系統不穩定時,就可以並上電容試試(越靠近晶元越好)