8951定时器的定时中断模式

发布者:legend8最新更新时间:2022-06-06 来源: eefocus关键字:定时器 手机看文章 扫描二维码
随时随地手机看文章

定时器的使用与我之前所说的中断使用差不多。首先也是设置初始化定时器。先上代码:


#include

#define uchar unsigned char

#define uint unsigned int

sbit led=P1^0;

sbit s1=P3^0;

sbit s2=P3^1;

uchar counter=0;

uchar temp=0;

uchar flag=0;

code uchar a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

 

void delay(uint t)

{

  uint i;

  while(t--)

  {

   for(i=125;i>0;i--);

  }

  

}

 

void show()

{

  P2=a[temp/10];s1=1;delay(1);s1=0;

  P2=a[temp%10];s2=1;delay(1);s2=0;

}

 

void main()

{

TMOD=0x01; //设置T0定时器工作模式

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

 

IT0=1;//设置外部中断0的触发方式为低电平触发

EX0=1;//外部中断0的开关

ET0=1;//定时器0的中断设置必须要在启动定时器之前

    TR0=1;//启用定时器

EA=1;

while(1)

{

show();

}

}

 

void ET0_Int(void) interrupt 1

{

TH0=(65536-50000)/256;//重装    在其自身外部中断中无需设置标志位归零!!!!!

TL0=(65536-50000)%256;

counter++;

if(counter%10==0)

{

led=!led;

}

 

if(counter==20)

{

counter=0;

temp++;

if(temp==59)

temp=0;

}

}

 

void Ex0_ISR(void) interrupt 0

{

 

 flag++;

 if(flag==1)TR0=1;   //启动定时器0 ,开始计时,数码管跳转

 if(flag==2)TR0=0;    //停止定时器的工作 

 if(flag==3)

 {

  flag=0;

temp=0;

 }

 

}

这个篇代码可能被我改的有些复杂,看不懂不要急。 只需要了解重点语句就好。


首先是定时器的初始化在main函数里:


   

    TMOD=0x01; //设置T0定时器工作模式

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

 

IT0=1;//设置外部中断0的触发方式为低电平触发

EX0=1;//外部中断0的开关

ET0=1;//定时器0的中断设置必须要在启动定时器之前

EA=1;

定时器的初始化比外部终端的初始化语句多一点。


首先是设置工作模式这里是0x01,这种模式就像一个闹钟,设置好时间,它每到时间就“报警”一次。总共有四种工作方式,在此先记这一种。


TMOD=0x01; //设置T0定时器工作模式

上面这句就是设置定时器工作方式。前面说了它这种工作模式工作像闹钟,为此要设置他的工作时间间隔。


TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

哈哈,看不懂吧,不要急,慢慢来。它这种工作方式设置工作时间 还真不好理解。TH和TL中分别有一个H和L表示High和Low的意思就是高位和地位的意思。对于一个数如5201314来说吧,想要把520和1314分开,就要进行运算,想得到520就是:5201314/10000就等于520,而1314=5201314%10000然后把520给高位 1314给低位,只不过这里必须对256运算。一个数,高位在前,低位在后。对于这个65535是固定的,后面的50000表示50000us(50000us=50ms=0.05s)。这样他就会每个0.05s执行一次中断服务程序,也就是这个


void ET0_Int(void) interrupt 1

函数里面的语句。然后接着解释代码:


IT0=1;//设置外部中断0的触发方式为低电平触发

EX0=1;//外部中断0的开关

ET0=1;//定时器0的中断设置必须要在启动定时器之前

    TR0=1;//启用定时器

EA=1;

这个IT0是外部中断0的,在这个程序里我使用了外部中断0和定时器0。EX0也不多说了他也是外部中断0的。主要是ET0=1和TR0=1的顺序不要写错。要是IT0=1,EX0=1,EA=1都看不懂是什么意思就不要往下看了,先去学习外部中断。


设置好了,他就是隔0.05s执行那个函数,这个函数里面有一个counter++和两个if语句,由此能看出来每次响应中断服务时候都会对counter进行加一运算。当counter对于20时也就是执行了中断响应服务20次,前面咱给他设置的时间间隔是0.05s执行了20次的时间就是0.05s×20=1s。所以说if(counter==20)里的语句每个一秒执行一次。由此看之,设置每个多长时间做什么,其实就是对运行次数的检测。同理,另一个if就是每隔0.5s执行一次led=!led语句。


在定时器这部分中,我觉着设置定时时间,这块不好理解。上面的理解看不懂的可以这样记忆也行。


TH0=(65536-50000)/256;

TL0=(65536-50000)%256;


设置时间就用这样设置,里面的50000可以变。这里50000us=0.05s,就是每隔0.05s执行一次中断服务程序。于是可以自己算,想隔多少秒就把0.05s替换就好。

关键字:定时器 引用地址:8951定时器的定时中断模式

上一篇:89C51单片机的中断基础
下一篇:单片机8951定时器计数模式的设置

推荐阅读最新更新时间:2024-11-02 10:20

【自学51单片机】5 --- 定时器、数码管、逻辑运算、
定时器介绍、数码管静态显示、逻辑运算符和逻辑电路符号 1、逻辑运算和逻辑电路 引入逻辑概念:在生活中,逻辑存在 ‘真’ 和 ‘假’ 两个逻辑值,而逻辑对应到C语言和数字电路中, ‘真’ 对应C语言或数字电路中的一切 ‘非0值’,而 ’假‘ 对应为 ’0值‘。 1.1 C语言逻辑运算符 假定两个字节变量A和B,两者进行某种逻辑运算后结果为F。 以下为逻辑运算符(按变量整体值进行运算) && 逻辑与:F = A && B,当 A、B 的值都为真(即非 0 值,下同)时,其运算结果 F 为真(具体数值为 1,下同);当 A、B 值任意一个为假(即 0,下同)时,结果 F 为假(具体数值为 0,下同)。 || 逻辑或:F
[单片机]
【自学51单片机】5 --- <font color='red'>定时器</font>、数码管、逻辑运算、
STM32 关于定时器相关问题的探讨(一)
STM32F4 PWM模块探讨 1.STM32定时器认识 1.1 基本定时器 基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。此类定时器不仅可用作通用定时器以生成时基, 还可以专门用于驱动数模转换器 。(DAC)。 通用定时器特性 16 位自动重载递增计数器 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间 用于触发 DAC 的同步电路 发生如下更新事件时会生成中断/DMA 请求:计数器上溢 1.2 通用定时器 1.2.1 TIM~TIM5 通用定时器包含一个 16 位或 32 位自动重载计数器,该计数器由可
[单片机]
51定时器初始化步骤
定时器初始化需要六步: void TimerInit() { TMOD = 0X01; TH0 = (65536 - X) /256;//(65536-X)为定时器初值,如定时10ms,则X=1000 TL0 = (65536 - X)%256; EA = 1; ET0 = 1; TR0 = 1; } 中断函数: void Timer0 interrupt 1 { TH0 = (65536-X)/256; TL0 = (65536-X)%256; num++; if(num 100) num = 1; } /////////////////////////////////////////////////////////////
[单片机]
STM32定时器输出带有死区时间的PWM波形
要求得到下列波形,死区时间为1us,CH1,CH2,CH3之间的相位差为3us,频率为50KHz main.c /********************************************* 标题:定时器输出带有死区时间的PWM波形 软件平台:MDK-ARM Standard Version4.70 硬件平台:stm32f4-discovery 主频:168M Periph_Driver_version: V1.0.0 描述:用一个定时器(TIM1),输出带有死区时间的PWM波形,要求:死区时间为1us,CH1,CH2,CH3之间的相位差为3us,频率为50KHz 代码参考
[单片机]
STM32<font color='red'>定时器</font>输出带有死区时间的PWM波形
stm32定时器误区
在用到STM32定时器的更新中断时,发现有些情形下只要开启定时器就立即进入一次中断。准确说,只要使能更新中断允许位就立即响应一次更新中断【当然前提是相关NVIC也已经配置好】。换言之,只要使能了相关定时器更新中断,不管你定时间隔多长甚至不在乎你是否启动了相关定时器,它都会立即进入一次定时器更新中断服务程序。 以STM32F051芯片为例,做了几种不同顺序的组合测试。根据测试发现,的确有些情况下一运行TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 【即使能更新中断】就立即进入更新中断服务程序。当然后面的中断都是正常的。 老实说,这个问题比较容易忽视,有些情况下也无关紧要,但有些情况可能会给应
[单片机]
stm32<font color='red'>定时器</font>误区
AVR单片机定时器做的门铃程序+电路
#define F_CPU 1000000UL #include avr/io.h #include avr/interrupt.h #include util/delay.h #define INT8U unsigned char #define INT16U unsigned int #define DoorBell() (PORTD ^= 0x01) / #define Key_DOWN() ((PINB & 0x80) == 0x00) volatile INT16U soundDelay; //两个不同取值分别对应于 叮 , 咚 int main() {
[单片机]
AVR单片机<font color='red'>定时器</font>做的门铃程序+电路
Cortex-M3 (NXP LPC1788)之SysTick系统节拍定时器
在GPIO控制篇中的延时闪烁LED只用了简单的for循环,为了精确的计时本篇介绍使用SysTick定时器每1ms产生中断,从而实现精确定时的目的。要使用系统节拍定时器主要进行两个部分的配置。1:系统时钟控制。2系统节拍定时器的控制。 一,系统时钟控制 LPC1788有3个独立的振荡器。他们是主振荡器,内部RC振荡器,RTC振荡器。复位后,LPC1788将用内部的RC振荡器运行,直到被软件切换。这样就能在没有任何外部晶振的情况下运行。LPC1788的时钟控制如图1所示 在开发板上使用12M的晶振作为主振荡器,它通过锁相环PLL0来提高频率提供CPU。由于芯片总是从内部的RC振荡器开始工作,因此主振荡器
[单片机]
Cortex-M3 (NXP LPC1788)之SysTick系统节拍<font color='red'>定时器</font>
52单片机定时器/计数器编程汇总
/*---------------------------------------------------------------------- TMOD (89H) T1 T0 GATE C/T` M1 M0 GATE C/T` M1 M0 ------------------------------------------------------------------------ GATE=0时,TR0=1,T0就开始定时/计数 GATE=1时,TR0=1,INT0`=1,T0才开始定时/计数 C/T`=0,计数;C/T`
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved