找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10963|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机pwm脉宽调制程序详解

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-23 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个问题困扰我三天了,刚开始在考虑怎样做,结果很快程序完成,不幸的是程序在脉宽调宽是竟然是尖峰波,断续,后多次调试未果,后来跟踪time0变量,也正常,原来是在中断时位对立即采样寄存器清零造成,程序判断错误,而误动作!在修改变量time0是结束加两条请立即采样寄存器,一切变得如此简单,加油!PWM是很有用的!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p1_0=P0^0;
sbit p2_0=P2^0;//加键
sbit p2_1=P2^1;//减键

uint t=100;  //周期
uint time0; // 低电平可按键调整量
uint time1; // 高点平基准量
uint timeing0;//立即低电平动态变量
uint timeing1; //立即高电平动态变量
void delay(uint z) //延时程序
{  
uint x,a,b;
         for (x=0;x<z;x++)
   
       {
       for(b=120;b>0;b--)
    {
        for(a=3;a>0;a--);
     
             }
    }

}

void keyball()//{按键修改定时数据,实现实时PWM调制

  if(p2_0==0)
  {
   delay(3);
                     if(p2_0==0)
      {
      
             if(time0>1)
         {
         
         
          time0--;
          time1=(t-time0);
         
          timeing0=0;
          timeing1=0;
         
         }


      
      }
  
  
  
  
  
  
  }
//
*********************已上是减低电平************一下是加低电平******************if(p2_1==0)
  {
   delay(3);
                     if(p2_1==0)
      {
      
             if(time0<100)
         {
         
         
          time0++;
          time1=(t-time0);
          timeing0=0;
          timeing1=0;  //太关键了!这一步,因为不加的话,当再一次的time0被修改时timeing0,和timeing1不为0
         //             所以才会发生错误,表现为波形时断时续,而且有尖锋脉冲,这都是没有在刷新TIME0的同时刷新tineing的后果
         //             没想到很简单的一点事竟差点PWM做不出来!真是有有教训了
         //             2010年10月7日晚8:34分与天津开发区第四项目部宿舍1
         
         
         }


      
      }
  
  
  
  
  
  
  }

}
void InitTimer0(void) //10us
{
    TMOD = 0x01;

    TH0 =0xff;
    TL0 =0xf7;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
  p1_0=1;
}
void main(void)//主函数
{ P2=0x0f;
    InitTimer0(); //10 us  time0=10;(根据不同的精准度和频率要求)

  time1=10;
  while(1)
  {
  
  keyball();
  P3=time0;
  
  }







}
void Timer0Interrupt(void) interrupt 1
{
   
     if(time0==timeing0)
  {
        if(time1!=timeing1)
     {
     
        TH0 =0xff;
              TL0 =0xf7;
          p1_0=1;
          timeing1++;
     
     
     }
       //中断函数(定时器参量修改)




  }
   else
   if(time0!=timeing0)
     {
   TH0 =0xff;
        TL0 =0xf7;
    p1_0=0;
   timeing0++;   
  
  
  
  }
  if(time0==timeing0)
  {
  if(time1==timeing1)
  {
  
   timeing0=0;
   timeing1=0;
  }
  }
   
}


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

使用道具 举报

沙发
ID:45963 发表于 2015-6-24 07:56 | 只看该作者
先点个赞
回复

使用道具 举报

板凳
ID:46475 发表于 2018-4-1 21:08 | 只看该作者
厉害了
回复

使用道具 举报

地板
ID:170318 发表于 2018-4-4 09:16 | 只看该作者
不错,有钻劲
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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