首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

PWM控制灯的亮暗程序小疑点

2012-03-06 
PWM控制灯的亮暗程序小问题。#includereg52.h#define uchar unsigned char#define uintunsigned intsbit

PWM控制灯的亮暗程序小问题。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1=P3^4; //增加值
sbit KEY2=P3^3; 
sbit KEY3=P3^2;
sbit D1=P0^0; // 测试的灯。
sbit D2=P0^7; //指示灯,没等亮的时候 不停的闪烁。
char scale=0; //用于保存占空比的输出0的时间份额,总共10份

void delay_ms(uchar N)
{
  uchar i,j;
  for(i=N;i>0;i--) 
  for(j=110;j>0;j--);

void main(void) // 主程序
{
 
uint n;
TMOD=0X01 ;
TH0 =0xFC; //赋T0的预置值, 溢出1次是1/1000秒钟
TL0=0x66; 
TR0=1; //启动定时器
ET0=1; //打开定时器2中断
EA=1;
  //打开总中断 
while(1) //程序循环
{  
   
 
 
D2=1;
delay_ms(1);
D2=0;
 

 
 
if(KEY1==0)
{
D2=1;
  for(n=0;n<30000;n++); //每过一会儿就自动加一个档次的亮度
  scale++;
  if(scale>12)
  scale=12;
  }
 
if(KEY2==0)
{
D2=1;
  for(n=0;n<30000;n++); //每过一会儿就自动减一个档次的亮度
  scale--;
  if(scale<0)
  scale=0;
  }  

}
}
//1/1000秒定时器2中断
void timer0() interrupt 1 
{  
  static uchar tt=0; //tt用来保存当前时间在一秒中的比例位置
  TH0 =0xFC;  
  TL0=0x66;
  tt++;
if(tt==18) //每1/100秒整开始输出低电平
{
  tt=0;

  if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
  D1=0; 

  
if(scale==tt) //按照当前占空比切换输出高电平
  D1=1;
   
}
这个是模拟个灯慢慢变亮变暗的程序。
我想开始的时候叫D2灯闪烁,用于指示灯的。
可是我这个一开始的时候,D2就直接亮了,不闪烁么。
而且我按下KEY2后,慢慢变暗 然后突然就变灭了,为什么呢?
为什么呢,
那么大虾给我改改,小弟谢了。

 

[解决办法]
忘记说了,闪烁要想让人看到,1毫秒的延时是不够的,人眼的分辨能力在100ms左右,估计至少要做20`50的延时,才有比较不错的效果
[解决办法]
这个 应该是 视觉 效应!!

楼主有示波器吗?如果有的话,可以测试你下你控制LED的对应的管教的波形,应该起对应的波形 和你控制的是一样的啊。

感觉楼主的问题,很可能是你的LED其实在PWM输出低的时候为灭,但是被之前的亮所掩盖,其实就是视觉反应,
所以看着不是那样。

另外楼主如果想要PWM占空比 来试验,完全可以用其控制一般的直流电机,最最简单那种的。
效果很明显。
[解决办法]
看到这代码,就头疼,嘿嘿,你慢慢分析啊,祝你成功
[解决办法]
我怀疑你的timer0中断没有用,呵呵

热点排行