新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > P89C51RD2的Boot ROM与ISP功能的实现

P89C51RD2的Boot ROM与ISP功能的实现

作者:时间:2012-04-09来源:网络收藏

3.1.2 tp对应的计数值

首先看一下在 中是如何计算一个位所对应的计数值的。以下为 从地址FC00H ~FC17H之间的源代码及反汇编程序:

源代码 反汇编程序
FC00 75 89 02 MOV TMOD,#02H ;T1工作模式2,定时器
FC03 75 C8 30 MOV T2CON,#30H ;T2工作为串行口波特
;率发生器
FC06 E4 CLR A
FC07 F5 CD MOV TH2,A
FC09 F5 CC MOV TL2,A ;T2=0000H
FC0B 30 B0 FD JNB P3.0,$ ;若P3.0=0,则等待,
;直到其变为1
FC0E 20 B0 FD JB P3.0,$ ;若P3.0=1,则等待,
;直到下降沿到来
FC11 D2 CA SETB TR2 ;启动T2定时器
FC13 30 B0 FD JNB P3.0,$ ;若P3.0=0,则等待,
;直到上升沿到来
FC16 C2 CA CLR TR2 ;关闭T2定时器,此时
;T2中的数值为tp

首先将T2清0,然后测下降沿,测到下降沿后,开始置TR2=1,T2开始计数,等测到上升沿后,置TR2=0,停止计数,则此时T2中为传送 1bit(低电平)的计数值。以波特率2400 bps为例,则传送1bit所用的时间为1/2400 s,即416.67μs。主频为11.0592 MHz,再由PHILIPS公司的数据手册可知,当T2工作于波特率发生器模式时,OSC未经分频直接进入T2计数器,由此可得在tp时间内T2的理论计数值为:(T2)=0.000 416 67×110 592 00= 4608(十进制)=1200H。在这里,特别要强调的是:该数只是一个理论值。对波特率为2400 bps时的实际值进行测试,发现实测值为11FAH左右。不管怎样测,实测值总是小于理论值6个数左右。这个数据为下面的波特率计算提供了重要依据。

3.1.3 波特率的计算

程序中对波特率的计算颇有特色,下面是地址FC18H~FC36H之间的源代码和反汇编程序:

源代码 反汇编程序
FC18 E5 CC MOV A,TL2
FC1A C4 SWAP A
FC1B 54 0F ANL A,#0FH ;取TL2高4位
FC1D F8 MOV R0,A
FC1E E5 CD MOV A,TH2
FC20 C4 SWAP A
FC21 54 F0 ANL A,#0F0H;取TH2低4位
FC23 48 ORL A,R0
FC24 F8 MOV R0,A ;组合后送入R0
FC25 E5 CD MOV A,TH2
FC27 C4 SWAP A
FC28 54 0F ANL A,#0FH ;取TH2高4位
FC2A F9 MOV R1,A
FC2B E8 MOV A,R0 ;以上程序T2中数据除以
;16,送R1和R0保存
FC2C F4 CPL A ;低位取反
FC2D F5 CC MOV TL2,A
FC2F F5 CA MOV RCAP2L,A
FC31 E9 MOV A,R1
FC32 F4 CPL A ;高位取反
FC33 F5 CD MOV TH2,A
FC35 F5 CB MOV RCAP2H,A

上述程序就是将tp对应值转换成波特率的程序,先来看一下波特率是怎样定义的。定时器2工作在波特率发生器模式,外部时钟信号由T2脚进入,波特率为

46.jpg

所以程序中首先将T2中的计数值进行处理,相当于右移4位,将低4位去掉,11FAH变为011FH,对应式(1)中除以16,送R1和R0保存,然后将R1和R0中的值取反,其值为FEE0H。该值恰恰与根据式(1)计算出的数值相同。将该数值送T2和RCAP2,即得2400bps对应的赋值。



评论


相关推荐

技术专区

关闭