转载请注明出处,谢谢http://blog.csdn.net/metalseed/article/details/7989263 by---MetalSeed
PWM波的调制有三种方式
1:C语言编程实现
2:定时器实现
3:片内PWM
方式1:
/*将PORTA(AVR上PA.0)等价于P1.0(51)*/
void pwm (unsigned char x, unsigned int y) /*X 为占空比 Y为函数使用时间*/
{
uint i, j, a;
for(i = y; i > 0; --i) //定时外函数
{
for(j = 7; j > 0; --j) //定时内函数
{
for(a = x; a > 0; --a) //PWM波高电平宽度
{
PORTA = 0X01;
}
for(a = 100 - x; a > 0; --a) //PWM低电平宽度
{
PORTA = 0X00;
}
}
}
}
呼吸灯
void breathPWM (unsigned char x, unsigned int y) /*X 为占空比 Y为函数使用时间*/
{
int i, j, a;
for(i = y; i > 0; --i)
{
for(j = 7; j > 0; --j)
{
for(a = x / 4; a > 0; --a)
{
P1 = 0xff;
}
for(a = (30 - x ) / 4; a > 0; --a)
{
P1 = 0x00;
}
for(a = x / 4; a > 0; --a)
{
P1 = 0xff;
}
for(a = (30 - x ) / 4; a > 0; --a)
{
P1 = 0x00;
}
for(a = x / 4; a > 0; --a)
{
P1 = 0xff;
}
for(a = (30 - x ) / 4; a > 0; --a)
{
P1 = 0x00;
}
for(a = x / 4; a > 0; --a)
{
P1 = 0xff;
}
for(a = (30 - x ) / 4; a > 0; --a)
{
P1 = 0x00;
}
}
}
}
void breath(int X)
{
int i, j;
while(X--)
{
i = 30, j = 100;
while(i > 0)
{
breathPWM(i -= 1, 20);
}
while(i < 30)
{
breathPWM(i += 1, 20);
}
}
}