微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 呼吸灯DA程序疑惑

呼吸灯DA程序疑惑

时间:10-02 整理:3721RD 点击:
想做一个两秒为周期的呼吸灯,一秒内越来越亮 ,第二秒内越来越暗。
可是按我写的程序变成一点的一点变亮 , 最后保持不变 ,求各位大神帮帮忙解答一下。
我的思路是计时器为1us ,里面有两个标记pwmt和tt,
当pwmt=1000的时候, 输出的value+1或者-1 ,

然后当value=1000时,刚好经过了1000个pwm周期 ,也就是1000*1000*1us =1s,这样也就刚好在1s内value由0到最大,输出应该由最暗到最亮,反之也一样。

在每个pwm周期内tt小于value的时候输出等于1 ,tt大于value的时候输出等于0,这样也就做到了占空比逐渐增加或减小的pwm波形。
#include<reg52.h>
#define uint unsigned int
sbit DA=P2^1;
uint PWMT,tt,value;
void init()//初始化计数器T0
{
TMOD=0x01;
TH0=(65536-1)/256;
TL0=(65536-1)%256;
EA=1;
ET0=1;
TR0=1;
}
void temer0() interrupt 1
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
PWMT++;
tt++;
}
void main()
{
uint sign;//标记,当sign=1时value递增,sign=0时value递减
init();
while(1)
{
if(PWMT>1000)//每过一个PWM周期,也就是1000*1us=1ms,value加一或减一
{
PWMT=0;
if(sign==1)
value++;
if(sign==0)
value--;
}
if(value==1000)//value=1000说明经过了1000个pwm周期 也就是1000*1ms=1s
sign=0;
if(value==0)
sign=1;
if(tt>1000)//value最大1000,所以tt不能大于1000
tt=0;
if(tt<value)
DA=1;
else
DA=0;
}
}
根据我的理解这程序应该可以实现预计的功能 ,可实际下载到单片机里后完全不对 。希望大神们帮帮忙

你的PWM部分,频率改变上好像不问题。

没发完呀

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top