30725|13

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

PWM控制灯的亮暗程序小问题。 [复制链接]

#include
#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后,慢慢变暗 然后突然就变灭了,为什么呢?
为什么呢,
那么大虾给我改改,小弟谢了。

最新回复

你那是启动中断0,再允许中断0,再允许全中断.  详情 回复 发表于 2010-4-4 16:16
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
D2=1;
delay_ms(1);
D2=0;

这里,没有在D2=0;后加延时,导致,D2在灭的瞬间之后,就被重新置高。造成一直亮的现象(再无按键操作的情况下)
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
忘记说了,闪烁要想让人看到,1毫秒的延时是不够的,人眼的分辨能力在100ms左右,估计至少要做20`50的延时,才有比较不错的效果
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个 应该是 视觉 效应!!

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

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

另外楼主如果想要PWM占空比 来试验,完全可以用其控制一般的直流电机,最最简单那种的。
效果很明显。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
关于PWM的地方,我越看越觉得有问题
LZ,假如这个系统开机,然后不做任何操作,D1是不是长亮?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
赞一个    C_Rabbit
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
帮楼主顶一下~~~应该是时间的问题。如果时间没问题,那就看看电路上有没有硬伤,比如拉不高或置不了低~~~
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
看到这代码,就头疼,嘿嘿,你慢慢分析啊,祝你成功
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
帮顶dddd
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

10
 
我怀疑你的timer0中断没有用,呵呵
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
中断都没开,启动有用么?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 jjb_lzjj 的回复:
中断都没开,启动有用么?



打开了啊,呵呵

TR0=1; //启动定时器
ET0=1; //打开定时器2中断
EA=1;
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

13
 
//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;
   
}

这里的PWM部分,采用的是当scale等于tt时,输出高电平。而tt是通过定时器的中断,从0到18而变化。且当tt归零时,若scale不为0,则输出低电平。也就是说当tt的值是从0到scale时,D1是灭的,只有到tt介于scale和18之间时,D1是亮的。这样一来,使得scale值越大,则D1的高电平状态时间越短。而且还有可能出现,当scale为0时,D1长亮的情况。这个PWM的程序,和你在最开始所说的K1增加scale值,增加亮度,K2减少scale值,降低亮度,状况完全相反!
假如你的试验状态如你描述的那样,你应该首先检查烧入的程序是不是你现在所编写的程序编译出来的
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 10 楼 jjb_lzjj 的回复:
中断都没开,启动有用么?


你那是启动中断0,再允许中断0,再允许全中断.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表