先祝大家中秋团圆
归入正题,我有一道难题跟大家请教一下,关于24C02的写入问题,需要通过串口接收不确定数目字节的数据,我编了一下,却发觉该程序有个缺陷,仅仅能接收28个字节的数据,超过后就接收不正常了,经我反复测试,问题大概在串口24C02的写入上,串口接收应该是没有问题,大家有谁能给我指点一下,谢谢!
;该程序为N个字节的串口接收程序,串口采用方式1,并将接收到的数据写到24C02的00H起始的地址中
MAINSCON:MOV 40H,#0A0H
MOV 41H,#00H
MOV 42H,#30H;串口写入的内存地址首地址
SLAW EQU 40H
NUMBYT EQU 41H
NWD EQU 42H
VSDA EQU P0.4
VSCL EQU P0.5
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 R0,NWD;待接收数据首地址
;待接收数据字节数量
MOV R5,#5
MOV R3,#50
MOV R7,NUMBYT
CJNE R7,#00H,WAIT
WAIT0:JBC RI,SSS
AJMP WAIT0
WAIT:
JBC RI,SSS
DJNZ R5,WAIT
DJNZ R3,WAIT
AJMP WAIT1
SSS: CLR RI
MOV A,SBUF
MOV @R0,A
MOV R7,NUMBYT
INC R7
MOV NUMBYT,R7
;该程序为将RAM30H-37H中的内容写到24C02的00H
WRADD:LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRADD
MOV A,R7;写入EEPROM单元地址
LCALL WRBYT
LCALL CACK
JB F0,WRADD
MOV R0,NWD
WRDA:MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRADD
LCALL STOP;至此将数据0AAH写入了EEPROM地址单元00中
PROGRAM:LCALL SDL1
JB RI,SSS
AJMP WAIT1
WAIT1:LCALL DIR
CLR P1.4
SETB P2.6
CLR P2.6
JB RI,SSS
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,#00H;写入EEPROM单元地址
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
MOV A,NUMBYT
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
LCALL STOP;至此将数据0AAH写入了EEPROM地址单元00中
NOP
LL:END
发表时间:2004年9月28日11:05:32