本章重点学习将TIM0用作13位定时器。
#include <REG51.h> //包含头文件REG51.h,使能51内部寄存器;
//定时器的方式控制寄存器TMOD: GATE1,C/T1,M1_1,M1_0,GATE0,C/T0,M0_1,M0_0
//GATE1=1,表示T1是受INT1脚(P3.3)控制运行;
//C/T1=0,表示T1的时钟源为fosc/12;C/T1=1,表示T1的时钟源为T1脚(P3.5);
//GATE0=1,表示T0是受INT0脚(P3.2)控制运行;
//C/T0=0,表示T0的时钟源为fosc/12;C/T0=1,表示T0的时钟源为T0脚(P3.4);
//下面说明T0的工作方式
//M0_1:M0_0=00,表示T0为13位定时器/计数器;
//M0_1:M0_0=01,表示T0为16位定时器/计数器;
//M0_1:M0_0=10,表示T0为8位自动重装载定时器/计数器;
//M0_1:M0_0=11,表示T0分为两个8位计数器;
//下面说明T1的工作方式
//M1_1:M1_0=00,表示T1为13位定时器/计数器;
//M1_1:M1_0=01,表示T1为16位定时器/计数器;
//M1_1:M1_0=10,表示T1为8位自动重装载定时器/计数器;
//M1_1:M1_0=11,表示T1没有此工作方式;
//定时器的控制寄存器TCON: TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0
//TF1=1,表示T1溢出到0x0000,CPU响应中断后,由硬件自动清除;
//当GATE1=0时,TR1=1,表示启动T1开始工作,当GATE1=1时,Timer1由INT1脚(P3.3)和TR0控制;
//TF0=1,表示T0溢出到0x0000,CPU响应中断后,由硬件自动清除;
//当GATE0=0时,TR0=1,表示启动T0开始工作,当GATE0=1时,Timer0由INT0脚(P3.2)和TR0控制;
#define OSC_FREQ 12000000L //定义晶振频率为12MHz;
#define instruction_period 1 //定义指令周期为1us;
#define T0_Load_Value 8192-5000L*instruction_period //配置T0为5000us中断一次;
sbit LED = P1^0;
.uynsigned int Time0Count;
//函数功能: Timer0的中断服务函数,每5000us中断一次;
void timer0_interrupt_program() interrupt 1 using 1
{ TL0=T0_Load_Value&0x1F; //手动装载最低5位值;
TH0=T0_Load_Value>>5; //手动装载剩下的8位值;
Time0Count++;
if(Time0Count%1000==0) //500ms时间到
LED=~LED;
}
//函数功能: Timer0初始化;
void timer0_initializtion(void)
{ TMOD&= 0xF4;
//配置Timer0为方式0(13位定时器),同时设置GATE0=0,即不允许外部INT0脚控制Timer0;
TL0=T0_Load_Value&0x1F; //手动装载最低5位值;
TH0=T0_Load_Value>>5; //手动装载剩下的8位值;
TR0=1; //当GATE0=0时,TR0=1,表示启动T0开始工作;
ET0=1; //允许Timer0中断;
EA=1; //开总中断允许位;
Time0Count=0;
}
void main(void)
{ timer0_initializtion(); //Timer0初始化;
while(1);
{
}
}