找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

单片机程序模拟输出PWM 质疑?

[复制链接]
admin 发表于 2012-9-2 11:05:18 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
在下用单片机模拟输出PWM信号控制LED的亮度变化,发现在计算定时器重装初值的时候,两种不同的方式最终的实验效果差异很大,不知为什么?
还请各位多指教!

程序采用定时器出发的方式产生脉冲,两次定时器中断为一个脉冲周期,在两次中断总时间不变的情况下,控制两次中断时间的不同来产生PWM信号。
实验时,下面的程序运行的效果很好,LED的亮度随着 两组初值计算函数void pwm(int w)传入值的怎大而变亮,但是当我使用下面程序中被我注释掉的函数来计算重转初值的时候,LED却闪烁的非常明显,没有产生预计的亮度变化。两种初值计算方式控制下的定时器两次中断的总时间是一样的,也就是说PWM的平率是一样的,但是为什么后者却达不到预计的效果。
请各位指教一下。

#include<reg52.h>
#define uchar unsigned char
uchar th_0,tl_0,th_02,tl_02,i;
sbit out=P1^0;

void init(void)
{
TMOD=0x01;
TH0=0;
TL0=0;
EA=1;
ET0=1;
TR0=1;
th_0=tl_0=0;
i=1;
}

void timer0() interrupt 1
{
if(i)
{
out=1;
TH0=th_0;
TL0=tl_0;
}
else
{
out=0;
TH0=th_02;
TL0=tl_02;
}
i=!i;
}

void pwm(int w)
{
int m;
m=65536-w;
th_0=m/256;
tl_0=m%256;
m=65536-(500-w);
th_02=m/256;
tl_02=m%256;
}

/*
void pwm(uchar w)
{
int m;
m=65536-w;
th_0=w/256;
tl_0=w%256;
m=65536-(500-w);
th_02=m/256;
tl_02=m%256;
} */

void delay(int t)
{
uchar x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}

void main(void)
{
int j;
j=1;
init();
while(1)
{
pwm(j);
delay(3000);
j+=10;
if(j>499) j=0;
}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 20:48 , Processed in 0.055251 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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