A. 51單片機怎麼使用內部EEPROM,上電次數、斷電記憶,怎麼實現計到最大值6千次。
STC 很多都有內部EEPROM,如11或12系列的STC單片機,讀寫內部EEPROM有一定限制,比如寫,必須先擦除再寫,而且一次必須擦除一個扇區,所以還是很麻煩的,只能覆蓋。
要實兆襪現你的功能,一點問題沒有,上電後先讀取上次的計數值,再加1重新寫進去就可以了。
以下是EEPROM讀寫子程序供參考:
;------------------------------------------------
;讀一位元組,調用前需打開 IAP 功能,入口:DPTR = 位元組地址,返回:A = 讀出位元組
IAP_READ:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP 功能, 設置 Flash 操作等待時間
MOV IAP_CMD,#ISP_IAP_BYTE_READ ;設置為IAP/ISP/EEPROM位元組讀模式命令
MOV IAP_ADDRH,DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設置目標單元地址的低8位地址
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h後,ISP/IAP命令立即被觸發起動
NOP
MOV A,IAP_DATA ;讀出的數據在IAP_DATA單元中,送入累加器A
;SETB EA
LCALL IAP_Disable ;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態,
;一次連續的IAP操作完成之後建議關閉IAP功能,不需要每次都關
RET
;------------------------------------------------
;位元組編程,散鬧調用前需打開 IAP 功能,入口:DPTR = 位元組地址, A=須編程位元組的數據
IAP_WRITE:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP 功能, 設置 Flash 操作等待時間
MOV IAP_CMD,#ISP_IAP_BYTE_PROGRAM ;設置為IAP/ISP/EEPROM位元組編程模式命令
MOV IAP_ADDRH,DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設置目標單元地址的低8位地址
MOV IAP_DATA,A ;要編程的數據先送進ISP_DATA寄存器
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h後,ISP/IAP命令立即被觸發起動
NOP
;SETB EA
LCALL IAP_Disable ;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態,
;一次連續的IAP操作完成之後建議關閉IAP功能,不需要每次都關
RET
;------------------------------------------------
;擦除扇區, 入口:DPTR = 扇區地址
IAP_Erase:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP 功能, 設置 Flash 操作等待時間
MOV IAP_CMD,#03H ;設置為IAP/ISP/EEPROM扇區擦除模式命令
MOV IAP_ADDRH,DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設置目標單元地址的低8位地址
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h後,ISP/IAP命令立即被觸發起動
NOP
;SETB EA
LCALL IAP_Disable ;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態,
;一族掘激次連續的IAP操作完成之後建議關閉IAP功能,不需要每次都關
RET
;------------------------------------------------
IAP_Disable:
;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態,
;一次連續的IAP操作完成之後建議關閉IAP功能,不需要每次都關
MOV IAP_CONTR,#0 ;關閉 IAP 功能
MOV IAP_CMD,#0 ;清命令寄存器,使命令寄存器無命令,此句可不用
MOV IAP_TRIG,#0 ;清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
MOV IAP_ADDRH,#0FFH ;送地址高位元組單元為00,指向非EEPROM區
MOV IAP_ADDRL,#0FFH ;送地址低位元組單元為00,防止誤操作
RET