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。