⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 模拟pwm 输出控制灯的10 个亮度.c

📁 这是本人在学习51单片机时练习的C程序 lgl_5923@163.com
💻 C
字号:
/* 第14 课,模拟PWM 输出控制灯的10 个亮度级别 

     LED 一般是恒流操作的,如何改变LED  的亮度呢?答案就是PWM 控制。在一定的 
频率的方波中,调整高电平和低电平的占空比,即可实现。比如我们用低电平点亮一个LED 
灯,我们假设把一个频率周期分为10 个时间等份,如果方波中的高低电平占空比是9:1, 
这是就是一个比较暗的亮度,如果方波中高低电平占空比是10:0,这时,全部是高电平, 
灯是灭的。如果占空比是5:5,就是一个中间亮度,如果高低比是1:9,是一个比较亮的 
亮度,如果高低是0:10,这时全部是低电平,就是最亮的。 
     实际上应用中,电视屏幕墙中的几十百万LED 象素都是这样控制的,而且每一个象素 
都有红绿蓝3 个LED,每个LED 可以变化的亮度是几百到几万或者更多的级别,以实现真 
彩色的显示。还有在您的手机中,背光灯的亮度如果是可以变化的,也应该是这种工作方式。 
目前的城市彩灯也有很多都使用了LED,需要控制亮度是也是PWM 控制。 
     下面来分析我们的例程,在这个例程中,我们将定时器2 溢出定为1/1200 秒。每10 
次脉冲输出一个120HZ 频率。这每10 次脉冲再用来控制高低电平的10 个比值。这样,在 
每个1/120 秒的方波周期中,我们都可以改变方波的输出占空比,从而控制LED 灯的10 个 
级别的亮度。 
     为什么输出方波的频率要 120HZ  这么高?因为如果频率太低,人眼就会看到闪烁感 
觉。一般起码要在60HZ 以上才感觉好点,120HZ 就基本上看不到闪烁,只能看到亮度的变 
化了。 
     下面请看程序,程序中有比较多的注释:
	
	  	――――――――――――――――――――――― */


#define uchar unsigned char//宏定义
#define uint unsigned int
#define ulong unsigned long
#include <reg51.h>//51内部说明
sbit P10=P1^0;//输出所在口
sbit K1=P3^2;//按钮输入口

uchar scale;//定义变量为无符号字符型,用于保存占空比的输出0 的时间份额,总共10 份 


 void main(void)//主程序开始
 {
 uint n;//定义无符号整型
 TMOD=0X01;//T0定时器工作方式1,16位,赋T2 的预置值,溢出1 次是1/1200 秒钟=833。33uS 
 TH0=0xf3;//初值
 TL0=0x98;
 TR0=1;//开始计时
 ET0=1;//允许T0中断
 EA=1;//开总中断
 while(1)//主程序循环
 {
 for(n=0;n<50000;n++);//延时
 scale++;//变量自加
 if(scale==10)//判断加到10则回0
 scale=0;
   }
 }

 timer2() interrupt 1//中断服务程序
 {
 static uchar tt;//定义无符号字符型静态变量
 TF0=0;//溢出肝后清零
 tt++;//自加
 if(tt==10)//判断加到10则回0
 {
 tt=0;
 P10=0;//P10给值
}
if(scale==tt)//否则如=scale则P10=1
P10=1;
}

/*―――――――――――――――――― 
在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。 
编译,运行,看结果。 
可以看到,LED 的亮度以每种亮度1 秒左右不断变化,共有10 个级别。 
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -