1、 #include my_type.h3hw_config.h4 56 void main(void)7 8 u8 i = 0;910 /使能独立LED的供电,即LEDS6输出低电平11 LEDEN = 0;12 ADDR0 = 0;13 ADDR1 = 1;14 ADDR2 = 1;15 ADDR3 = 1;1617 /第一个LED亮18 P0 = 0xFE;1920 while(1)2122 for(i=0; i250; i+)2324 if(i10)2526 P0 &= 0xFD;/第二个灯亮27 28 else2930 P0 |= 0x02;/第二个灯灭31323334L1(22-32
2、):这段代码实现P0.1输出占空比为96%的方波,而P0.0恒为低。P0.1输出如图3所示(受纸张限制,图中高低电平长度比例和实际有偏差)。120611_2.png) 图3下载验证:从开发板上可以看到运行效果,D1比D2亮。(这里说明一点:当P0输出低电平时,LED亮,所以,PWM的占空比越小越亮)。3.2 产生8个亮度级别3.1节的例子证实了我们的设想,PWM可控制LED的亮度,下面我们设计几组占空比不同的PWM,看看对LED亮度的控制效果。代码如下:程序清单L2:不同占空比对LED亮度的控制 /亮度级别表 code u8 LightLevel8=0,1,2,4,8,16,32,64;u8
3、i = 0; u8 j = 0; u8 k = 0; u8 temp = 0;/使能独立LED的供电,即LEDS6输出低电平LEDEN = 0;ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1; /开始全灭 P0 = 0xFF;while(1) /P0端口输出8组占空比不同的PWM64; for(j=0; j8; j+) if(LightLevelj = i)35 temp |= (1j);36373839 temp &= (140414243 P0 = temp;444546L2(29-45).此段程序是让P0口输出8组占空比不同的PWM,如图4:120611_
4、3.png) 图4从开发板上可以看到运行效果,从D1到D8的亮度逐渐增大。3.3 水滴下落效果根据PWM可控制LED亮度的原理,我们用8个LED实现水滴下落的效果。第一步,水滴逐渐变大,用D1从暗变亮模拟;第二步,水滴下落,带有拖尾效果,LED逐个亮,移动速度加快,且越靠前的LED亮度越大。程序清单L3 水滴流水灯 /水滴时间,实现加速效果 code u8 LightTime16=16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1;u8 i,j,k;u8 temp,count; u8 state; /-水滴逐渐变大(第一个LED亮度逐渐变大)- /一个亮度级别发送64
5、个脉冲 /以i为亮度级别,随着i的增大,占空比增大 for(k=0; k i)4748 /-水滴降落过程-49 for(state=0; state16; state+)50 51 /每一状态维持LightTimestate个脉冲52 for(count=0; count=LightTimestate; count+)5354 /temp记录8个LED的状态,0代表亮,1代表灭55 temp = 0x00;5657 /一个脉冲长度j从0到63585960 /根据亮度表,依次确定8个LED当前状态,亮或灭616263 /以j为亮度级别,每个LED亮度不一样64 if(LightLevelk =
6、j)6566 temp |= (1 k);67686970 if(state (7-state);73747576 P0 = (temp) (state-7);777879808182L2(31-46).实现水滴变大效果,这段代码的作用可用图形表达,如图5:120611_4.png) 图5控制D1由暗变亮,用了64个亮度级别,每个级别发送64个脉冲。L2(49-81).实现水滴下落。代码就不逐行解释了,大家可根据注释自己分析,主要说一下实现的方法。定义LED有8个亮度级别,若用开发板上的8个LED表示,如图6:120611_5.png) 图6图中的红色面积代表亮度程度。实现流水效果的方法就是:
7、让所有的亮度依次经过在所有LED,如图7:120611_6.png) 图7状态的持续时间从0-15逐渐减小,以模拟水滴加速。下载到开发板上,可以看到水滴下落效果。3.4 定时器产生PWM前面3个例子中,我们用循环语句虽然能产生占空比不同的PWM,但PWM的周期不好控制,对此,我们学习如何用定时器产生特定周期PWM。关于8051定时器的使用方法,大家可以参考例说51单片机的4章和5章。我们用定时器0产生PWM,代码如下:程序清单L4 定时器0产生PWM code u8 LightLevel8=1,2,4,8,16,28,50,64; /函数声明 void timer0_init(void); t
8、imer0_init(); /* 函数名称:timer0_init 功 能:初始化定时器0 */ void timer0_init(void) TMOD = 0x01;/运行模式1TH0= 0xFF;/10us中断TL0= 0xFA;EA= 1;/开启中断ET0TR0/启动定时器 /*timer0_overflow定时器0溢出中断 */ void timer0_overflow(void) interrupt TIMER0_OVERFLOW u8 i,temp = 0; static u8 count = 0; count+; count %= 64; if(LightLevel = count)i); TR0 = 0; TH0 = 0xFF;/重新赋值TL0 = 0xF7;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1