• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

这个程序为什么在中断里占空比不正确,在MAIN里就正确呢

#include sbit PWMOUT = P0^0;unsigned char HighRH = 0;unsigned char HighRL = 0;unsigned char LowRH = 0;unsigned char LowRL = 0;void ConfigPWM(unsigned int fr, unsigned char dc);void ClosePWM();void init_uart(void);void main(){    unsigned int i;    unsigned char tmp1;    EA = 1;     //开总中断    init_uart();    while (1) ;// {// ConfigPWM(500, 50);               //频率100Hz,占空比10%//     for (i=0; i<40000; i++);// ConfigPWM(892.85, 80);               //频率100Hz,占空比10%//     for (i=0; i<40000; i++); // // }}void ConfigPWM(unsigned int fr, unsigned char dc){ unsigned long tmp; unsigned int high, low; tmp = 11059200/12/fr; high = (tmp*dc)/100; low = tmp - high; high = 65536 - high + 12; low = 65536 - low + 12; HighRH = (unsigned char)(high >>8); HighRL = (unsigned char)high; LowRH = (unsigned char)(low >> 8); LowRL = (unsigned char)low; TMOD &= 0xF0; TMOD |= 0x01; TH0 = HighRH; TL0 = HighRL; ET0 = 1; TR0 = 1; PWMOUT = 1; }void ClosePWM(){ TR0 = 0; ET0 = 0; PWMOUT = 1;}void InterruptTimer0() interrupt 1{    if (PWMOUT == 1)  //当前输出为高电平时,装载低电平值并输出低电平    {        TH0 = LowRH;        TL0 = LowRL;        PWMOUT = 0;    }    else              //当前输出为低电平时,装载高电平值并输出高电平    {        TH0 = HighRH;        TL0 = HighRL;        PWMOUT = 1;    }}void init_uart(void){       SCON=0x50;        //REN=1允许串行接受状态,串口工作模式2             TMOD= 0x00;       //定时器1为模式0(16位自动重载)                    AUXR=0X40; //开启1T模式       TL1=(65535-(11059200/4/9600));    //设置波特率重装值    TH1=(65535-(11059200/4/9600))>>8;    TR1  = 1;        //开启定时器1      ES   = 1;        //开串口中断     }void uart_int(void) interrupt 4 using 1{   unsigned char tmp1; unsigned int i;     if (RI)     {       tmp1 = SBUF;    if(tmp1==0x8A) //收到的数据为0x15    {               RI = 0;        ES= 0;     //关闭串口中断      ConfigPWM(500, 50);               //频率100Hz,占空比10%        for (i=0; i<40000; i++);    //ES= 1;    }    else if(tmp1==0x8B)    {               RI = 0;        ES= 0;     //关闭串口中断      ConfigPWM(892.85, 80);               //频率100Hz,占空比10%        for (i=0; i<40000; i++);   // ES= 1;    }    }}  
全部回复(1)
正序查看
倒序查看
冯斌
LV.5
2
2019-01-16 11:46

#include

sbit PWMOUT = P0^0;

unsigned char HighRH = 0;

unsigned char HighRL = 0;

unsigned char LowRH = 0;

unsigned char LowRL = 0;

void ConfigPWM(unsigned int fr, unsigned char dc);

void ClosePWM();void init_uart(void);

void main()

{   

 unsigned int i;   

unsigned char tmp1;

    EA = 1;     //开总中断   

init_uart();   

while (1) ;

// {

//   ConfigPWM(500, 50);               //频率100Hz,占空比10%

//     for (i=0; i<40000; i++);

//  ConfigPWM(892.85, 80);              

//频率100Hz,占空比10%

//     for (i=0; i<40000; i++);

 // 

// }}void ConfigPWM(unsigned int fr, unsigned char dc)

unsigned long tmp; unsigned int high, low;

 tmp = 11059200/12/fr;

 high = (tmp*dc)/100;

 low = tmp - high; high = 65536 - high + 12;

 low = 65536 - low + 12; 

HighRH = (unsigned char)(high >>8); 

HighRL = (unsigned char)high;

 LowRH = (unsigned char)(low >> 8);

 LowRL = (unsigned char)low; 

TMOD &= 0xF0; TMOD |= 0x01; 

TH0 = HighRH;

 TL0 = HighRL; 

ET0 = 1; 

TR0 = 1; 

PWMOUT = 1; 

}

void ClosePWM()

TR0 = 0;

 ET0 = 0; 

PWMOUT = 1;

}

void InterruptTimer0() interrupt 1

{   

 if (PWMOUT == 1)  //当前输出为高电平时,装载低电平值并输出低电平 

   {       

TH0 = LowRH;       

TL0 = LowRL;       

PWMOUT = 0;   

 }    else              //当前输出为低电平时,装载高电平值并输出高电平   

 {        TH0 = HighRH;       

TL0 = HighRL;       

 PWMOUT = 1;   

}

}

void init_uart(void)

{       SCON=0x50;        //REN=1允许串行接受状态,串口工作模式2          

  TMOD= 0x00;       //定时器1为模式0(16位自动重载)                

   AUXR=0X40;   //开启1T模式      

TL1=(65535-(11059200/4/9600));    //设置波特率重装值   

TH1=(65535-(11059200/4/9600))>>8;   

TR1  = 1;        //开启定时器1    

 ES   = 1;        //开串口中断  

  }

void uart_int(void) interrupt 4 using 1

{  

unsigned char tmp1;

 unsigned int i;   

 if (RI)  

  {      

 tmp1 = SBUF;  

  if(tmp1==0x8A)       //收到的数据为0x15  

  {            

  RI = 0;     

   ES= 0;          //关闭串口中断   

   ConfigPWM(500, 50);               //频率100Hz,占空比10%     

   for (i=0; i<40000; i++);     //ES= 1;  

  }   

 else if(tmp1==0x8B)   

 {            

  RI = 0;       

 ES= 0;          //关闭串口中断     

 ConfigPWM(892.85, 80);               //频率100Hz,占空比10%     

   for (i=0; i<40000; i++);    // ES= 1;  

  }   

 }

0
回复