标题:
关于51单片机PWM输出程序问题?
[打印本页]
作者:
。。jj
时间:
2020-2-19 09:20
标题:
关于51单片机PWM输出程序问题?
刚学的PWM,看了一下参考的程序,有一些地方不是很明白,代码如下。后面还有我自己改编后写的代码,但是不好使,请大家帮我分析一下。
问题:
PWM的周期timer1是自己设定的还是单片机内部定的
value代表的是占空比,当count==100的时候才加1,为什么value要等于1000而不是等于10(我认为应该是分成10份啊)
关于判断PWM是否为1为什么是用timer1和value的大小做对比。
参考代码,没有问题
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit PWM=P2^2;
bit DIR;
u16 count,value,timer1;
void Timer1Init()
{
TMOD|=0X10
TH1 = 0xFF;
TL1 = 0xff;
ET1=1
EA=1;
TR1=1;
}
void main()
{
Timer1Init();
while(1)
{
if(count>100)
{
count=0;
if(DIR==1)
{
value++;
}
if(DIR==0)
{
value--;
}
}
if(value==1000)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
if(timer1>1000)
{
timer1=0;
}
if(timer1 <value)
{
PWM=1;
}
else
{
PWM=0;
}
}
}
void Time1(void) interrupt 3
{
TH1 = 0xFF;
TL1 = 0xff; //1us
timer1++;
count++;
}
我自己根据上面代码自己改编了一下,只有这些变了,其他和上面程序一样,但无法呈现呼吸状态,led一直在闪烁。
if(value==10)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
for(i=0;i<=value;i++)
{
PWM=1;
}
for(i=value+1;i<=10;i++)
{
PWM=0;
}
作者:
xuyaqi
时间:
2020-2-19 14:17
给你个参考程序,timer1只是给了定时中断, PWM的周期是程序给定的,在参考程序里zhouqi计数值是周期,gaodianpin计数值是周期内的高电平值,具体看程序。
呼吸灯.rar
(18.41 KB, 下载次数: 10)
2020-2-19 14:16 上传
点击文件名下载附件
作者:
。。jj
时间:
2020-2-19 19:05
xuyaqi 发表于 2020-2-19 14:17
给你个参考程序,timer1只是给了定时中断, PWM的周期是程序给定的,在参考程序里zhouqi计数值是周期,gaod ...
我看了你发的程序,我在开发板上用了一下,但是发现这个程序的呼吸灯效果不是很明显。
我还有几个问题,可能是我没有学好,希望你为我讲解一下。
对于这个程序来说,我不知道你对P0的设定有什么用,我把他删了还是和之前的效果一样。
这个程序的周期是60000*1us吗,我还是不明白为什么要等zhouqi>60000后才改变gaodianping的值,
而且开始是DIR为0,那gaodianping就在减,等到DIR为1时,高电平再加,那这么变化gaodianping的值不应该是-60000~0吗,怎么能大于60000呢。
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit PWM=P2^2;
bit DIR;
u16 zhouqi;
u16 gaodianpin;
void Timer1Init()
{
TMOD|=0X10;
TH1 = 0xFF;
TL1 = 0xff;
ET1=1;
EA=1;
TR1=1;
}
void main()
{
Timer1Init();
while(1)
{
if(zhouqi>60000)
{
zhouqi=0;
DIR=!DIR;
}
if(gaodianpin>60000)
{
gaodianpin=60000;
}
if(gaodianpin<10000)
{
gaodianpin=10000;
}
if((gaodianpin>10000)&&(gaodianpin<60000))
{
PWM=1;
}
else
{
PWM=0;
}
}
}
void Time1(void) interrupt 3
{
TH1 = 0xFF;
TL1 = 0xff; //1us
zhouqi++;
if(DIR==1){gaodianpin++;}
else{gaodianpin--;}
}
作者:
lovexulu
时间:
2020-2-19 19:36
#include<reg52.h>
#define uint unsigned int
#define led1 P1//P1口全接发光管,验证程序请自行修改
/**********占空比太小会熄灭,故一开始有3.3%,最大占空比也看不出变化了,故最大为80%**********/
void delay (uint yc) //延迟函数,定时器中断更好,这里就偷懒了
{
uint i,j;
for (i=yc;i>0;i--)
for (j=10;j>0;j--);
}
void main()
{
uint i=5,n=0; //此处初始化i不得小于最小占空比
while(1)
{
if(i==120) //调节最大占空比
n=1;
if(i==4) //最小占空比
n=0;
led1=0x00;//此处自行修改
delay(i);
led1=0xff;//此处自行修改
delay(150-i);//半周期时间
if(n==0)
i++;
if(n==1)
i--;
}
}
呼吸灯,建议楼主仔细理解一下PWM的含义,简单说PWM是固定时间长度的周期内,高低电平占时间比的变化量。
作者:
xuyaqi
时间:
2020-2-19 21:17
我这个程序只是仿真了一下没在开发板上试,因此要想效果好得在理解的基础上修改程序。
P0那部分那是我为了调试仿真临时加的,删了并不影响PWM运行。
是不是1us我没有测,这和定时器设置有关,总之周期是60000个定时周期。
if(gaodianpin>60000){gaodianpin=60000;}//怕意外加的限制,具体高电平数在中断里根据DIR ++,--。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1