找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 4922|回复: 3
打印 上一主题 下一主题
收起左侧

刚看到的一个程序,有些地方不明白,请大虾指点迷津

[复制链接]
跳转到指定楼层
楼主
ID:26634 发表于 2010-10-31 22:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
 

51单片机脉冲宽度调制(PWM)控制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就可以改变占空比。*/

 

 

 

我直接将该程序写入单片机里面,单片机上指示灯的从亮→闪烁→灭,如此不断循环,如果我想让单片机上的指示灯到最后一直保持在20%的亮度,而不是灭,此程序该如何修改?请高手指点迷津,小弟感激不尽!!!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

举报

地板
ID:26754 发表于 2010-11-11 10:17 | 只看该作者

#include "AT89X51.H" 

void main(void)   

 {P2_0=0;

   } 

就这样应该就好了!

亮度是改变电阻的大小实现的!

回复

举报

板凳
ID:26754 发表于 2010-11-11 10:12 | 只看该作者

其实你是要一个LED一直亮着且保持着20%的亮度!再程序中让它一直开着好了啊!亮度问题其实通过硬件实现的!

回复

举报

沙发
ID:26634 发表于 2010-11-10 14:52 | 只看该作者

没人回贴,自己给自己顶一個吧

回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表