51单片机学习笔记———11.使用定时器0定时一定时间并在中断处理程序中执行代码

实验任务: 使用定时器0定时一定时间并在中断处理程序中执行代码		
实现现象:LED1每隔0.5s亮灭变化一次
硬件接线:J14跳线帽拿掉,否则下面一排LED会点亮影响观察上面一排LED灯
注意事项:(1) 板载晶振为12MHz,默认12T模式下时钟周期为1us,因此定时最大值为65535*1us = 65.5ms,若需要定时时间超过65.5ms,则不能直接定时,需要通过中断计数方式来实现。(2) 中断计数可以通过全局变量来实现(本例程中即是),也可以通过静态局部变量来实现(static)/*
**********************************************************************
*                         头文件包含
**********************************************************************
*/
#include <reg52.h>/*
**********************************************************************
*                         本地宏定义
**********************************************************************
*/
typedef unsigned char u8; 		// 重命名类型u8简化代码编写
typedef unsigned int u16;/*
**********************************************************************
*                         本地全局变量
**********************************************************************
*/
sbit gLed1 = P2^0;				// LED1接在P2.0
u8 gCnt = 0;					// gCnt用来计算中断次数/*
**********************************************************************
*                         函数原型声明
**********************************************************************
*/
void Timer0Init(void);/*********************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 参数列表       : 无
* 函数输出    	 : 无
*********************************************************************/
void main(void)
{Timer0Init();while (1);
}/*********************************************************************
* 函 数 名       : Timer0Init
* 函数功能		 : 定时器0初始化函数
* 参数列表       : 无
* 函数输出    	 : 无
*********************************************************************/
void Timer0Init(void)
{TMOD &= 0xf0;		// T0设为定时器模式,仅用TR0控制打开TMOD |= 0x01;		// T0选择为工作模式1:16位定时器、TH0 TL0全使用TH0 = 0xd8;			// 计算10ms定时的TH0、TL0初值TL0 = 0xf0;	ET0 = 1;			// 打开定时器0中断允许EA = 1;				// 打开总中断TR0 = 1;			// 开始计时			
}/*********************************************************************
* 函 数 名       : Timer0Isr
* 函数功能		 : 定时器0中断处理程序
* 参数列表       : 无
* 函数输出    	 : 无
*********************************************************************/
void Timer0Isr(void) interrupt 1
{TH0 = 0xd8;				// 计算10ms定时的TH0、TL0初值TL0 = 0xf0;	if (gCnt++ >= 50)		// 每隔50*10ms = 500ms,则让LED亮灭状态转换一次{gCnt = 0;			// gCnt置为初值0以开启下一次中断次数计数gLed1 = !gLed1;	   	// LED亮灭转换	}
}

51单片机学习笔记———11.使用定时器0定时一定时间并在中断处理程序中执行代码

实验任务: 使用定时器0定时一定时间并在中断处理程序中执行代码		
实现现象:LED1每隔0.5s亮灭变化一次
硬件接线:J14跳线帽拿掉,否则下面一排LED会点亮影响观察上面一排LED灯
注意事项:(1) 板载晶振为12MHz,默认12T模式下时钟周期为1us,因此定时最大值为65535*1us = 65.5ms,若需要定时时间超过65.5ms,则不能直接定时,需要通过中断计数方式来实现。(2) 中断计数可以通过全局变量来实现(本例程中即是),也可以通过静态局部变量来实现(static)/*
**********************************************************************
*                         头文件包含
**********************************************************************
*/
#include <reg52.h>/*
**********************************************************************
*                         本地宏定义
**********************************************************************
*/
typedef unsigned char u8; 		// 重命名类型u8简化代码编写
typedef unsigned int u16;/*
**********************************************************************
*                         本地全局变量
**********************************************************************
*/
sbit gLed1 = P2^0;				// LED1接在P2.0
u8 gCnt = 0;					// gCnt用来计算中断次数/*
**********************************************************************
*                         函数原型声明
**********************************************************************
*/
void Timer0Init(void);/*********************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 参数列表       : 无
* 函数输出    	 : 无
*********************************************************************/
void main(void)
{Timer0Init();while (1);
}/*********************************************************************
* 函 数 名       : Timer0Init
* 函数功能		 : 定时器0初始化函数
* 参数列表       : 无
* 函数输出    	 : 无
*********************************************************************/
void Timer0Init(void)
{TMOD &= 0xf0;		// T0设为定时器模式,仅用TR0控制打开TMOD |= 0x01;		// T0选择为工作模式1:16位定时器、TH0 TL0全使用TH0 = 0xd8;			// 计算10ms定时的TH0、TL0初值TL0 = 0xf0;	ET0 = 1;			// 打开定时器0中断允许EA = 1;				// 打开总中断TR0 = 1;			// 开始计时			
}/*********************************************************************
* 函 数 名       : Timer0Isr
* 函数功能		 : 定时器0中断处理程序
* 参数列表       : 无
* 函数输出    	 : 无
*********************************************************************/
void Timer0Isr(void) interrupt 1
{TH0 = 0xd8;				// 计算10ms定时的TH0、TL0初值TL0 = 0xf0;	if (gCnt++ >= 50)		// 每隔50*10ms = 500ms,则让LED亮灭状态转换一次{gCnt = 0;			// gCnt置为初值0以开启下一次中断次数计数gLed1 = !gLed1;	   	// LED亮灭转换	}
}