C51 定时器/计数器 个人笔记

C51的周期

结构图

结构图

两个功能寄存器

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
工作方式寄存器

工作方式寄存器TMOD


其中方式一和方式二常用

控制寄存器TCON

第四位用于控制外部中断,详见C51中断个人笔记

初始化函数中要完成的工作:

  1. 给TMOD赋值,确定工作方式
  2. 计算初值,写入TH0,TL0或TH1,TL1
  3. 中断允许控制,EA和ET0 或ET1的置位为1
  4. TR0或TR1置位,启动定时计数器

计数初值的计算

首先知道振荡周期是多少,从而机器周期是其12倍,即每计一个数,用时为机器周期
若需求是计一个数就溢出,则初值应设为65535,即65536-1 (如果是16位计数器)
若需求是计n个数就溢出,则初值应设为65536-n (如果是16位计数器)

例如,定时一毫秒。一个机器周期是1微秒,故1000个机器周期是1ms。
初值为 65536-1000 = 64536 ,十六进制为FC18
所以

TH0 = 0xFC;
TL0 = 0x18;

完整代码

#include <reg51.h>
typedef unsigned int u16;		 
typedef unsigned char u8;
#define delaytime 500000
sbit led = P0^0;
			  
/*
void delay(u16 i)
{
    while(i--);
}
*/
void T0Init()
{
	//1.选择工作方式,给TMOD 赋值
	//TMOD:	GATE	C~T	 M1	M0	 (低四位是T0)
	//           0      0    0  1  (方式一)
	// xxxx 0001
	TMOD |= 0x01;
	//2. 计算初值,写入计数器
	TH0=0XFC;				//给定时器赋初值,定时1ms	  0xFC18 = 65536 - 1000  微秒
	TL0=0X18;	
	//3. 中断允许:总允许和T0允许
	ET0 = 1 ;
	EA = 1;
	//4. 开始定时
	TR0=1;
}
void main(void)
{
    T0Init();
    while(1);
}
//外部中断0的调用程序
void Timer0() interrupt 1			  //	T0溢出时引用
{
	static u16 i;
	TH0=0XFC;				//给定时器赋初值,定时1ms	  0xFC18 = 65536 - 1000  微秒
	TL0=0X18;
	i++;
	if(i==1000)			   //1s
	{
		i=0;
		led = ~led;
	}
}
原文地址:https://www.cnblogs.com/YuQiao0303/p/9909147.html