#include <reg52.h>
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit ENLED = P1^1;
unsigned long PeriodCnt = 0; //PWM周期计数值
unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH = 0;
unsigned char LowRL = 0;
unsigned char T1RH = 0;
unsigned char T1RL = 0;
unsigned char PWMOUT;
void ConfigTimer1(unsigned int ms);
void ConfigPWM(unsigned int fr, unsigned char dc);
void main()
{
EA = 1;
ENLED = 0;
P22 = 1;
P21 = 1;
P20 = 0;
ConfigPWM(100, 5);
ConfigTimer1(160);
while (1);
}
/*配置并启动T1,ms为定时时间*/
void ConfigTimer1(unsigned int ms)
{
unsigned long tmp;
tmp = 33177600 / 12;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
tmp = tmp + 12;
T1RH = (unsigned char)(tmp>>8);
T1RL = (unsigned char)tmp;
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = T1RH;
TL1 = T1RL;
ET1 = 1;
TR1 = 1;
}
/*配置并启动PWM,fr为频率,dc为占空比*/
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned int high, low;
PeriodCnt = (33177600/12) / fr;
high = (PeriodCnt*dc) / 100;
low = PeriodCnt - 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 AdjustDutyCycle(unsigned char dc)
{
unsigned int high, low;
high = (PeriodCnt*dc) / 100;
low = PeriodCnt - 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;
}
/* T0中断,产生PWM输出 */
void InterruptTimer0() interrupt 1
{
if (PWMOUT == 1)
{
TH0 = LowRH;
TL0 = LowRL;
P0 = 0;
PWMOUT = 0;
}
else
{
TH0 = HighRH;
TL0 = HighRL;
P0 = 0xFF;
PWMOUT = 1;
}
}
/* T1中断,50ms调整一次占空比 */
void InterruptTimer1() interrupt 3
{
static bit dir = 0;
static unsigned char index = 0;
unsigned char code table[] = {
5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,
};
TH1 = T1RH;
TL1 = T1RL;
AdjustDutyCycle(table[index]);
if (dir == 0)
{
index++;
if (index >= 18)
{
dir = 1;
}
}
else
{
index--;
if (index == 0)
{
dir = 0;
}
}
}
|