您的位置 首页 方案

单片机的定时器中止0

定时器工作的流程可以按照这个顺序(以51为例用定时器0方式一产生50毫秒的定时)1、确定使用哪个定时器,使用哪种方式,这一步通过TMOD设置

守时器作业的流程能够依照这个次序(以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++;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/255148.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部