第6章 .P89C669的端口,电源控制和外围设备
注意: 特殊寄存器访问有一定的限制
1. 如果没有定义是不能被访问的
2. 必须严格按照特殊寄存器的功能来进行设置访问该寄存器
3. 特殊寄存器标志位必须按照如下规则进行读写
‘-’必须写0
‘0’写入0读出返回0
‘1’写入1读出返回1
4.
6.2 P89C669端口
6.2.1 端口 1 2 3 4
这些端口就象传统的80C51设备端口一样,他们有相同设置位地址在特殊寄存器地址空间
中分别为: 80H 90H A0H B0H
查看端口输出是逻辑的并且端口特殊寄存器和微控制器使用这个端口,为了让外围设备
完全控制专一的管脚,对应的特殊寄存器位要置为1,如果这些特殊寄存器位为0,那么
外围设备无法使用这些管脚来进行输出,因为寄存器的位始终为0。
6.2.2 端口4
P89C669拓展了一个端口4,这个端口对于一般的输出输出无效,他用来作用UART1使用P4
.0 (RXD1)和 P4 .1(TXD1),两个都有内置的上拉电阻。
6.3低功耗模式
6.3.1时钟关闭模式
这种静态设计可以时钟加速减少到0HZ,当震荡器停止工作,RAM和SFR保持原来的值,这
种模式利用和允许降低始终频率来减少系统功耗,是最低功耗掉电模式默认推荐使用的
。
6.3.2空闲模式
在空闲模式(表11) cpu保持睡眠状态不工作但是保持片内的设备都是激活的,在空闲模
式被激活在执行正常操作模式的最后一条指令后,CPU 片内RAM 和SFR都保持正确状态在
空闲期内,空闲模式设置由PCON寄存器中IDL位。
有两种方法来结束空闲模式 ,任何中断请求导致IDL位被清除,空闲模式被结束。中断
服务,然后跳出中断,这个指令结束后紧跟着执行设置硬件空闲模式指令。
硬件的重新复位是结束空闲模式的第二种方式,继续按照同样的方式进行处理在重新启
动后,重启后IDL位被默认标志为0,在真正复位和重设运算控制之前,将会执行一些指
令在空闲模式被设置后,也就是程序正常恢复执行,在这期间获取片内RAM是有限制的,
但是获取端口管脚没有限制的,推荐使用增加2个NOP指令在设置空间模式指令之后,为
了消除一些出乎意料的端口输出内容,紧跟着调用空闲模式的指令是不会被写到一个端
口管脚或是外部存储器中的。
6.3.3掉电模式
为了节省更多的能源,一种掉电方式可以由软件来调用设置(表11) ,在这个模式下,震
荡器停止工作,调用掉电方式指令是最后一个指令,这种模式关闭震荡器是为了达到最
小的功耗,掉电模式由 PCON寄存器中PD位设置。
MODE Program Memory ALE PSEN PORT 0 PORT 1 PORT 2 PORT 3
Idle Internal 1 1 Data Data Data Data
Idle External 1 1 Float Data Address Data
Power Down Internal 0 0 Data Data Data Data
Power Down External 0 0 Float Data Data Data
表11
6.3.4 上电标志
上电标志是由片内电路设置当Vdd和P89C69MX2同样升至0V,上电标志允用户使用决定是
否在停电后是上点复位还是热启动。POF位只能由软件来清除。
6.4定时/计数器 0和1
两个16位定时/计数寄存器:Timer0 Timer1可以被设置为作为定时或者事件计数器功能
(Figure27),寄存器每个机器周期都会自增,所以我们认为他可以记录机器周期数,
因为一个机器周期由6个震荡周期组成,记录倍率是1/6震荡分频。
在记数功能下,寄存器将自增来响应由1到0的跳变在对应的外部输入引脚,T0或T1在每
个机器周期都是外部引脚输入固定的信号采样
一个计数改变需要两个机器周期,如前一个机器周期是显示采样为正下个周期显示采样
为负,则判断其为下降沿,触发计数器记数一次,对于外部输入信号没有任何限制,但
是会确定一个标准样本在它改变之前,它会保存一个完整的机器周期,除了定时和计数
器外选择外,定时器还有4种工作方式。
6.4.1 模式0
将时钟中断设置为0模式看起来更像8048的时钟中断,一个8位计数器用32作为因子来除
,图29来显示定时模式操作
在这个模式下,时钟寄存器被配置成13位的寄存器,当记数从1转为0时,定时标志位TFn
会被设置,记数输入激活定时器当TRn = 1并且 GATE = 0或者INTn = 1.(设置GATE = 1
是允许外部输入引脚INTn控制定时器,更容易测量脉冲宽度),TRn受特殊寄存器TCON控
制图28,GATE受TMOD寄存器控制。
13位寄存器由8位THn和TLn的低5位组成,TLn的其他三位是不确定并且应该被忽略。设置
执行标志TRn不会清除这些寄存器的。
模式0对于定时0和定时1都是一样的图29,只有两个不同的GATE位,TIME0(TMOD.3)TIM
ER1(TMOD.7)
6.4.2模式1
模式1和模式0基本上是一样的,除了时钟寄存器变为16位(TLn8位)+TRn图30
6.4.3模式2
模式2将时钟寄存器自动配置成8位TLn,如图31,TLn中的溢出不仅仅影响到TFn中的内容
,也会重置TLn中内容为THn的内容表示,这个必须事先由软件进行调整。这个重新设置
不会改变THn的内容。模式2对于Timer0 Time1都是一样的。见图31
图31
6.4.4模式3
当TIMER1设置为模式3那么将会被关闭(保持记数功能),设置TR1=0设置定时无效达到
同样的效果。
Timer0设置为模式3时,那么TL0和TH0是两个单独的8位记数寄存器,模式3逻辑控制和TI
MER0设置如图32,TL0使用TIMER0的控制位:T0C/T,T0GATE,TF0,TH0是由于附属电路
缺乏只能作为8位的定时器,而且还借用了T1的启动,停止开关TR1和溢出标志TF1,因为
T1两个重要部件被借用所以T1无法构成该模式
6.5TIMER2
TIMER2是16位的定时/记数器可以被用来做为事件定时器或者记数器,可以由特殊寄存器
T2CON中的C/T2可以进行选择。TIMER2有四种工作方式: 捕获,自动重置(增加或减少记
数), 时钟溢出,普通波特率。工作方式的选择通过T2CON和 T2 MOD控制。如图33和34
RCLK+TCLK CP/RL2 TR2 T2OE MODE
0 0 1 0 16-BIT auto reload
0 1 1 0 16-bit capture
0 0 1 1 Programmable Clock-Out
1 X 1 0 Baud rate generator for UART 0
X X 0 X off
表12
6.5.1捕获模式
在捕获模式中可以有两个选择通过控制T2CON中的EXEN2位 ,如果EXEN2位为0TIMER就是
一个16位的计数器或者定时器,溢出位是TF2。这个位可以产生一个中断通过激活TIMER2
的寄存器IEN0中的中断位,如果EXEN2= 1的话,TIMER2工作就像下图,但是增加特征如
外部引脚T2EX输入信号由1->0时,会引起当前T2寄存器捕获模式,TL2 TH2将会被捕获到
RCAP2L RCAP2H中。
图三十五
另外,T2EX引脚的输入跳变会引起 T2CON中的EXF2位被设置,EXF2和TF2一样会产生一
个中断(和溢出中断向量设置是相同的),Timer2的中断服务路游会审核到底是EXF2还
是TF2申请中断服务。
这里没有重新装载TL2和TH2,当由EX2T产生捕获事件后,计数器保持T2引脚记数或者f(o
sc)/6脉冲,既然一旦设置那么RCAP2L RACP2H的内容将不受保护,一旦TIMER2中断请求
,那么必须先于一个新的EX2T引脚产生捕获事件,否则,下次的T2EX引脚的下降沿会取
消重置当前TL2和TH2到RCAP2L和RCAP2H寄存器中,结果会破坏先前中断报告相关的内容
。
捕获模式可以看下图36
6.5.2自动重置模式
在16位的的自动重置模式中,TIMER2被设置为 定时器或者计数器通过T2CON中的C/T2,
然后决定程序记数增加还是减少,如何记数将由寄存器T2MOD中的DECN(向下记数有效)
位设置来决定。当复位时,DECN = 0,TIMER2默认记数为向上增长方式,如果DCEN位被
设置那么记数方式将由T2EX引脚的值来决定。
图36展示TIMER2自动向上记录(DECN=0)
这个模式下,有两种选择方式通过设置T2CON寄存器中EXEN2位,如果EXEN2=0那么计数器
向上记数到FFFFH将会产生溢出,自动设置TF2位,然后产生让TIMER2将RCAP2L和RCAP2H
中的内容装载进TL2和TH2中,RCAP2L和RCAP2H的内容由软件预先设定,自动装载的频率
可以由这个公式计算:
SupplyFrequent /(65535-(RCAP2H,RCAP2L) )
SupplyFrequent要么是f(osc) = 0 (C/T2 = 0)的或者T2引脚 C/T2 =1
如果EXEN2=1,16位重置被引发通过溢出或者T2EX引脚由1- 》0跳变,这个跳变同样会引
起EXF2位的设置,第一个时钟周期T2EX引脚采样为1,第二个时钟周期采样位0那么EXF2
就会被置为1,定时器产生中断如果设置有效,将被产生当TF2或者EXF2位被设置为1。
处理器需要连续的三个机器周期来辨认下降沿,第一个机器周期由T2EX 引脚采样为1,
第二个机器周期引脚采样为0,然后第三个机器周期则设置EXF2=1
在图37,DCEN = 1并且 时钟2可被设置向上记数或者向下记数,允许T2EX引脚来控制记
数的方向,如果T2EX逻辑为1将设置向上记数,TIMER2将溢出在FFFFH时,并设置溢出位T
F2,来产生一个中断,这个中断同样又产生RCAP2L RCAP2H捕获内容重新装载进入TL2
TH2中。当T2EX逻辑为0那么记数器向下记数,那么当TL2和TH2中的数据与RCAP2L和RCAP2
H中的内容相等时,产生一个溢出中断,同时将FFFFH重新装载入TL2和TH2中。EXF2位固
定表示溢出或者下溢,EXF2必要时候还可以表示为第17位。
图37
6.5.3可编程的时钟溢出
一半的时钟周期输出至T2脚(P1.0),p1.0除了作为标准I/O引脚,还有两个拓展的功能:
1. 输入外部时钟作为定时器/计数器
2. 在16MHZ的操作频率之下,输出一个频率在122HZ到8MHZ范围之间的50%的占空
配置一个定时器/计数器作为一个时钟发生器,T2CON中的C/T2位必须清除,T2MOD中的T2
0E位必须被设置,T2CON。2(TR2)同样必须被设置来启动定时器。
时钟溢出频率取决于震荡频率和重新装载T2捕获值(RCAP2L,RCAP2H)的值,可以看下面这
个等式:
OscillatorFrequenty/2*(65535-(RCAP2H, RCAP2L))
(RCAP2H, RCAP2L)是RCAP2H, RCAP2L两个无符号寄存器的值。
在时钟溢出模式下,T2的跳变不会引起中断,这个比较类似于当作波特率来使用情况。
6.5.4 UART0波特率发生器模式
当端口作为独立的波特率发生器 (SOBRGS=0,BRGSCON.1),TCON中的TCLK位或RCLK位
允许传输和接收波特率由T1或T0发送的。假定S0BRGS=0,当TCLK=0时,定时器1作为UART
0传输波特率发生器。当TCLK=1时定时器2作为UART0传输波特率发生器。RCLK和TCLK差不
多使用,只是定时器改为UART0的接收波特率发生器。
下面图38就是波特率发生器模式
波特率发生器模式就像自动装载模式,当TH2的跳变会引起TIMER2的重新装载进RCAP2L,
RCAP2H预先设置的内容。波特率发生器在模式一和模式三时是由T2给出的益处率决定的
。
模式1和模式3的波特率 = 震荡器频率 / (16 * (65535 - (RCAP2H,RCAP2L)))
(RCAP2H,RCAP2L)是组成无符号的16位整形。
TIMER2作为波特率发生器只有当RCLK/TCLK =1时才有意义,注意此时TH2中的跳变不会设
置TF2位,不会引起中断,所以在TIMER2设置为波特率发生器时,没有必要关闭相应的中
断设置。同样如果EXEN2被设置,1-0的跳变引起定时器/计数器的输入,将引起EXF2(T2
外部标志)被设置但是不会引起重载入,所以当T2作为波特率发生器时,T2EX有需要的
话可以作为产生外部中断使用。
当T2作为波特率发生器模式时,最好不要单独读写TH2 TL2,在这个条件下读写TH2,TL2
有可能是不准确的,RCAP2寄存器是可读的,但是不要写入,这样可能会产生一个重复的
装载导致写入或者重新装载错误,TIMER应该被关闭(TR2清除)在需要获取T2或者RCAP2
之前,表13显示使用波特率发生器和如何获取TIMER2
6.5.5 波特率公式的概要
TIMER2在设置为波特率发生模式,如果TIMER2通过T2(P1。0)脚记数,那么波特率的计
算: 波特率 = 时钟溢出率 / 16
如果时钟2通过内部记数
波特率 = f(osc) / (16 *( 65535 – (RCAP2H, RCAP2L)))
f(osc) 为震荡器的频率
获取RCAP2H,RCAP2L的值的计算公式:
RCAP2H,RCAP2L = 65535 – f(osc)/(16*波特率)