51单片机PWM实验 下载本文

假如说,第一个灯肯定比第二个灯亮的话,可以直接把8个LED灯的限流电阻弄成不同阻值的。就像楼上说的那样。

但如果想随便变换不同的灯都能有不同的亮度话,硬件电路可以不变,限流电阻都一样。可以在程序里这样写:

首先,例如你要最亮的灯先点亮,隔几十微秒后点亮第二个灯,再相隔同样时间点亮第三个灯……依次类推间隔一定时间点亮八个灯。但间隔时间不要太大,超过十几毫秒就不行了。 然后再间隔相同的时间一次性把灯全关了,再间隔几十微秒回到上面的状态依次点亮灯。……一直这样循环。

这样的话因为人的视力有一定的滞回效果,只要间隔时间不大,你就能看到八个灯不是闪的,而是同时亮,但亮度又不一样。 这是单片机设计中,PWM控制的思路。

LED PWM调光C程序

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED1 = P2^0;

sbit LED = P2^1; //定义LED灯,通过LED显示调光效果 sbit LED2 = P2^2;

unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms unsigned char PWM_ON ;//定义高电平时间

/******************************************************************/

/* 延时函数 &nbs/******************************************************************/ void delay(unsigned int cnt) {

while(--cnt); }

/******************************************************************/ /* 主函数 */

/******************************************************************/ void main() {

bit Flag;

TMOD |=0x01; //定时器设置 0.1ms in 12M crystal TH0=(65536-100)/256;

TL0=(65536-100)%6; //定时0.1mS IE= 0x82; //打开中断 TR0=1;

CYCLE = 50; // 时间可以调整 这个是10调整 8位PWM就是256步 while(!Flag) {

delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果 PWM_ON++; //这个使用较长延时,以便能看清楚变化过程 if(PWM_ON == CYCLE)

{ //这个里可以添加其他程序 如到最亮时候控制设备 Flag=1; } }

while(Flag) //亮度递减 同上,是个相反的过程 {

delay(20000); //延迟时间为20000*0.4=8000us PWM_ON--;

if(PWM_ON == 0) {

Flag=0; } } }

/******************************************************************/ /* 定时器中断函数 */

/******************************************************************/ void tim(void) interrupt 1 using 1 {

static unsigned char count; TH0=(65536-100)/256;

TL0=(65536-100)%6; //定时0.1mS if (count==PWM_ON) {

LED1 = 1;

LED = 1; //灯灭 LED2 = 1; }

count++;

if(count == CYCLE) {

count=0;

if(PWM_ON!=0) //如果开启时间是0 保持原来状态 {

LED1 = 0;

LED = 0; //灯亮 LED2 = 0; } } }

PWM意思是占空比调节!你上面的程序简单的讲就是通过中断系统定时控制输出!然后主函数实现高低电平的时间控制PWM_ON是亮度函数CYCLE是亮度时间控制!你如果想完全了解上面的程序的意思还是自己好好学习一下单片机编程!再说别人的程序只是参考参考就行了!