在另外一套程序中并没有ISP功能,要实现程序的更新功能,要了解芯片的IAP调用,这一点在芯片的资料上也有介绍,然后就是接收上位机的程序,一般是通过串口,下面介绍一下P89C51RD2的串口自动波特率设置,程序源码主要摘录于《 单片机 与嵌入式系统》,现在贴出完整的源码:
;==============================
;初始化串口,自适应波特率;上位机
;发送两个字符'U',如果接收到一个
;字符'U',那么初始化成功
;==============================
SERIAL_INIT:
MOV TMOD,#02H ;T1工作模式2,定时器
MOV T2CON,#30H ;T2工作为串行口波特率发生器
CLR A
MOV TL2,A
MOV TH2,A ;TH2=0000H
JNB P3.0,$ ;若P3.0=0 则等待直到其变为1
JB P3.0,$ ;若P3.0=1 则等待直到下降沿到来
SETB TR2 ;启动T2定时器
JNB P3.0,$ ;若P3.0=0 则等待直到上升沿到来
CLR TR2
;计算波特率
MOV A,TL2
SWAP A
ANL A,#0FH ;取TL2高四位
MOV R0,A
MOV A,TH2
SWAP A
ANL A,#0F0H ;取TH2低四位
ORL A,R0
MOV R0,A ;组合后送入R0
MOV A,TH2
SWAP A
ANL A,#0FH ;取TH2高四位
MOV R1,A
MOV A,R0 ;以上程序实现T2中数据除以16送R1和R0保存
CPL A ;低位取反
MOV TL2,A
MOV RCAP2L,A
MOV A,R1
CPL A ;高位取反
MOV TH2,A
MOV RCAP2H,A
;校验波特率
SETB TR2
MOV SCON,#52H ;串行口方式1,TI=1
RREV0: ACALL REV_SEND0 ;接收一个字符"U"
CJNE A,#55H,RREV0 ;判断A="U"?
RET ;如果收到字符"U",则串口初始化完成
;==============================
;接收一个数据并返回给上位机
;==============================
REV_SEND0:
JNB RI, $
CLR RI
MOV A,SBUF ;接收数据
JNB TI,$
CLR TI
MOV SBUF,A ;发送数据
RET
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』