51单片机PWM实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
假如说,第一个灯肯定比第二个灯亮的话,可以直接把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 unsigned char PWM_ON ;//定义高电平时间
/******************************************************************/
/* 延时函数&nbs/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数*/
/******************************************************************/
void main()
{
bit Flag;
TMOD |=0x01; //定时器设置in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时
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*=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)%256; //定时
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是亮度时间控制!你如果想完全了解上面的程序的意思还是自己好好学习一下单片机编程!再说别人的程序只是参考参考就行了!