单片机
返回首页

单片机的定时器中断0

2015-05-21 来源:51hei

定时器工作的流程可以按照这个顺序(以51为例用定时器0方式一产生50毫秒的定时)
1、确定使用哪个定时器,使用哪种方式,这一步通过TMOD设置,TMOD的低四位是设置定时器0的,高四位是用来设置定时器1的,其中的M0,M1是用来设置定时器工作在哪种方式,GATE一般用不要设置,C/T是选择计数模式还是定时模式的,如:TMOD = 0X01,就说明定时器0工作在方式1。
2、接下来就要设置定时的时间,用定时器定时50毫秒,可以用这种方式TH0 = (65535 - 50000) / 256,TL0 = (65535 - 50000) % 256;可以这样理解:因为这是定时器的初值,也就是说计数脉冲就是在这个数的基础上向上递增,到达65535后就溢出产生中断
3、第三步就要打开中断了,使用IE寄存器,我一般是对各个位进行单独设置,这样看起来感觉更好,首先打开总中断EA = 1,这一步是所有中断所必须的,然后打开定时器0中断,ET0 =1;
4、这时准备工作都准备好了就要开始启动定时器了,使用TCON寄存器,TR0 = 1,到现在为止就实现了一个50毫秒的定时了;
总结一下:TMOD = 0X01; TH0 = (65535 - 5000) / 256; TL0 = (65535 - 50000) % 256; EA = 1; ET0 = 1; TR0 = 1,至于那个中断函数我就不写了,要注意的是方式0 ,1, 3是不能自动重装的,所以得在中断函数中重新对TH0 ,TL0赋初值

TMOD


TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
        定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。
其格式为:

 

工作原理

其中低四位(即D0 ~ D3)定义定时器/计数器T0,高四位(即D4 ~ D7)定义定时器/计数器T1。

 

Ⅰ,GATE——门控制。

●GATE=1时,“与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx·INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。
当INT0引脚为高电平时且TR0置位,TR0=1;启动定时器T0;
当INT1引脚为高电平时且TR1置位,TR1=1;启动定时器T1。
●GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。
当TR0=1,启动定时器T0。
当TR1=1,启动定时器T1。

Ⅱ,C/T——功能选择位

C/T=0时为定时功能: 加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
C/T=1时为计数功能: 加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;

Ⅲ,M0、M1——方式选择功能

MCS-51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3。
MCS-51的定时器T1有3种工作方式:方式0,方式1,方式2。
M1
M0
工作方式
功能说明
0
0
方式0
13位定时器/计数器
0
1
方式1
16位定时器/计数器
1
0
方式2
自动重载8位定时器/计数器
1
1
方式3
T0分为2个8位独立计数器,T1停止计数

#include
#include
#define uint unsigned int 
#define uchar unsigned char
sbit D1=P2^0;
uchar num,time;
uchar wnum=0x00;
uchar code dbit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选,选择要显示的数字
//uchar code wnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//八位数码管    
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
P1=wnum;
time=0;
num=0;
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//打开中断总开关
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
if(time==20)
{
D1=~D1;
time=0;
num++;
num=num%10;
if(num==10)
{
num=0;
}
P0=dbit[num];
}
}
}
void duan() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章