帮忙啊“C51 为什么我两个定时器不能同时一起用”??

时间:2021-01-06 19:12:06
#include "AT89x051.H"
sbit    SB = P1^7;           //vcc
sbit    SRED = P1^6;         //红
sbit      SYELLOW = P1^5;      //黄
sbit      SAMPLIDYNE = P1^4;   //电机 
sbit      SEND = P3^7;         //发送
//sbit      SEND2 = P1^3;
sbit      TIMES = P1^2;        //次数
sbit      RECIVE = P1^1;       //接收
sbit      LOOP = P1^0;         //循环一圈
typedef      unsigned char      INT8U;              /* 8 bit 无符号整型  */      
INT8U  data cishu = 0;
INT8U  data s_count = 0;
INT8U  data temp = 0;
INT8U  data rec_flag = 0;
INT8U  data Sec_flag = 0;
INT8U  data Sec_flag2 = 0;
INT8U  data Sec_flag3 = 0;
void init_serialcomm(void);
void delay10ms(unsigned char); // .110MS 

//临时缓冲区
main()

   SAMPLIDYNE = 0;//0 ---stop  
  // P1 = 1;
   SAMPLIDYNE = 0;//0 ---stop  
   RECIVE=1; 
   SB = 1; 
   cishu = 0;
   s_count = 3;
   temp = 0; 
   rec_flag = 0;
   Sec_flag = 0;
   Sec_flag2 = 0;
   Sec_flag3 = 0;
   init_serialcomm();            

   while(1){ 
       SAMPLIDYNE = 0;  
       SRED = 1;  
       SYELLOW = 1; 
       delay10ms(180);
       SYELLOW = 0;
       delay10ms(20);

       if(TIMES) {cishu = 2; }
       else{ cishu = 1;      }
       
           while(RECIVE != 0 && s_count > cishu){    
                SAMPLIDYNE = 1;
                    if(TIMES == 1){ cishu = 2;   s_count = 1; }
                else          { cishu = 1;   s_count = 1; } 
           }    
           //while(RECIVE==0 && count <= cishu){     
            while(RECIVE==0 && s_count <= cishu){                 
                       SAMPLIDYNE = 1; 
                        if(TIMES) {  
                              SYELLOW = 1;  
                               SRED = 0;   
                               delay10ms(66); //105//70
                      }
                         else{ 
                               SYELLOW = 0;  
                             SRED = 1; 
                              delay10ms(15); //75
                        } 
                           if(LOOP == 0) { s_count = s_count + 1;  SRED = 1;} //SAMPLIDYNE = 0; }  
            }  
           if(s_count > cishu){  SYELLOW = 1;   SRED = 0;    delay10ms(100);}
      }
}


void init_serialcomm(void)

   TH0 = 0xF3; 
   TL0 = 0xF3; 
      
   TH1=0xCE; //100ms一次中断 
   TL1=0xCE; 
   
   //SCON = 0x70;  //  TMOD = 0x21;
   TMOD = 0x22;


   EA   = 1;     
   ES   = 1;    
   ET0  = 1;
   ET1  = 1;  
   IT0  = 1;  
   TF0  = 0;
   TF1  = 0;
  // TCON = 0x50;

   TR0  = 1;     
   TR1  = 1;     
}


//定时器中断38khz方波
void timer0(void)interrupt 1 using 0 {  //T0中断服务程序入口         
       TH0 = 0xF3;              
       TL0 = 0xF3;  
       SEND = !SEND;
      //if(SEND) SEND = 0;
     // else SEND = 1;      


/*
//定时器中断100m
void timer1(void)interrupt 2 using 1 {   //T1中断服务程序入口        
        TH1 = 0xCE; 
        TL1 = 0xCE;  
        Sec_flag = 1 + Sec_flag;
      if(Sec_flag  > 100) {Sec_flag2 = Sec_flag2 + 1;Sec_flag  = 0;}
      if(Sec_flag2 > 100){ Sec_flag3 = Sec_flag3 + 1;Sec_flag2 = 0;}//0.5s
        if(Sec_flag3 > 8 ){
             Sec_flag3 = 0;
             SRED = 1;  
              SYELLOW = 0;
              delay10ms(100);
        } 
        else{
                 SRED = 1;  
              SYELLOW = 1;
        }       

*/

// ********************* .. n*10ms **********************
void delay10ms(unsigned char time)
{
     unsigned char i;
     unsigned int j;
     for (i=0;i<time;i++) 
     {
           for(j=0;j<0x390;j++){       
           }
     }
}


请教各位老师,我在上面的程序中,如果把两个定时器中断打开,它怎么仅运行第一个,我一个一个的用它都能用运行且正常,现我想两个都要用上,而且一起用,请问我上面的程序怎么改??

              望指教!!!


8 个解决方案

#1


void timer1(void)interrupt 2 using 1 
改为 :
void timer1(void)interrupt 3 using 1

定时中断1的中断入口号是3

#2


大问题被楼上的说了,偶看到个小问题:
#include "AT89x051.H"
怎么说文件名也该是:AT89x51.H

#3


:)
路过

#4


TO : iori40995(小刘) 
ATMEL 也有 AT89C2051型号的,所以也会有 #include "AT89x051.H"

#5


恩,多谢指教:)

#6


瞧瞧

#7


最好认真的看看书

#8


问题已被指出!
我只好说说debug的方法!在调试时你可以在中断向量处设置中断呀,看程式有没运行至此呀!如果这样的话像这种问题应该很快就查出来了!

#1


void timer1(void)interrupt 2 using 1 
改为 :
void timer1(void)interrupt 3 using 1

定时中断1的中断入口号是3

#2


大问题被楼上的说了,偶看到个小问题:
#include "AT89x051.H"
怎么说文件名也该是:AT89x51.H

#3


:)
路过

#4


TO : iori40995(小刘) 
ATMEL 也有 AT89C2051型号的,所以也会有 #include "AT89x051.H"

#5


恩,多谢指教:)

#6


瞧瞧

#7


最好认真的看看书

#8


问题已被指出!
我只好说说debug的方法!在调试时你可以在中断向量处设置中断呀,看程式有没运行至此呀!如果这样的话像这种问题应该很快就查出来了!