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

什么时中断:
  是指在执行程序的过程中,当出现每种情况,发出紧急的事件或其他情况时,
有服务对象向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
只有程序执行到那边的时候,进判断的时候程序将会跳转,而且跳转完不能够再次回到被中断的
那个地方依旧在执行完的时候继续一次的执行,但是中断,是无论在程序的哪个地方只要中断一旦
触发的时候的那么就执行中断子程序(中断服务程序)但是前提是打开中断程序,执行行完中断的依旧回到被中断的地方
计数器一直开着那么只要计数器溢出,那么就触发中断。

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

 

你可能感兴趣的:(51,中断,计数器,单片机,51)