|
来源:网上转载 作者:
在另外一套程序中并没有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 |