单片机 定时器 中断(用C语言写的)
用定时器进入中断,假设每隔1s进行一次中断。如果在执行中断服务的时间超过了1s,那么下次中断时不会被响应。如何控制,使得执行中断服务的时间恰好等于1s,这样,执行中断服务...
用定时器进入中断,假设每隔1s进行一次中断。
如果在执行中断服务的时间超过了1s,那么下次中断时不会被响应。
如何控制,使得执行中断服务的时间恰好等于1s,这样,执行中断服务后,恰好又迎来新的一次中断?????
回答的好有追加。 展开
如果在执行中断服务的时间超过了1s,那么下次中断时不会被响应。
如何控制,使得执行中断服务的时间恰好等于1s,这样,执行中断服务后,恰好又迎来新的一次中断?????
回答的好有追加。 展开
展开全部
楼上的回答都没明白楼主问题的意思。
其实楼主你这个问题很好办的。
我不知道楼主您用的是什么编辑器,如果使用Keil的话。你先编写好你的中断函数,然后按“Debug”进入调试模式,在调试模式下,编辑框右边会有一个列表显示当前寄存器的值和所有变量的值。
这个列表最下面有一个“sec”,它的值就是显示程序执行的时间(以秒为单位的)。
这个时候,你只要把PC指针指向中断服务程序的第一条语句,然后在中断服务程序的最后一条语句设置一个断点,然后按"run"全速运行一次中断服务程序,再看看“sec”显示的是多少。
其实楼主你这个问题很好办的。
我不知道楼主您用的是什么编辑器,如果使用Keil的话。你先编写好你的中断函数,然后按“Debug”进入调试模式,在调试模式下,编辑框右边会有一个列表显示当前寄存器的值和所有变量的值。
这个列表最下面有一个“sec”,它的值就是显示程序执行的时间(以秒为单位的)。
这个时候,你只要把PC指针指向中断服务程序的第一条语句,然后在中断服务程序的最后一条语句设置一个断点,然后按"run"全速运行一次中断服务程序,再看看“sec”显示的是多少。
追问
用C语言如何实现?
追答
我说的就是用C语言实现的啊。如果楼主不明白的话,可以去优酷或者土豆搜郭天祥《十天学会单片机》,他的第二节课(讲流水灯的)就有详细的讲解如何用这个DEBUG模式的"sec"控制流水灯的闪烁延时时间。
展开全部
1S中断一次???这可不能实现啊!!!定时器的一次定时时间的是毫秒级的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如何控制,使得执行中断服务的时间恰好等于1s,这样,执行中断服务后,恰好又迎来新的一次中断?????
RE:这个就不一定了。一般中断都是处理一些标志之类的。你所说的是响应中断的函数执行时间要控制在1s,一般没人这么做的。无意义。
RE:这个就不一定了。一般中断都是处理一些标志之类的。你所说的是响应中断的函数执行时间要控制在1s,一般没人这么做的。无意义。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用定时器进行计数虽然方便,但是有一定误差,比如说外界的温度会影响晶振。
楼主想用定时器每隔1S中断一次也会受到温度的影响,假设忽略这个问题,也会受到内部程序延时的影响,总之,很复杂,建议你以后学习用专门的时钟芯片来定时,等你成为高手后再来看这些问题就会觉的很简单了。
楼主想用定时器每隔1S中断一次也会受到温度的影响,假设忽略这个问题,也会受到内部程序延时的影响,总之,很复杂,建议你以后学习用专门的时钟芯片来定时,等你成为高手后再来看这些问题就会觉的很简单了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我随便说说啊
我的经验是中断服务程序里面的代码一定要少 我的做法是 一般只在里面置一些标志
具体的工作在外面的循环程序里面做
这样做我认为很稳定
我的经验是中断服务程序里面的代码一定要少 我的做法是 一般只在里面置一些标志
具体的工作在外面的循环程序里面做
这样做我认为很稳定
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <reg52.h>
#define uchar unsigned char
sbit d1=P1^0;
uchar num;
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1) ;
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)//表示一秒到了
{num=0;
d1=~d1;}
}
哥你看个程序,这是50ms的中断灯隔1s闪烁;一般一条语句的执行时间很短不会超过1s
#define uchar unsigned char
sbit d1=P1^0;
uchar num;
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1) ;
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)//表示一秒到了
{num=0;
d1=~d1;}
}
哥你看个程序,这是50ms的中断灯隔1s闪烁;一般一条语句的执行时间很短不会超过1s
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询