最开始使用
单片机的时候,我们使用延时操作的时候使用一个延时函数,而这个函数是通过不断的循环,来消耗单片机的时间以此达到延时的目的。我们知道对于51来说,默认12MHz晶振。我们可以根据频率和时间的关系计算出麦种周期。 Tosc=1/12Mhz。 同时呢。我们的还知道运行一操作需要几个机器周几或者数个机器周期。而机器周期又时时钟周期的12倍。所以可以算出一个机器周期的时间为Tm=12*Tosc 。可以算出运行时间为1微秒。所以我们就是while(i--)while(j--);消耗时间。C语言的学习中我们写的一个程序时显示一个 hello word! 在单片机的最开始是通过点亮小灯。呵呵。 让小灯一闪一闪的。很有成就感。接着点亮2个 8个小灯,还玩出许多花样。这样就以为学会了单片机。开始自己动手做了一单片机控制许多个继电器。没想到成了。
那时还用的汇编,真的以为自己了不起。接着就在网上找了许多
电路图和程序照着做。那时就那本事,现在还是那个本事。工作的原因完全与单片机不沾边,随后我辞了工作,又开始每天晚上学习单片机。
看到了数码管、独立按键、矩阵按键等等,看了一遍回过头再看了一遍这一边比上一次有所思考。鉴于专业背景与文化程度低的缘故学的很吃力。晚上看完第二天就忘了,就这样反反复复还是忘。
就这样,,,
学习就此中断在这里,写了这篇自我感想。而我正好在看定时器中断这块。思索着程序进入定时器中断程序后,如果中断程序很长。那么在这段时间中定时还在不在运行?如果在运行中,那么中断程序还没有运行完,又产生一个中断会发生什么问题。(写到这里才是我的疑惑所在希望各位给予解答)中断程序多长为好呢?会不会对时序产生影响
推荐的做法是,在中断函数里设置一些全局变量,主函数中去判断这个变量,然后处理.
为什么要这样做呢? 楼主自己也有思考过,如果前一个中断函数还没结束,又来一个中断请求,会发生什么问题? 回答这个问题就涉及到中断优先级和中断是否可嵌套了。中断嵌套是指,在一个中断处理过程中,又来一个中断请求,那么满足“条件”的新中断请求函数会打断前一个中断处理函数的执行,转而执行新中断函数,等这个函数退出时再继续前一个中断处理函数的执行。那么这个“条件”是什么呢?一般是指中断优先级,也就是级别高的中断请求可以打断级别低的中断函数的执行;反之,则算不满足条件,新中断请求只能等前一个中断处理完才被允许执行处理函数。楼主这个问题中是后一个定时器中断会不会打断前一个定时器的中断处理函数,在51单片机和其它大部分单片机中是不会的,因为后一个中断请求的优先级并不比前一个中断的优先级高。
这时后一个定时器中断请求如何处置呢?那就要看你在前一个中断结束后,后一个中断请求的标志位是否还有效喽,有效则再次进入定时器中断,无效则忽略后一个定时器中断请求,就像没发生过后一个定时器中断请求一样?
什么情况下会出现“无效”这种情况呢?当你的程序在中断函数返回之前刻意使用指令去清零定时器中断标志位,就会出现“无效”。
上图简单的演示了两种清况,左侧图在定时器中断函数退出前把中断请求标志位清0了,所以单片机在处理完前一个中断后没发现有新的中断请求,就返回到主函数中执行。右侧图是在定时器中断结束后,新的中断请求标志位还在,那么单片机就不会马上返回主函数,而是又一次进入定时器中断处理函数。
你的另一个问题是,在单片机运行定时器中断处理函数期间,定时器还在不在运行。答案很简单,定时器其实就是一个“上了发条”的计数器,你有给它“发条”它就跑,不给“发条”它就不跑,这里的“发条”就是时钟。如果你在中断函数中没有关闭它的时钟,它是在运行的。至于是怎么运行的,取决于你的配置了。
另外,很欣赏你的这种反思。现在很少有人会有这种对自己的思考,很多人真的以为自己使用过某某单片机,就自认为自己会了,其实他紧紧是使用过而已
一周热门 更多>