找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3640|回复: 5
收起左侧

一种基于51单片机的PWM程序

[复制链接]
ID:262 发表于 2014-10-21 01:28 | 显示全部楼层 |阅读模式
      51单片机没有PWM波产生模块,有时候需要用到PWM功能,想用51单片机实现,这真是令人伤脑筋。先贴出我写的一个比较简单的产生PWM的程序,该程序使用了一个定时器和一个IO端口就实现了。

#include<reg52.h>                                    //51单片机头文件
#define uint unsigned int                           //宏定义
#define uchar unsigned char                    //宏定义


uint i,m=4;                         //m调整占空比,i 控制周期
sbit PWM=P1^0;                //P1.0口输出PWM波
sbit key=P2^0;                   //P2.0口按键调整占空比


void delay(uint x)            //延时函数,约1ms
{
        uint a,b;
        for(a=x;a>0;a--)
        for(b=110;b>0;b--);
}


void main()
{
        PWM=1;                                //初始化给P1.0口高电平
        TMOD = 0X01;                        //定时器0工作方式1
        TH0 = (65536-500)/256;         //装初值,0.5ms
        TL0 = (65536-500)%256;        
        ET0 = 1;                                //使能T0中断
        TR0 = 1;                                //启动定时器T0
        EA=1;                                    //开启全局中断
        while(1)
        {
                if(key==0)                        //检测按键
                        delay(5);
                        if(key==0)
                        {                       
                                m++;
                                if(m==5)
                                m=0;
                        }
                        while(!key);        //按键松手检测
        }
}


void timer0() interrupt 1               //T0中断函数
{
        TH0 = (65536-500)/256;        //重装定时器初值
        TL0 = (65536-500)%256;
        i++;       
        if(i==m)                                
        {
                PWM=0;
        }
        if(i==40)
        {
        i=0;
        PWM=1;
        }
}




到这里大家应该可以弄明白这个程序是怎么实现的了吧?
这个程序只用一个按键控制占空比,调占空比时不是很方便,大家在设计此类程序的时候可以用两个按键。

回复

使用道具 举报

ID:63571 发表于 2014-10-21 10:55 | 显示全部楼层
有没有8只流水灯渐变的程序啊
回复

使用道具 举报

ID:65837 发表于 2014-10-21 11:16 | 显示全部楼层
不错,收下,谢谢!!!
回复

使用道具 举报

ID:84498 发表于 2015-12-9 18:43 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:98591 发表于 2015-12-10 21:29 | 显示全部楼层
我的好像也没错,但是万用表测不出来,只有占空比在0.5附近才能明显测到电压约等于2.4v,其他时候都有4v多,但是接个led上去会亮。
//pwm的频率f、占空比d,单片机定时器+1要是1us才准确
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define f 1000//输出频率f,Hz
#define d 0.5//占空比,H时的
sbit pwm=P2^7;//pwm输出口
float t;
uchar temp1h,temp1l,temp2h,temp2l;//temp1为要H时定时器初值,temp2为要L时的初值
bit flag;//频率一个周期中的标志位,当pwm输出h为1,输出l为0
void init_pwm()
{
        EA=1;
        TMOD=0X20;
        ET1=1;
        TH1=temp1h;
        TL1=temp1l;
        flag=1;
        TR1=0;
}//初始化设置定时器1,但没有启动
void main()
{
//        float f,d;
        uint a1,a2;
        t=1000000/f;//一个周期的时间t
        a1=65536-d*t;
        a2=65536-(1-d)*t;//因为%不能对小数,多加入了a1,a2取整
        temp1h=(65536-d*t)/256;
        temp1l=a1%256;
        temp2h=(65536-(1-d)*t)/256;
        temp2l=a2%256;
        init_pwm();
        TR1=1;
        while(1);
}
void t1() interrupt 3
{
        if(flag==0)//要h输出时的t1初值
        {
                TH1=temp1h;
                TL1=temp1l;
                pwm=1;
                flag=1;
        }
        else        if(flag==1)//要L输出时的t1初值
        {
                TH1=temp2h;
                TL1=temp2l;
                flag=0;
                pwm=0;
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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