导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→承蒙各位老兄关照,我编了一个程序,请务必指教一下
该程序的

* 64004: 24C02为何仅能连续存入28个字节

   zhongqiu 
zhongqiu发表的帖子 

 
承蒙各位老兄关照,我编了一个程序,请务必指教一下
该程序的问题在24C02的连续写入出现的问题,传口没有问题,目前如果仅向24C02写入00H-07H(即块写入中的第一块)则正常接收,计数正常,但一旦写入第二块,第三块等等,则往后每块丢一个字节,目前写入之后,根据写入80H的字节数再读出来(此为对应的另一个程序,本程序不包括),则从第二块开始,每块丢一个字节,但是读出的字节确实连续的,就是末尾的字节数读不出来,可能是程序循环过程中出现的问题,因为第一块没在循环程序中,也可能是计数参数NUMBYT出现了问题。
   另外,该程序不稳定,有时能写进去,有时写不进去,还有时候丢掉从第三块开始的首字节,但这些问题在关掉防真器后重启动程序便没有了,但调试时间长了便又出现了,就是不稳定。程序如下
;该程序为N个字节的串口接收程序,串口采用方式1,并将接收到的数据写到24C02的00H起始的地址中
;采用块写入,NUMBYT为总的计数器,写入后将写入的字节数NUMBYT+1写入80H
MAINSCON:MOV 40H,#0A0H
      MOV 41H,#00H
      MOV 42H,#30H;
      MOV 43H,#38H
      NUM EQU 44H;此为24C02每块写中的计数00H-07H
      
      SLAW EQU 40H
      NUMBYT EQU 41H;此为写入24C02中总的字节数,00H开始,最后加一即为总数
      NWD EQU 42H
      VSDA EQU P0.4
      VSCL EQU P0.5
      MOV R0,NWD
      MOV R1,#00H;块写入中的低字节
SDL1:
     MOV TMOD,#20H;定时器T1作波特率发生器,工作于方式2
     MOV TL1,#0F3H;设定T1的初值确定波特率为4800
     MOV TH1,#0F3H;
     CLR ET1;T1作波特率发生器时应禁止中断
     SETB TR1;启动TR1计数
     MOV SCON,#52H;串行口设置方式1
     ORL PCON,#80H;SMOD=1
     
     MOV R5,#5
     MOV R3,#50

     MOV R7,NUMBYT
     CJNE R7,#00H,WAIT
WAIT0:JBC RI,SSS
      LJMP WAIT0
WAIT:
     JBC RI,SSS
     DJNZ R5,WAIT
     DJNZ R3,WAIT
     MOV A,NUMBYT
     DEC A
     MOV NUMBYT,A
     AJMP WRB08

SSS: CLR RI
     MOV A,SBUF
     MOV @R0,A
     MOV R7,NUMBYT
     CJNE R7,#07H,SSS1
     LJMP WRB08
SSS1:INC R0
     INC R7
     MOV NUMBYT,R7
     LJMP SDL1
;该程序为将30H-37H的内容写到24C02的01H-08H中
WRB08:
WRADD:MOV A,NUMBYT
      INC A
      MOV R7,A
      LCALL STA
      MOV A,SLAW
      LCALL WRBYT
      LCALL CACK
      JB F0,WRADD
      MOV A,#00h
      LCALL WRBYT
      LCALL CACK
      JB F0,WRADD
      MOV R0,NWD
WRDA:MOV A,@R0
     LCALL WRBYT
     LCALL CACK
     JB F0,WRADD
     INC R0
     DJNZ R7,WRDA
     LCALL DIR
     LCALL STOP
     MOV R0,NWD
     MOV A,R1
     ADD A,#08H
     MOV R1,A
     MOV NUM,#00H
SDL3:MOV TMOD,#20H;定时器T1作波特率发生器,工作于方式2
     MOV TL1,#0F3H;设定T1的初值确定波特率为4800
     MOV TH1,#0F3H;
     CLR ET1;T1作波特率发生器时应禁止中断
     SETB TR1;启动TR1计数
     MOV SCON,#52H;串行口设置方式1
     ORL PCON,#80H;SMOD=1
     ;待接收数据首地址
               ;待接收数据字节数量
     MOV R5,#5
     MOV R3,#50
     MOV R7,NUMBYT
WAIT3:
     JBC RI,SSS3
     DJNZ R5,WAIT3
     DJNZ R3,WAIT3
     LJMP WRB083N
SSS13:INC R0
     INC R7
     INC R2
     MOV NUMBYT,R7
     LJMP SDL3
SSS3:CLR RI
     MOV A,SBUF
     MOV @R0,A
     MOV R7,NUMBYT
     CJNE R2,#07H,SSS13

;该程序为将30H-37H的内容写到24C02的01H-08H中
WRB083:
WRADD3:
      MOV R4,#08H
      LCALL STA
      MOV A,SLAW
      LCALL WRBYT
      LCALL CACK
      JB F0,WRADD3
      MOV A,R1
      LCALL WRBYT
      LCALL CACK
      JB F0,WRADD3
      MOV R0,NWD
WRDA3:MOV A,@R0
     LCALL WRBYT
     LCALL CACK
     JB F0,WRADD3
     INC R0
     DJNZ R4,WRDA3
     LCALL DIR
     LCALL STOP
     MOV R0,NWD
     MOV A,R1
     ADD A,#08H
     MOV R1,A
     MOV R2,#00H

     LCALL SDL3
WRB083N:
WRADD3N:
      MOV R4,#08H;该段子程序为当没有串口数据传输要求后的最后写入24C02的字节,字节数在八个以内,写完后进入最后写
                   NUMBYT子程序,然后退出                
      LCALL STA
      MOV A,SLAW
      LCALL WRBYT
      LCALL CACK
      JB F0,WRADD3N
      MOV A,R1
      LCALL WRBYT
      LCALL CACK
      JB F0,WRADD3N
      MOV R0,NWD
WRDA3N:MOV A,@R0
     LCALL WRBYT
     LCALL CACK
     JB F0,WRADD3N
     INC R0
     DJNZ R4,WRDA3N
     LCALL DIR
     LCALL STOP

WAIT1:LCALL DIR;该段子程序为让蜂鸣器响的子程序,有响声表明字节写入完毕
      CLR P1.4
      SETB P2.6
      CLR P2.6
      CLR P1.4
      SETB P2.6
      CLR P2.6

      AJMP WRITEONE
DIR:NOP
    NOP
    NOP
    RET
STA:SETB VSDA
    SETB VSCL
    NOP
    NOP
    CLR VSDA
    NOP
    NOP
    CLR VSCL
    RET
STOP:CLR VSDA
     SETB VSCL
     NOP
     NOP
     SETB VSDA
     NOP
     NOP
     CLR VSCL
     CLR VSDA
     RET
MNACK:SETB VSDA
      SETB VSCL
      NOP
      NOP
      CLR VSCL
      CLR VSDA
      RET
MACK:CLR VSDA
     SETB VSCL
     NOP
     NOP
     CLR VSCL
     SETB VSDA
     RET
CACK:SETB VSDA
     SETB VSCL
     CLR F0
     MOV C,VSDA
     JNC CEND
     SETB F0
CEND:CLR VSCL
     RET
WRBYT:MOV R6,#08H
WLP:RLC A
    MOV VSDA,C
    SETB VSCL
    NOP
    NOP
    CLR VSCL
    DJNZ R6,WLP
    RET
RDBYT:MOV R6,#08H
RLP:SETB VSDA
    SETB VSCL
    MOV C,VSDA
    MOV A,R2
    RLC A
    MOV R2,A
    CLR VSCL
    DJNZ R6,RLP
    RET
WRITEONE:
         LCALL STA
      MOV A,SLAW
      LCALL WRBYT
      LCALL CACK
      JB F0,WRITEONE
      MOV A,#80H;写入EEPROM单元地址
      LCALL WRBYT
      LCALL CACK
      JB F0,WRITEONE
         MOV A,NUMBYT
         INC A
         LCALL WRBYT
         LCALL CACK
         JB F0,WRITEONE
         LCALL STOP;至此将数据0AAH写入了EEPROM地址单元00中
        NOP
LL:END




发表时间:2004年10月9日11:23:41

  
回复该帖

本主题共有 9 帖,分页:>>>>>该主题的所有内容[9]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:(RS323 通讯) 最流行的显示技术,彩色液晶显示 [upload=j
[下一篇帖子]:那位大虾可以帮忙?小弟是一个单片机的“门外汉”,有一个很菜的问题想请教。就是用鼠标来做“遥控器”。鼠