标题:
一种基于51单片机的PWM程序
[打印本页]
作者:
heicad
时间:
2014-10-21 01:28
标题:
一种基于51单片机的PWM程序
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;
}
}
到这里大家应该可以弄明白这个程序是怎么实现的了吧?
这个程序只用一个按键控制占空比,调占空比时不是很方便,大家在设计此类程序的时候可以用两个按键。
作者:
单片笨婴
时间:
2014-10-21 10:55
有没有8只流水灯渐变的程序啊
作者:
老菜鸟
时间:
2014-10-21 11:16
不错,收下,谢谢!!!
作者:
runlin1
时间:
2015-12-9 18:43
谢谢楼主
作者:
小蜜蜂o
时间:
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;
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1