标题: 为什么单片机T0的中断无法执行,只可执行T1的中断 [打印本页]

作者: syh112    时间: 2023-6-13 03:19
标题: 为什么单片机T0的中断无法执行,只可执行T1的中断
#include "reg52.h"                        
#include<intrins.h>               

typedef unsigned int uint;         
typedef unsigned char uchar;

sbit moto=P1^0;                  
sbit k2=P3^0;         
sbit k3=P3^2;         
//sbit k00=P2^2;        

unsigned char timer1;
unsigned char timer0;
uint n=1;
uint m=2;
uint sunumber;
uint worksign;

void TimeConfig();
void delay1ms(uint t);
void sudu();
void moshi();
void ziran();

void main(void)
{
        TimeConfig();
        while(1)
        {
                moshi();
        }
}

void delay1ms(uint t){
        char i;
        while(t--)
                {
                 for(i=0;i<50;i++);
        }
}


void TimeConfig()
{
        TMOD|= 0x11;   

  
        TH1 = 0xFE;
        TL1 = 0x0C;
        ET1 = 1;
        EA = 1;
        TR1 = 1;   
     
  TH0=0xD8;//(65536-10000)/256;
        TL0=0xF0;//(65536-10000)%256;//10ms
        ET0=1;      
        TR0=1;
}



void Time1(void) interrupt 3   
{        
        TR0=0;
        TH1 = 0xFE;  
        TL1 = 0x0C;
        TR0=1;
        timer1++;   
}

void Time0(void) interrupt 1   
{
        TR1=0;
        TH0=0xD8;
        TL0=0xF0;
        TR1=1;
        timer0++;
        if(timer0>1200)  
        {
                timer0=0;
        }        
}

void sudu()
{
         if(k2==0)
         {
                 delay1ms(10);
                 if(k2==0)
                {
                        n+=1;
                        if(n>3)
                        {n=1;
                        }
                  while(!k2);
           }
         }
                switch(n)
                 {
                        case 1:sunumber=15;break;
                        case 2:sunumber=50;break;
                        case 3:sunumber=90;break;
                 }
                if(timer1>100)  
                {
                        timer1=0;
                }
                if(timer1<sunumber)      
                {
                        moto=1;
                }
                else
                {
                        moto=0;
                }

}

void moshi()
{
        if(k3==0)
        {
         delay1ms(10);
         if(k3==0)
                {
                  m+=1;
                        if(m>2)
                        {m=1;
                        }
                  while(!k3);
                }
        }
                switch(m)
                {
                        case 1:sudu();break;
                        case 2:ziran();break;
//                        case 3:sunumber=90;break;
                }
}

void ziran()
{               
          ET0=1;         
                TR0=1;
                if(timer0<400)        
                {
                        sudu();
                }
                else
                {
                        
                        moto=0;
                }
               
        }



作者: wys91203    时间: 2023-6-13 05:35
两个定时器都用方式1,16位,自然优先级是T0高于T1, 但在中断程序中,有错误,T0中断 INTERRUPT1
  子程序里,停止了T0空断.
   void Time1(void) interrupt 3   
{        
        TR0=0;   //应是TR1=0
        TH1 = 0xFE;  
        TL1 = 0x0C;
        TR0=1;
        timer1++;   
}
作者: xuyaqi    时间: 2023-6-13 09:33
你定义:unsigned char timer0;
判断要求,if(timer0>1200),后边程序不能执行。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1