C51的周期
结构图
两个功能寄存器
51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
工作方式寄存器TMOD
其中方式一和方式二常用
控制寄存器TCON
第四位用于控制外部中断,详见C51中断个人笔记
初始化函数中要完成的工作:
- 给TMOD赋值,确定工作方式
- 计算初值,写入TH0,TL0或TH1,TL1
- 中断允许控制,EA和ET0 或ET1的置位为1
- 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;
}
}