#include<reg52.h>
#include <intrins.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit PWMOUT = P0^0;
unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH = 0;
unsigned char LowRL = 0;
void delay(unsigned int time);
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void main()
{
unsigned char i, t = 0;
EA = 1;
ENLED = 0;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
while(1)
{
P0 = 0xff;
for(i=0; i<20; i++)
{
ConfigPWM(100, t);
delay(10000);
t += 5;
if(t >= 100);
t = 0;
}
ClosePWM();
delay(60000);
}
}
// fr 为周期频率 dc 为占空比
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned long tmp;
unsigned long 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()
{
ET0 = 0;
TR0 = 0;
}
void InterruptTimer0() interrupt 1
{
if(PWMOUT == 1)
{
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}
else
{
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}
void delay(unsigned int time)
{
static unsigned int x;
static unsigned int y;
for(x=time; x>0; x--);
for(y=10000; y>0; y--);
}
用 完 for 语句之后 小灯 总是闪烁 我也是醉了
#include <intrins.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit PWMOUT = P0^0;
unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH = 0;
unsigned char LowRL = 0;
void delay(unsigned int time);
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void main()
{
unsigned char i, t = 0;
EA = 1;
ENLED = 0;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
while(1)
{
P0 = 0xff;
for(i=0; i<20; i++)
{
ConfigPWM(100, t);
delay(10000);
t += 5;
if(t >= 100);
t = 0;
}
ClosePWM();
delay(60000);
}
}
// fr 为周期频率 dc 为占空比
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned long tmp;
unsigned long 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()
{
ET0 = 0;
TR0 = 0;
}
void InterruptTimer0() interrupt 1
{
if(PWMOUT == 1)
{
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}
else
{
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}
void delay(unsigned int time)
{
static unsigned int x;
static unsigned int y;
for(x=time; x>0; x--);
for(y=10000; y>0; y--);
}
用 完 for 语句之后 小灯 总是闪烁 我也是醉了