keil定时器中断程序实例(keil调试怎么进入定时器中断)

51单片机定时器中断程序

再次重新启动。

用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;

TH0=(65536-初值)%256;

TL0=(65536-初值)/256;

将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:

机器周期=12/12*10^6=1us(微秒)

定时初值=(1*10^-3)/(1*10^-6)=1000;

所以:TH0=(65536-1000)%256;

TL0=(65536-1000)/256;

将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;

定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(12.0MHz)

Keil上基于80C51的一个简单中断定时器程序

如果只是想进入中断程序的话,你只需要在中断程序开始的地方设置断点,然后让程序全速跑就可以了,只要你的中断设置正确,定时器计数已经启动,就一定能进入中断的。

keil定时器中断怎么设置时间

keil定时器中断设置时间的方法:

1、配置TMOD确定工作方式;

2、设定定时器定时时间,并给给定时器TO赋值; TH0=? TL0=?

注:比如定时器定时时间设置为20Ms=0.02s,且定时器工作在方式一的模式下,即16位定时器;由X* 12 / 11059200=0.02得到X=18432,则定时器初值Y=2^16- 18432 = 65536- 18432 = 47104;转.化为十六进制就是0xB800;则

TH0= 0xB8; TL0= 0x00;

3、设置TCON,通过给TRO置1启动定时器T0;

4、判断TCON寄存器的TF0位是否溢出。

Keil一个关于中断的简单问题,程序如下。。。

回答你的问题:

计数溢出时,执行中断程序,这里是系统跑了45872个机器周期后,开始执行中断程序,而不是你说的1S后执行中断程序,注意,这是你的错误.

不管num等于多少,TR0一直都开着,因为你程序其它地方根本没有关闭,也就是说此时定时器还在计数,

所以,即使在执行if语句的时候定时器还在计数,

如果你的if语句过长的话,大于中断的延时时间45872个机器周期了,那么if语句内容根本还没有执行完,又开始下一次中断了,执行过程就是这样子的.

不过,对于你的程序,你完全没有必要担心,因为:

while(1)

{

if(num==20)

{

led1=~led1;

num=0;

}

}

这句话,远远的小于45872个机器周期,也就是说,你上面那几个语句执行了好几次,中断还没发生一次.

不过,一个良好的电子工程师,尤其是做工业控制的,他的定时器应该这样写:

void TO_time()interrupt 1

{

TH0=0x4C;///(65536-45872)/256;

TL0=0xD0;///(65536-45872)%256;//执行了20次中断程序后才会执行IF语句

num++;

}

即,直接把数值赋值给TH0和TL0,这样避免在中断中运算,节省时间,因为,对于所有的中断,时间越短越好.

编写keil c程序,利用内部定时器T1,工作方式1,使单片机的P0.0口输出频率为50

#includereg52.h

sbit output=P0^0;

void init()

{    

TMOD|=0x10; //设置定时器1工作方式1

TH1=(65535-1000)/256; //定时器1设定初始值  1ms中断一次即频率500Hz

TL1=(65535-1000)%256;

EA=1; //开总中断

ET1=1; //开定时器1中断

TR1=1; //启动定时器1

}

void t1() interrupt 3

{

TH1=(65535-1000)/256;

TL1=(65535-1000)%256;

output=!output;

}

void main()

{

init();

while(1); 

}

361知讯网

本文链接:http://pdidw.com/keil/49247.html

发表评论

评论列表

还没有评论,快来说点什么吧~