搜索
bottom↓
回复: 45

51输出pwm控制led的明暗,请教!【恢复】

[复制链接]

出0入0汤圆

发表于 2008-11-7 17:15:49 | 显示全部楼层 |阅读模式
小弟在网上找了一段程序,下载也通过了,就是程序中有些地方看不懂,希望大虾赐教!
TO控制pwm输出的周期,是1ms,那T1是怎么工作的啊,看不懂,中断程序中的P1=0x00和P1=0xff又是什么意思呢?
程序如下:
// PWM 控制 LED 灯渐亮渐灭程序
// 适用 ME300B 开发系统
// 晶振为11.0592M
// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

/*********************************************************/

#include < reg51.h>
#include < intrins.h>

sbit  K1 =P3^2 ;                    //增加键
sbit  K2 =P3^3 ;                    //减少键
sbit  BEEP =P2^4 ;                //蜂鸣器
unsigned char PWM=0x7f ;   //赋初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{  

    P1=0xff; 
    TMOD=0x21 ;
    TH0=(65536-922)/256 ;//1ms延时常数
    TL0=(65536-922)%256 ;//频率调节

    TH1=PWM ;            //脉宽调节
    TL1=0 ;

     EA=1;
     ET0=1;
     ET1=1;

     TR0=1 ;
   while(1)
   {
     do{
            if(PWM!=0xff)
           {PWM++ ;delayms(10);}
           else Beep() ; 
         }
     while(K1==0);

     do{
           if(PWM!=0x02)
          {PWM-- ;delayms(10);}
           else Beep() ; 
          }
     while(K2==0);
   }
}

/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1 
{  
    TR1=0 ;
    TH0=(65536-922)/256 ;
    TL0=(65536-922)%256 ;
    TH1=PWM ;
    TR1=1 ;
    P1=0x00 ;      //启动输出
}

/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3 
{ 
    TR1=0 ;
    P1=0xff ;     //结束输出
}

/*********************************************************/
//蜂鸣器子程序
/*********************************************************/

void Beep()     
  {
      unsigned char i  ;
      for (i=0  ;i<100  ;i++)
        {
          delay(100)  ;
          BEEP=!BEEP  ;                //Beep取反
        } 
     BEEP=1  ;                            //关闭蜂鸣器
     delayms(100);
  } 

/*********************************************************/
// 延时子程序
/*********************************************************/  
void delay(unsigned char t)
 { 
    while(t--)   ;
 }

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms) 

{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0 ; i < 120 ; i++) ;
     }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-1-13 12:26:24 | 显示全部楼层
软件PWM很难做到占空比从0%到100%,硬件PWM才可以

出0入0汤圆

发表于 2009-1-13 11:08:55 | 显示全部楼层
不管用,因为调节不到最低和最高

出0入0汤圆

发表于 2009-1-9 23:52:18 | 显示全部楼层
标记  待用  

出0入0汤圆

发表于 2008-12-27 09:08:45 | 显示全部楼层
TH0=(65536-922)/256 ;//1ms延时常数 
    TL0=(65536-922)%256 ;//频率调节 

这个计算是什么意思,,,请教

出0入0汤圆

发表于 2008-11-28 11:27:10 | 显示全部楼层
标记·

出0入0汤圆

发表于 2008-11-18 00:06:32 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-11-10 15:09:56 | 显示全部楼层
终于理解了程序的含义,原程序不能控制pwm把占空比调到0或100,所以加了判断,可以彻底关闭led或最亮,调试通过,大家看看,呵呵!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar pwm=0x7f;
sbit k1=P3^2;
sbit k2=P3^3;
sbit fmq=P2^4;
void delay(uchar x)
{
        uchar a,b;
        for(a=0;a<x;a++)
                for(b=0;b<20;b++);        
}
void beep()
{
        fmq=0;
        delay(100);
        fmq=1;
        delay(100);
}
void main()
{
        EA=1;
        ET0=1;ET1=1;
        TMOD=0x21;
        TH0=(65536-922)/256;
        TL0=(65536-922)%256;
        TH1=pwm;
        TR0=1;
        while(1)
        {
                if(k1==0)
                {
                        delay(100);
                        if(k1==0)
                        {
                                if(pwm!=0xff)
                                {
                                 pwm++;TR0=1;
                                }
                                else
                                {
                                         TR0=0;
                                        beep();
                                        P1=0xff;
                                }
                        
                        }
                }
                if(k2==0)
                {
                        delay(100);
                        if(k2==0)
                        {
                                if(pwm!=0x00)
                                {
                                 pwm--;TR0=1;
                                }
                                else
                                {
                                        TR0=0;
                                        beep();
                                        P1=0x00;
                                }
                        
                        }
                }                        
        }
}
void tim0() interrupt 1
{
        TR1=0;
        TH0=(65536-922)/256;
        TL0=(65536-922)%256;
        TH1=pwm;
        TR1=1;
        P1=0x00;
}
void tim1() interrupt 3
{
        TR1=0;
        P1=0xff;
}

出0入0汤圆

 楼主| 发表于 2008-11-9 23:17:10 | 显示全部楼层
站长,不好意思,下次注意,确实对pwm概念比较模糊

出130入129汤圆

发表于 2008-11-9 16:41:44 | 显示全部楼层
pwm含义看来你不理解
头像被屏蔽

出0入0汤圆

发表于 2008-11-9 16:33:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2008-11-8 23:15:22 | 显示全部楼层
通过按键控制PWM加减,在中断0里面把PWM值作为中断1的初始化值,这样2个中断之间的时间差就是电平输出的占空比。通过调整PWM的大小来实现明暗显示

出0入0汤圆

 楼主| 发表于 2008-11-7 22:22:53 | 显示全部楼层
可能我问的有点问题,我知道P1=0X00,P1=0XFF是输出,可是怎么输出pwm的呢?

出0入0汤圆

发表于 2008-11-7 19:59:18 | 显示全部楼层
T0定时到了启动T1和PWM输出,等T1定时到了关闭自身和PWM输出,T1是8位自重装方式,所以它的定时时间总是先于T0到来.P1口应该都是输出.

出0入0汤圆

发表于 2008-11-7 19:54:25 | 显示全部楼层
自己看 ,一段子程序  就不多说了

void pwm()
{
           
           out_disp(0xff);  out_disp(0Xff);   out_disp(0xff);   out_disp(0xff);

           pwmon=20;
           pwmoff=80;

for(;pwmon<90;)
        {
           for(xx=15;xx>0;xx--)
                   {        
                           P2=0x00; P0=0x00;  delayus(pwmon);        P2=0xff; P0=0xff;  delayus(pwmoff);
                }
            pwmon++; pwmoff--;
          }

for(;pwmon>10;)
        {
           for(xx=15;xx>0;xx--)
                   {        
                           P2=0x00; P0=0x00;  delayus(pwmon);        P2=0xff; P0=0xff;  delayus(pwmoff);
                }
            pwmon--; pwmoff++;
          }

   }

出0入0汤圆

发表于 2008-11-7 19:19:54 | 显示全部楼层
这个我的理解是:P1=0x00 ,P1.0----P1.7输出低电平,灭着的,P1=0xff ,P1.0----P1.7 输出高电平!不知对否!

出0入0汤圆

发表于 2010-1-13 09:43:53 | 显示全部楼层
记号。

出0入0汤圆

发表于 2010-1-13 11:52:14 | 显示全部楼层
签名

出0入0汤圆

发表于 2010-1-13 19:01:09 | 显示全部楼层

出0入0汤圆

发表于 2010-1-22 02:48:27 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-1-22 08:32:38 | 显示全部楼层
跟着学习脉宽调制有用

出0入0汤圆

发表于 2010-1-22 08:44:07 | 显示全部楼层
跟着学习了。

出0入0汤圆

发表于 2010-10-4 19:24:44 | 显示全部楼层
正在学习。。

出0入0汤圆

发表于 2010-10-27 16:32:39 | 显示全部楼层
标记了……
记下了!

出0入0汤圆

发表于 2010-11-22 20:03:49 | 显示全部楼层
跟着学习。。。期望把AD转换过来的数,来控制PWM。。(这样,不用手按按键)。。。

出0入0汤圆

发表于 2010-12-1 14:47:02 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-12-1 22:47:59 | 显示全部楼层
这个程序不错。。。。

出0入0汤圆

发表于 2010-12-2 18:16:41 | 显示全部楼层
搞那么麻烦干嘛?一个定时器就可以做PWM了。

出0入0汤圆

发表于 2010-12-3 10:32:26 | 显示全部楼层
T0控制PWM输出频率,在T0中断程序中先输出高电平并设置TI中断的触发周期,而在T1中断中PWM输出低电平, 所以T1中断的作用是调节PWM的占空比.

出0入0汤圆

发表于 2010-12-3 10:58:42 | 显示全部楼层
既然确定了占空比,就根本不需要T1了,占空比<周期,所以T0就基本可以满足

出0入0汤圆

发表于 2010-12-10 16:39:24 | 显示全部楼层
那位大虾可以解释一下为什么不能调节范围在0-100%呢????
谢谢(⊙o⊙)哦

出0入0汤圆

发表于 2010-12-14 18:24:20 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-12-14 19:57:05 | 显示全部楼层
在超声波发射你看见过这样写的,用两个定时器产生一个PWM波,有点儿浪费资源了。一个定时器就可以了

出0入0汤圆

发表于 2010-12-23 03:38:19 | 显示全部楼层
新手,MARK

出0入0汤圆

发表于 2010-12-24 19:03:02 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-2-25 17:57:59 | 显示全部楼层
mark一下,在玩pwm

出0入0汤圆

发表于 2011-2-25 21:26:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-28 10:56:54 | 显示全部楼层
mark

出0入85汤圆

发表于 2011-2-28 13:01:11 | 显示全部楼层
推荐使用自带PWM功能的51

出0入0汤圆

发表于 2011-3-14 11:25:41 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-3-14 20:53:16 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-3-26 00:03:38 | 显示全部楼层
学习,学习!

出0入0汤圆

发表于 2011-3-26 02:34:33 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-1-30 20:36:45 | 显示全部楼层
程序不错

出0入0汤圆

发表于 2012-8-6 16:23:56 | 显示全部楼层
这个好像做得太差了吧

出0入0汤圆

发表于 2012-8-6 16:29:35 | 显示全部楼层
我咋看到的全是乱码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 20:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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