打印
[51单片机]

51单片机PWM调光求助

[复制链接]
2622|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
samsunghellome|  楼主 | 2013-8-16 11:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 samsunghellome 于 2013-8-16 16:21 编辑

求高手解释一下该程序的编程思想,运行顺序,定时器中断函数,何时进入,何时跳出,谢谢

#include"reg52.h"             //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^7;               //定义LED灯,通过LED显示调光效果
unsigned char CYCLE;  //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON=0 ;//定义高电平时间,当PWM_ON非0时为点亮LED,反之熄灭.
/******************************************************************/
/*                    延时函数                                    */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/*                    主函数                                      */
/******************************************************************/
void main()
{
        bit Flag=0;
        TMOD=0x01;                //定时器设置 0.1ms in 12M crystal
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;      //定时0.1mS
        IE=0x82;                  //打开中断 EA /  ET2 ES ET1 EX1 ET0 EX0   
        TR0=1;
        CYCLE =10;               // 时间可以调整 这个是10调整 8位PWM就是256步
        while(!Flag)                //Flag=0
                  {
                             delay(1000);          //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果
                                                                        //这个使用较长延时,以便能看清楚变化过程
                                 PWM_ON++;            
                                    if(PWM_ON==CYCLE)
                             {                    //这个里可以添加其他程序 如到最亮时候控制设备
                                      Flag=1;
                                 }
                  }
                while(Flag)              //亮度递减 同上,是个相反的过程
                  {
                           delay(5000);
                           PWM_ON--;
                           if(PWM_ON == 1)
                           {
                              Flag=0;
                           }
                  }        
        
}
/******************************************************************/
/*                    定时器中断函数                              */
/******************************************************************/
void time0(void) interrupt 1 using 1
{
        static unsigned char count;
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;     //定时0.1mS
        if(count==PWM_ON)                 //count=0,第1次中断时PWM_ON=0;
    {
     LED=1;            //灯灭
    }
    count++;
        if(count==CYCLE)
    {
            count=0;
                if(PWM_ON!=0)
                {LED=0;}       //如果左右时间是0,保持原来状态
        }

}

相关帖子

沙发
outstanding| | 2013-8-16 15:08 | 只看该作者

使用特权

评论回复
板凳
crazy2012| | 2013-8-16 15:29 | 只看该作者
程序跑飞了。

使用特权

评论回复
地板
samsunghellome|  楼主 | 2013-8-16 15:37 | 只看该作者
我是新手,请指出错误,谢谢!

使用特权

评论回复
5
草民| | 2013-8-16 15:51 | 只看该作者
CYCLE = 2;               // 时间可以调整 这个是10调整 8位PWM就是256步

这样设置,灯能亮起来?

使用特权

评论回复
6
samsunghellome|  楼主 | 2013-8-16 15:59 | 只看该作者
CYCLE=10,我不理解的是,这个程序是怎么实现调光的??高手解析下核心思想,谢谢

使用特权

评论回复
7
samsunghellome|  楼主 | 2013-8-16 16:05 | 只看该作者
草民 发表于 2013-8-16 15:51
CYCLE = 2;               // 时间可以调整 这个是10调整 8位PWM就是256步

这样设置,灯能亮起来? ...

是CYCLE=10,我不理解这个程序是怎么实现调光的??还有CYCLE后面的步数是怎么计算的??高手解析下核心思想,谢谢

使用特权

评论回复
8
samsunghellome|  楼主 | 2013-8-16 16:12 | 只看该作者
crazy2012 发表于 2013-8-16 15:29
程序跑飞了。

程序哪里有问题,请帮我指出来吧。谢谢

使用特权

评论回复
9
草民| | 2013-8-16 16:34 | 只看该作者
samsunghellome 发表于 2013-8-16 16:05
是CYCLE=10,我不理解这个程序是怎么实现调光的??还有CYCLE后面的步数是怎么计算的??高手解析下核心 ...

思想就是利用定时器产生占空比变化的PWM,灯亮度和占空比成正比。

if(count==PWM_ON)                 //count=0,第1次中断时PWM_ON=0;
    {
     LED=1;                      //灯灭
    }
    count++;
    if(count==CYCLE)
    {
            count=0;
                if(PWM_ON!=0)
                {LED=0;}       //如果左右时间是0,保持原来状态

“灯灭”这个注释可能误导了你,LED=1只是输出低电平,ms级别的延时,人眼是看不到灭的。
灯亮度是靠P1.7输出占空比变换的PWM波。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
samsunghellome + 1 很给力!
10
samsunghellome|  楼主 | 2013-8-16 16:54 | 只看该作者
草民 发表于 2013-8-16 16:34
思想就是利用定时器产生占空比变化的PWM,灯亮度和占空比成正比。

if(count==PWM_ON)                 / ...

我明白了,谢谢师傅!

使用特权

评论回复
11
草民| | 2013-8-16 17:01 | 只看该作者
samsunghellome 发表于 2013-8-16 16:54
我明白了,谢谢师傅!

使用特权

评论回复
12
samsunghellome|  楼主 | 2013-8-17 08:43 | 只看该作者
草民 发表于 2013-8-16 17:01

师傅,可不可以帮我看看这个,给点建议吧,谢谢
https://bbs.21ic.com/forum.php?mod=viewthread&tid=600492&pid=3378635&page=1&extra=#pid3378635

使用特权

评论回复
13
sxhhhjicbb| | 2013-8-17 14:58 | 只看该作者
PID调吧....

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

198

帖子

0

粉丝