您的位置:首页 > 其它

51中断-定时器/计数器中断

2016-08-16 15:36 225 查看
什么时中断:

  是指在执行程序的过程中,当出现每种情况,发出紧急的事件或其他情况时,

有服务对象向CPU发出中断请求的信号,CPU暂时中断当前的程序的执行,而转去

执行相应的处理程序,待处理程序完毕以后,再返回来执行原来被中断的程序。

关于中断以定时/计数器0中断为例;

    void timer0_init()

{

    EA  = 1;                  //打开总中断;

   TMOD |= 0x01;      //选定定时/计数器0的工作的方式

   TH0 = (65536 - 20000) / 256;   

   TL0 = (65536 - 20000) % 256;   //初始化定时/计数器的值 

   ET0 = 1;             //打开中断服务程序      

   TR0 = 1;             //打开计数器     

  

}

 void timer0_isr()  interrupt 1  //  中断的服务的程序

{

    TH0 = (65536 - 20000) / 256;

    TL0 = (65536 - 20000) % 256;  //触发中断后再一次初始化值

    change();                     //调用一个程序,假设改变led的灯  



 void main()

{

     timer0_init();  //中断的初始化;

    while(1);

}

这个程序的运行的过程是,先是中断的初始化,然后一直while里面死循环,每当

计数器溢出的时候,触发中断函数,进入中断的服务函数,执行中断函数timer0_isr()

由于计数器没有关闭,所以计数器一直在计数,所以每隔20ms(晶振12mhz)触发一次中

断。

  注:

     溢出:是指16位的计数器(可以选择计数器的工作的方式),每次累加到16位的最大的

           值溢出的时候,触发中断。

     ET0 :如果把它置为0的话,那么就算计数器的溢出也不会调用中断服务程序

     TR0 :如果将它置为0的话,那么计数器将不再累加

     累加:什么时候累加,是根据晶振的hz来决定的

            单片机的晶振频率 :12M震荡周期1/12us

            单片机的机器的周期:12个机器周期,即加一次1us;

     interrupt 1:  1.区分不同的函数

                   2.   

                     1 定时器0  

                     2 外部中断1  

                     3 定时器1  

                     4 串行中断

                   3.后面还有跟using 的,主要为了说明使用哪一组的寄存器,可以不写

                 

 中断程序就像C语言的里面的goto语句,打断程序的执行的顺序,但是又是不同的,因为,goto

只有程序执行到那边的时候,进判断的时候程序将会跳转,而且跳转完不能够再次回到被中断的

那个地方依旧在执行完的时候继续一次的执行,但是中断,是无论在程序的哪个地方只要中断一旦

触发的时候的那么就执行中断子程序(中断服务程序)但是前提是打开中断程序,执行行完中断的依旧回到被中断的地方

计数器一直开着那么只要计数器溢出,那么就触发中断。

   其余的中断类似,只不过控制的寄存器不一样;

            

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息