各位大神,我最近想做一个基于
单片机PWM功能的流星灯(水滴效果),可是看了一些资料,按着书上的程序做了一边还是不行。那灯亮度压根儿就没变,,,求正解啊。。。。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit PWM=P0^1;
void delay(uchar i)
{
uchar j;
for(;i>0;i--)
{
for(j=29;j>0;j--)
_nop_();
_nop_();
}
}
void PWMout(uchar q)
{
PWM=1;
delay(q);
PWM=0;
delay(10-q);
}
void main()
{
while(1)
{
PWMout(0);
PWMout(1);
PWMout(2);
PWMout(3);
PWMout(4);
PWMout(5);
PWMout(6);
PWMout(7);
PWMout(8);
PWMout(9);
PWMout(10);
}
}
typedef unsigned char uint8;
sbit DB1=P1^0;
void main()
{
uint8 i,k,p,t,j;
char n;
uint8 a[]={0,1,2,4,6,16,32,64};
uint8 b[]={0,34,48,59,68,76,84,91,97,103,109,114,119,123,126};
signed char c[]={-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7};
P1=0xFF;
while (1)
{
//***************************************************************
//水滴形成
/*P1 = 0xFF;
//---------------水滴逐渐变大(第一个LED 亮度逐渐变大)---------
for(i=0; i<64; i++)
{
for(j=0; j<64; j++) //一个亮度级别发送64 个脉冲
{
P1 = 0xFE;
for(k=0; k<64; k++) //以i 为亮度级别,随着i 的增大,占空比增大
{
if(k > i)
{
P1 = 0xFF;
}
}
}}
*/ k=0;
for(i=0;i<=252;i++)
{
if(0==(i%4))
{
k++;
}
for(t=0;t<=16;t++)
{
DB1=0;
for(j=0;j<=64;j++)
if(j==k)
DB1=1;
}
}
//*******************************************************************
// 滴落
for(j=0;j<=254;j++)
{
p=0;
for(k=0;k<=15;k++)
{
if(j==b[k])
n=c[k];
}
for(i=0;i<=64;i++)
{
for(k=0;k<=7;k++)
{
if(i==a[k])
{
p=p|(1<<k);
t=~p;
if(n>=0)
P1=~(t<<n);
else
P1=~(t>>-n);
}
}
}
}
}
}
一周热门 更多>