资讯详情

个人对单片机中断程序的理解

开题首先贴上一段练习中遇到的代码: /*1:利用定时/T0从P1.0输出周期为1s的方波,让以1HZ闪烁,设晶振频率为12MHz。*/ #include<reg52.h> #include<intrins.h> #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响应中断。二者缺一不可。 EA=1;//开总中断 ET0=1;//开定时器0中断 ET1=1; TR0=1;//启动定时器0 TR1=1; 你这些语句,就允许了中断响应,所以,当你的程序跑起来时,时钟时间到了,CPU就转入中断服务程序了,执行完了再返回主程序。你可以在编译器中用DEBUG查看执行过程的。如果你用汇编语言写,就更清楚了,可以看清每一步的操作的。 硬件部分是这样:在每个机器周期的S5P2,单片机会来采样,判断是否有中断申请。所以一旦时钟计数溢出,就会转入中断服务程序。

这个打个比方吧,你在上课,相当于主程序,这时时间到了,打铃下课了,你就不读书了,跑出去玩了。这其实是一样的道理。你在上课,这和打铃不相关,并不是你让打铃的,学校的时钟在不停地走,到了时间自动打铃,这不受你上课的影响的。但是如果你把耳朵堵上了(不允许响应中断),就是把铃打碎了你也不知道下课了,所以你就一直读书。

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台