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亮灭转换 }
}
发布评论