×
单片机 > 单片机程序设计 > 详情

24C02(EEPROM)记忆开机次数程序

发布时间:2020-06-15 发布时间:
|
24C02记忆开机次数,开机次数存放地址为00H,做此实验时,先用地址清0程序将00H清0,再去做记忆开机次数实验!!!

计数地址清0程序如下:

;/////////////////////////////////////////////////////
;将AT24C02(EEPROM)的00H单元的地址清0
;AT24C02存储开机次数(准备程序)
;////////////////////////////////////////////////////
WP  BIT P1.0
SCL BIT P1.1
SDA BIT P1.2

WRDA EQU 41H

ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:CLR WP
     MOV SP,70H
     LCALL START
     MOV WRDA,#0AEH
     LCALL SEND
     LCALL SACK
     MOV WRDA,#00H
     LCALL SEND
     LCALL SACK
     MOV WRDA,#00H
     LCALL SEND
     LCALL SACK
     LCALL STOP
     CLR P1.7
     SJMP $
     
;24C02开始数据传送信号
START:SETB SDA
      SETB SCL
      LCALL D5U
      CLR SDA
      LCALL D5U
      CLR SCL
      RET
;写一个字节子程序
SEND: MOV R0,#08H
      MOV A,WRDA
   D1:RLC A
      MOV SDA,C
      LCALL D5U
      SETB SCL
      LCALL D5U
      CLR SCL
      DJNZ R0,D1
      RET
;24c02应答信号子程序
SACK: SETB SDA
      LCALL D5U
      SETB SCL
      LCALL D5U
   D2:MOV C,SDA
      JC D2 
      CLR SCL
      RET
;STOP子程序
STOP: CLR SDA
      LCALL D5U
      SETB SCL
      LCALL D5U
      SETB SDA
      LCALL D5U
      CLR SCL
      RET
;延时子程序      
D5U:  NOP
      NOP
      NOP
      NOP
      NOP
      RET                 
     
     END

................................记忆开机次数程序(已调试过).....................................

;/////////////////////////////////////////////////
;AT24C02(EEPROM)存储开机次数
;开机次数存储地址为00H,在记忆前以清0
;////////////////////////////////////////////////
WP  BIT P1.0
SCL BIT P1.1
SDA BIT P1.2

WRDA EQU 40H;写入数据暂存器
RDDA EQU 41H;读出数据暂存器
OPUN EQU 42H;开机次数暂存器

ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:CLR WP;开写保护
     MOV SP,70H
     LCALL READ
     MOV A,RDDA
     MOV DPTR,#TAB
     INC A
     MOV R1,A
     CJNE R1,#16,D4
     CLR A
  D4:MOV OPUN,A;将开机次数存入暂存器 
     MOVC A,@A+DPTR
     CLR P2.0
     MOV P0,A;显示开机次数
     LCALL WIRT
     SJMP $
;读24C02子程序
READ:LCALL START
     MOV WRDA,#0AEH
     LCALL SEND
     LCALL SACK
     MOV WRDA,#00H
     LCALL SEND
     LCALL SACK
     
     LCALL START
     MOV WRDA,#0AFH
     LCALL SEND
     LCALL SACK
     LCALL REBY
     LCALL STOP
     RET
;写C2402子程序
WIRT:LCALL START
     MOV WRDA,#0AEH
     LCALL SEND
     LCALL SACK
     MOV WRDA,#00H
     LCALL SEND
     LCALL SACK
     MOV A,OPUN
     MOV WRDA,A
     LCALL SEND
     LCALL SACK
     LCALL STOP
     RET
     
;24C02开始子程序
START:SETB SDA
      SETB SCL
      LCALL DE5U
      CLR SDA
      LCALL DE5U
      CLR SCL
      RET
;读一个字节子程序
REBY: MOV R0,#08H
      SETB SDA
   D3:LCALL DE5U
      SETB SCL
      LCALL DE5U
      MOV C,SDA
      RLC A
      CLR SCL
      SETB SDA
      DJNZ R0,D3
      MOV RDDA,A
      RET
               
;传送一个字节子程序
SEND: MOV R0,#08H
      MOV A,WRDA
   D1:RLC A
      MOV SDA,C
      LCALL DE5U
      SETB SCL
      LCALL DE5U
      CLR SCL
      DJNZ R0,D1
      RET
;24C02应答信号检测子程序
SACK: SETB SDA
      LCALL DE5U
      SETB SCL
      LCALL DE5U
   D2:MOV C,SDA
      JC D2      
      CLR SCL
      RET
;24C02停止通信子程序
STOP: CLR SDA
      LCALL DE5U
      SETB SCL
      LCALL DE5U
      SETB SDA
      LCALL DE5U
      CLR SCL
      RET  
;5U延时子程序
DE5U: NOP
      NOP
      NOP
      NOP
      NOP
      RET
;显示数据表
TAB:  DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H
          DB 0F8H,080H,090H,088H,083H,0C6H,0A1H
          DB 086H,08EH      
     
      END     

................................带复位的记忆开机次数程序(已调试过).....................................

 wp bit p1.0
scl bit p1.1
sda bit p1.2

count equ 30h;开机次数计数器
date equ 31h;IIC数据缓冲器

org 0000h
sjmp main
org 0003h
ljmp inx0
org 000bh
ljmp itx0
org 0030h
main:clr wp
  clr ea
     mov sp,#40h
  mov dptr,#tab 
  lcall init
  lcall reiic
  mov count,date
  inc count
  mov r1,count
  lcall wriic  
  setb ea
  sjmp $

/*=============INT0,TO中断初始化程序===================*/

init:mov tmod,#00000001b
  mov th0,#0d8h
  mov tl0,#00h
  setb et0
  setb it0
  setb ex0
  setb tr0
  ret

/*=============LED动态显示程序===================*/

itx0:mov th0,#0d8h
  mov tl0,#00h
  mov a,count
  mov b,#100
  div ab
  mov r0,a
  movc a,@a+dptr
  mov p0,a
  cjne r0,#0,n1
  sjmp n2
  n1:clr p2.2
    lcall d2ms
  setb p2.2
  n2:mov a,b
    mov b,#10
  div ab
  mov r0,a
  movc a,@a+dptr
  mov p0,a
  cjne r0,#0,n3
  sjmp n4
  n3:clr p2.1
    lcall d2ms
  setb p2.1
  n4:mov a,b
    movc a,@a+dptr
  mov p0,a
  clr p2.0
  lcall d2ms
  setb p2.0
  reti 

/*=============复位程序===================*/

inx0:clr tr0
   mov r1,#00h
     lcall wriic
  lcall d10ms
  lcall reiic
  mov count,date
  setb tr0
  reti

/*=============AT24C02读写程序===================*/
wriic:lcall start
   mov date,#10101110b
   lcall write
   lcall wack
   mov date,#00h
   lcall write
   lcall wack
   mov date,r1
   lcall write
   lcall wack
   lcall stop
   ret

reiic:lcall start
   mov date,#10101110b
   lcall write
   lcall wack
   mov date,#00h
   lcall write
   lcall wack
   lcall start
   mov date,#10101111b
   lcall write
   lcall wack
   lcall read
   lcall stop
   ret

read: mov r3,#08h
   e1:setb sda
      setb scl
   lcall d5u
   mov c,sda
   rlc a
   clr scl 
   lcall d5u
   djnz r3,e1
   mov date,a
   ret  
   
start:setb sda
   setb scl
   lcall d5u
   clr sda
   lcall d5u
   clr scl
   ret
   
write:mov a,date
   mov r4,#08h
   w1:rlc a
      mov sda,c
   lcall d5u
   setb scl
   lcall d5u
   clr scl
   lcall d5u
   djnz r4,w1
   ret
   
wack: setb sda
   setb scl
   lcall d5u
   w2:mov c,sda
   jc w2        
   clr scl
   ret

stop: clr sda
   setb scl
   lcall d5u
   setb sda
   lcall d5u
   clr scl
   ret

tab:DB 0C0H,0F9H,0A4H,0B0H,99H
    DB 92H,82H,0F8H,80H,90H

d5u: nop
  nop
  nop
  nop
  nop
  ret

D10ms:   ;误差 -0.000000000002us
    MOV R6,#0F9H
DL0:
    MOV R5,#22H
    DJNZ R5,$
    DJNZ R6,DL0
    RET

d2ms:   ;误差 -0.217013888889us
    MOV R6,#0b0H
DL1:
    MOV R5,#0AH
    DJNZ R5,$
    DJNZ R6,DL1
    RET

 end

关键字:24C02  EEPROM  开机次数

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项