PWM输出控制LED亮度
时间:12-01 11:02 阅读:1450次
*温馨提示:点击图片可以放大观看高清大图
简介:这里给大家分享了一个PWM输出控制LED亮度的程序设计
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P2 //定义LED端口
sbit k1=P3^5;
sbit k2=P3^4;
sbit k3=P3^3;
sbit k4=P3^2;
void k1d();
void k2d();
void k3d();
void k4d();
uchar scale;//用于保存占空比的输出0的时间份额,总共10份
//功能:延时1毫秒
//入口参数:x
//出口参数:无
//说明:晶振为12M
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<122;j++);
}
//1/1200秒定时器2中断
void Timer2(void) interrupt 5
{
static uchar tt; //tt用来保存当前时间在一秒中的比例位置
TF2=0;
tt++;
if(tt==10) //每1/120秒整开始输出低电平
{
tt=0;
if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
LED=0;
}
if(scale==tt) //按照当前占空比切换输出高电平
LED=0xff;
}
//主函数
void main(void) // 主程序
{
delay(50);//等待系统稳定
RCAP2H =0xFC; //赋T2的预置值,溢出1次是1/1200秒钟
RCAP2L =0xE0;
TR2=1; //启动定时器
ET2=1; //打开定时器2中断
EA=1; //打开总中断
while(1) //程序循环
{
k1d();
k2d();
k3d();
k4d();
}
}
void k1d()
{
if(!k1)
{
delay(20);
if(!k1)
{
LED=1;
scale=0;
while(!k1);
}
}
}
void k2d()
{
if(!k2)
{
delay(20);
if(!k2)
{
scale--;
if(scale==255)
scale = 0;
while(!k2);
}
}
}
void k3d()
{
if(!k3)
{
delay(20);
if(!k3)
{
scale++;
if(scale==11)
scale = 10;
while(!k3);
}
}
}
void k4d()
{
if(!k4)
{
delay(20);
if(!k4)
{
LED=0;
scale=10;
while(!k4);
}
}
}