这个程序为什么在中断里占空比不正确,在MAIN里就正确呢
#include <reg52.h>
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;
}
}
}
|