在S51单片机中,有两个16位的定时器,一般的程序用用也差不多,但是有些情况下两个定时器还真不够用,比如在直流电机调速的项目中,一个用于测电机旋转时切割光耦通路产生的脉冲;另一个用于定时精确1S,作为电机转速测量的门控信号。控制电机转速的PWM波也需要定时器产生,假设与以上其中的一个定时器共用,在中断程序中构成软件计数器,这样做可能会造成系统的精度下降,产生误差。
S51单片机的硬件资源确实太少了,然后用了S52,利用T2定时器产生PWM才把问题解决了。
这里上一个S52的T2定时器做普通定时器的用法。笔记~
// 文件名: T2.c
// 功能: T2定时器作普通定时器用
// 说明: (1)单片机AT89S52,晶振12MHZ;
// (2)T2的中断标志位不能硬件自动清零,必须在中断服务程序软件清零,
// 为了定时的准确,在进入中断服务程序后第一步就使TF2=0 ;
// (3)T2工作在16位自动重装模式下,不需要在中断服务程序重新赋值,硬件会自动使TH2=RCAP2H,TL2=RCAP2L;
// 日期: 2011年4月6日
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit LED= P1 ^ 0;
void timer2_int(void) interrupt 5
{
static uchar timer_counter;
TF2=0; //注意 T2的溢出标志位必须软件清零,硬件不能清零,这与T0和T1不同!!
timer_counter++;
if(timer_counter==20) //定时50ms×20=1000ms即1秒钟,
{
LED=!LED; //秒闪烁灯
timer_counter=0;
}
}
//初始化主函数
void main(void)
{
RCAP2H=0X3C; //定时50ms常数
RCAP2L=0xB0;
TH2=RCAP2H; //定时器2赋初值
TL2=RCAP2L;
ET2=1; //开外定时器2中断
EA=1; //开总中断,
TR2=1; //启动定时器2
while(1);
}
文章评论(0条评论)
登录后参与讨论