找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机高效PWM方案程序

[复制链接]
跳转到指定楼层
楼主
ID:612853 发表于 2019-9-18 00:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一种用51单片机实现的高效PWM方案,只需要两次中断即可实现可调的PWM,绝对原创,盗版必究!


/********************************************************************************************************/
/*在现在我已知的用51单片机产生PWM的方法中,基本都是通过定时器中断来实现的,这样一个PWM周期就包含了很多
小中断,浪费了大量时间,尤其是当程序较复杂时,往往就会出问题!而本设计则克服了这个缺点!一个周期只需要两
次中断!绝对的好方法!
为了让大家都能够学到这个好方法,我特整理了这个程序,希望能对大家有所帮助!      */
//作者:嘻嘻嘻      2012年4月
/********************************************************************************************************/



#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit OUT=P1^0;    //定义PWM端口
unsigned int PWM;
unsigned int PWM_0;
unsigned int PWM_H,PWM_L;
bit sign=0;


/*------------------------------------------------
                    定时器2初始化子程序
------------------------------------------------*/
void Init_Timer2(void)
{
T2CON=0X00;                     //使用16位自动重装        
RCAP2H=0XFE;                        
RCAP2L=0XE0;                           //给定初值,0.8MS
TH2=0XFE;
TL2=0XE0;
EXEN2=1;
OUT=1;
ET2=1;           //定时器中断打开
EA=1;            //总中断打开
TR2=1;           //定时器开关打开
sign=0;
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
void delay()
{
        unsigned char i=60;
        for(;i>0;i--);
}
main()
{
Init_Timer2();
PWM_0=12000;                                               //初始化PWM
//RCAP2H=(unsigned char)((65536-PWM)>>8);
//RCAP2L=(unsigned char)((65536-PWM)&0x00ff);                //重新赋值,200US
while(1)
{         
for(;PWM_0>2;PWM_0--) delay();
for(;PWM_0<9999;PWM_0++) delay();
        }
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer2_isr(void) interrupt 5
{
if(sign==1)
  {
          TR2=0;         
    PWM=PWM_0;
         RCAP2H=(unsigned char)((65536-PWM)>>8);
    RCAP2L=(unsigned char)((65536-PWM)&0x00ff);                        
    sign=0;
        OUT=0;
        TF2=0;
        TR2=1;
  }
else
  if(sign==0)
  {
   TR2=0;  
   //PWM=660-PWM_0;                                                                          //1000HZ
   //PWM=3000-PWM_0;                                          //300HZ
   PWM=19550-PWM_0;                                                                  //50HZ
   RCAP2H=(unsigned char)((65536-PWM)>>8);
   RCAP2L=(unsigned char)((65536-PWM)&0x00ff);                    
   sign=1;
   OUT=1;
   TF2=0;
   TR2=1;
  }

}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:156220 发表于 2019-9-18 09:02 | 只看该作者
学习好方法,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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