个人对单片机中断程序的理解
/*1:利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit P1_1=P1^0;
uchar time;
void main()
{
time=0;
TMOD=0x01;////设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1);//等待中断产生
}
void T1_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==20)
{
time=0;
P1_1=~P1_1;
}
}
hit:
在学习单片机的时候很容易按照C语言编程的格式来理解,程序在打开中断之后会一直停留在while(1);当中,但在实际上,程序的确会停留在while(1);里,由于开启了中断开关而并未关闭,所以T0继续计数,所以后面一直会有中断。
过程可以理解为这样,程序一直在while(1);当中,直到定时器计满产生中断;
产生中断后,执行中断程序,定时器重新赋值,time自加1;
回到while(1)中,等待下一次中断,定时器继续计数。
单片机怎么从主函数跳到中断函数中:
对于单片机的硬件,你熟悉吗?时钟和CPU是独立的,时钟中断程序时这样的:在CPU执行指令时,计数器(计时器)同时在计时,当计时器溢出时,就向CPU申请中断,如果允许响应中断,CPU就转到中断服务程序执行相关的程序。
单片机的时钟中断相应要满足两个条件:第一,允许中断源申请中断。第二,允许cpu响应中断。二者缺一不可。 EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
你这些语句,就允许了中断响应,所以,当你的程序跑起来时,时钟时间到了,CPU就转入中断服务程序了,执行完了再返回主程序。你可以在编译器中用DEBUG查看执行过程的。如果你用汇编语言写,就更清楚了,可以看清每一步的操作的。
硬件部分是这样:在每个机器周期的S5P2,单片机会来采样,判断是否有中断申请。所以一旦时钟计数溢出,就会转入中断服务程序。
这个打个比方吧,你在上课,相当于主程序,这时时间到了,打铃下课了,你就不读书了,跑出去玩了。这其实是一样的道理。你在上课,这和打铃不相关,并不是你让打铃的,学校的时钟在不停地走,到了时间自动打铃,这不受你上课的影响的。但是如果你把耳朵堵上了(不允许响应中断),就是把铃打碎了你也不知道下课了,所以你就一直读书。
单片机中断程 相关文章:
- 各种单片机中断程序的写法(12-02)
- 51单片机写中断程序的一般步骤(11-28)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)