/*介绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。程序出自:单片机网http://www.51hei.com,如有问题可在论坛提出,程序中使用定时器0产生2.5ms周期脉冲,使用占空比控制变量scale控制占空比,在低电平期间使LED灯亮,在高电平期间使LED灯灭,改变scale就改变了高电平与低电平的时间,因此也就控制了LED灯的亮度。*/
#include "AT89X51.H" //模拟PWM输出控制灯的10个亮度级
unsigned int scale; //占空比控制变量
void main(void) // 主程序
{ unsigned int n; //延时循环变量
TMOD=0x02; //定时器0,工作模式2(0000,0010),8位定时模式
TH0=0x06; //写入预置初值6到定时器0,使250微秒溢出一次(12MHz)
TL0=0x06; //写入预置值
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
while(1) //无限循环,实际应用中,这里是做主要工作
{ for(n=0;n<50000;n++); //每过一段时间,就自动加一个档次的亮度
scale++; //占空比控制变量scale加1
if(scale==10) scale=0; //如果scale=10,使scale为0
} }
timer0() interrupt 1 //定时器0中断服务程序
{ static unsigned int tt ; //tt用来保存当前时间在一秒中的比例位置
tt++; //每250微秒增加1
if(tt==10) //2.5毫秒的时钟周期
{ tt=0; //使tt=0,开始新的PWM周期
P2_0=0; //使LED灯亮
}
if(scale==tt) //按照当前占空比切换输出为高电平
P2_0=1; //使LED灯灭
}
/*程序中从tt=0开始到scale为低电平,从scale开始到tt=10为高电平,由于scale是变量,所以改变scale就可以改变占空比。*/
上一篇:关于STC12C5410AD单片机PxM0,PxM1设置的问题
下一篇:用查询定时器0溢出标志位的方式实现LED灯闪
推荐阅读最新更新时间:2024-03-16 13:13
设计资源 培训 开发板 精华推荐
- 直播:TI SimpleLink MCU无线平台及软件介绍!丰富的提问礼在这里等你~
- 有奖征集:推荐你用过或了解的好用的电源芯片
- 中秋芯币兑大礼
- 安世半导体&世平集团 高效能&小型化, Nexperia MOSFET的5G解决方案 观看、下载 闯关赢好礼!
- 下载有礼:2017年泰克亚太专家大讲堂第一期:大数据与云存储环境下的高速总线技术演进
- 艾睿照明设计工具初体验:与LED设计的亲密接触!
- 迈来芯高可靠可编程霍尔开关,5月21日 10:00 邀您观看直播
- ADI有奖下载活动之7 可编程逻辑控制器(PLCs)解决方案
- 富士通白皮书有奖下载|FRAM高性能存储器优化车载电子系统
- 暑期酷学,专为在校生打造!!!