单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。
5个回答
展开全部
跟你理清一下思路,你的问题就解决了。首先,你的程序很简单,就是让发光二极管1秒亮1秒灭。因此,你前提是要定时1秒,但51单片机无法定时1秒,因此,你的程序就要定时50毫秒,每到了50毫秒,你就让num自加1,当num加到20时,换句话说,已经定时50毫秒20次了,那就是1秒咯,所以此有led1=~led1;
//让发光管状态取反,达到程序目的。另外,定时50毫秒你要给th0和tl0赋给初值,因此
th0=(65536-45872)/256;
//重新装载初值tl0=(65536-45872)%256;才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void
t0_time()这个函数中重新赋初值。的确像你所说的初值是装满了开始执行中断,其实从你tmod=0x01;
//设置定时器0位工作模式1(m1,m0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?
(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给tmod=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)
//让发光管状态取反,达到程序目的。另外,定时50毫秒你要给th0和tl0赋给初值,因此
th0=(65536-45872)/256;
//重新装载初值tl0=(65536-45872)%256;才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void
t0_time()这个函数中重新赋初值。的确像你所说的初值是装满了开始执行中断,其实从你tmod=0x01;
//设置定时器0位工作模式1(m1,m0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?
(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给tmod=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)
展开全部
的确,这种程序没有什么实用的意义,从原理上分析,更不会有人这么做的。你非要这么做,也没有人管,但不符合逻辑。既然采用中断的方式,就是为了充分利用单片机的时间。像你说的这个问题一种解决的办法是延长中断的时间,中断的时间要长于执行中断程序的时间,因每次中断的执行任务需要30ms,而中断时间是10ms,这根本就不能完成中断的任务吗,当然了,中断时,没有从中断返回,就不会再响应同一个中断的。因此,从中断返回后,已经少响应中断两次了,也就是少执行两次中断任务。可是中断一次执行中断任务就却需要3倍的时间,你自己想想,这么做合乎逻辑吗,所以,根本就不会有人这么做,只有瞎想才能这么想的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在中断程序中,不退出,又出现了本中断的申请,
单片机,是不会再一次进入该中断程序的。
只有高级的中断,才能中断本次中断。
当退出本次中断后,回到主程序执行了一条指令,在处于主程序期间,单片机才会顾及已经出现的申请。
但是,如果,该申请标志,已经消失,单片机就不会发生中断。
这个过程,有些书,讲的很详细。有些书,就没有讲。
单片机,是不会再一次进入该中断程序的。
只有高级的中断,才能中断本次中断。
当退出本次中断后,回到主程序执行了一条指令,在处于主程序期间,单片机才会顾及已经出现的申请。
但是,如果,该申请标志,已经消失,单片机就不会发生中断。
这个过程,有些书,讲的很详细。有些书,就没有讲。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
中断只有在无同级或更高级中断发生时才能进入,中断会延迟,为什么要在中断里执行这么长的程序,而且中断时间选的这么短,这样做单片机做不了其他的事了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那是当然的,没有RETI也就是中断返回,是不会继续响应中断的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询