承蒙各位老兄关照,我编了一个程序,请务必指教一下
该程序的问题在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