9.4.2 定时器/计数器模式2的程序设计

定时器/计数器模式2是自动重装载模式,在这种模式下,计数器初值只需设置1次,在定时器溢出后不用软件重新设置,硬件会自动复位。工作模式2常作为串行口波特率发生器使用。这里假设单片机外接11.0592MHz晶振,使用工作于模式2的定时器/计数器T1作为串行通信的波特率发生器。此时,C51程序示例如下。


include<ctype.h>//头文件

include<stdio.h>

include<reg51.h>

void main(void)//主函数

{

unsigned char i;//变量声明

bit b;

char*ch;

SCON=0x50;//串口模式1,允许接收

TMOD|=0x20;//初始化T1为定时功能,模式2

PCON|=0x80;//设置SMOD=1

TL1=0xF4;//波特率4800bit/s,初值

TH1=0xF4;

IE|=0x90;//中断

TR1=1;//启动定时器

for(i=0;i<128;i++)//循环输出

{

b=isalpha(i);//调用函数判断

if(b)

ch=“Yes”;

else

ch=“NO”;

printf(“isalpha(%c)=%s\n”,i,ch);//输出结果

}

}


该程序可以在KeilµVision3集成开发环境中运行。在程序中,初始化定时器/计数器T1为定时功能,工作于模式2,并设置TL1和TH1的初值来产生4800bit/s的波特率。由于工作模式2在溢出时可以自动重装,因此,只要设置初值后,便可以一直工作。接着,程序中通过串口循环输出字符串。

提示串口波特率的计算。串口每秒针发送(或接收)的位数就是串口的波特率,也称为数据传输率。串口有多种工作方式,本例中使用的是工作方式1,对于工作方式1,其波特率(数据传输率)和定时器的溢出率有关。定时器的溢出率就是指定时器每秒钟产生多少次溢出。在串口工作方式1时,计算串口波特率的公式是:2SMOD/32定时器溢出率,如果SMOD为1,则为定时器溢出率除以16。在本例中,设置定时器的初始为0xF4(十进制的244),则每执行12个机器周期定时器就会产生一次溢出,一次溢出的时间为12机器周期=12*(12/11.0592)=13.02083µs,则每秒钟溢出为1s/13.02083µs/次=76800次/s,如果SMOD设置为1,则波特率为76800/16=4800。如果SMOD设置为0,则波特率为76800/32=2400。