文章目录
前言
本文记录的是51单片机的定时器中断

一、中断框架

二、中断源默认优先级

三、中断原则

四、中断处理过程

五、定时/计数器的结构

定时器的结构图

六、定时/计数器的结构

七、定时时间计算

(12M) / 1 = 1us
最多可以计时:65535 * 1us = 65ms
例子:定时器方式1

八、代码
1.bsp_timer.c
代码如下(示例):
#include "./User/timer/bsp_timer.h"
void timer0_init(void)
{
TMOD |= (1 << 0); //设置定时器0为工作方式1
TH0 = TH0_VALUE; //装载初始值的高八位
TL0 = TL0_VALUE; //装载初始值的低八位
EA = 1; //总中断打开
ET0 = 1; //允许定时器0中断
TR0 = 1; //启动定时器
return ;
}
void timer1_init(void)
{
TMOD |= (1 << 4); //设置定时器1为工作方式1
TH1 = TH1_VALUE; //装载初始值的高八位
TL1 = TL1_VALUE; //装载初始值的低八位
EA = 1; //总中断打开
ET1 = 1; //允许定时器1中断
TR1 = 1; //启动定时器
return ;
}
2.bsp_timer.h
代码如下(示例):
#ifndef __BSP_TIMER0_H__
#define __BSP_TIMER0_H__
#include "./User/common/common.h"
#include <reg52.h>
#define TIMER0_PERIOD (50000) //50ms 50000 * 1us
#define TH0_VALUE ((65536-TIMER0_PERIOD)/256)
#define TL0_VALUE ((65536-TIMER0_PERIOD)%256)
#define TIMER1_PERIOD (50000) //50ms 50000 * 1us
#define TH1_VALUE ((65536-TIMER1_PERIOD)/256)
#define TL1_VALUE ((65536-TIMER1_PERIOD)%256)
void timer0_init(void);
void timer1_init(void);
#endif /* __BSP_TIMER0_H__ */
3.main.c
代码如下(示例):
/*
* 定时器0:1S让数码管+1
* 定时器1:8个LED灯,1s闪动10次
*/
#include <reg52.h>
#include "./User/common/common.h"
#include "./User/led/led.h"
#include "./User/nixie_tube/nixie_tube.h"
#include "./User/timer/bsp_timer.h"
uint8_t timer0_count = 0;
uint8_t timer1_count = 0;
void main(void)
{
uint8_t num = 0,aa;
led_init(); //led初始化
timer0_init(); //定时器0初始化
timer1_init(); //定时器1初始化
aa = 0xfe;
while(1)
{
if(timer0_count == 20) { //1S让数码管显示的数字自增1
timer0_count = 0;
seg_display(6, num++);
if(num > 15) {
num = 0;
}
}
if(timer1_count == 2)
{
timer1_count = 0;
P1 = aa;
aa=_crol_(aa,1);
}
}
}
//定时器0会50ms中断一次
void timer0() interrupt 1
{
TH0 = TH0_VALUE; //手动重新装载初始值的高八位
TL0 = TL0_VALUE; //手动重新装载初始值的低八位
timer0_count++;
}
//定时器1会50ms中断一次
void timer1() interrupt 3
{
TH1 = TH1_VALUE; //手动重新装载初始值的高八位
TL1 = TL1_VALUE; //手动重新装载初始值的低八位
timer1_count++;
}
1万+

被折叠的 条评论
为什么被折叠?



