找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2862|回复: 4
收起左侧

自己研究的基于8952单片机的pwm控制的呼吸灯

[复制链接]
ID:388135 发表于 2018-8-23 20:03 | 显示全部楼层 |阅读模式
unsigned char PWM_COUNT; //计数
unsigned int HUXI_COUNT;    //占空比更新时间
unsigned char PWM_VLAUE;    //占空比比对值
bit direc_flag;             //占空比更新方向

void timer0_init()
{
    TMOD=0x02;          //模式设置,00010000,定时器0,工作于模式2(M1=1,M0=0)
    TH0=0x47;               //定时器溢出值设置,每隔200us发起一次中断。
    TL0=0X47;
    TR0=1;                  //定时器0开始计时
    ET0=1;                  //开定时器0中断
    EA=1;                       //开总中断
    PWM_COUNT =0;
}
void time0() interrupt 1
{   
    PWM_COUNT++;
    HUXI_COUNT++;
    if(PWM_COUNT == PWM_VLAUE)      //判断是否到了点亮LED的时候
        LED = 1;                    //点亮LED
    if(PWM_COUNT == 10)             //当前周期结束
    {
        LED = 0;                    //熄灭LED
        PWM_COUNT = 0;              //重新计时
    }
    if((HUXI_COUNT == 600) && (direc_flag == 0))
    {                               //占空比增加10%
        HUXI_COUNT = 0;
        PWM_VLAUE++;
        if(PWM_VLAUE == 9)          //占空比更改方向
            direc_flag = 1;
    }
    if((HUXI_COUNT == 600) && (direc_flag == 1))
    {                               //占空比减少10%
        HUXI_COUNT = 0;
        PWM_VLAUE--;
        if(PWM_VLAUE == 1)          //占空比更改方向
            direc_flag = 0;
    }   
}
void main()
{
    HUXI_COUNT = 0;
    PWM_COUNT = 0;
    PWM_VLAUE = 5;
    direc_flag = 0;
    LED = 1;            //默认LED熄灭   
    timer0_init();      //定时器0初始化
    while(1);

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:130716 发表于 2018-8-24 22:05 | 显示全部楼层
你好, 我是新手, 我仔细看了你的程序,但是我没有搞清楚你这个程序最后表达的功能是什么?也就是说这个呼吸灯是多长时间熄灭,多长时间发亮这个我看不出来呀?
回复

使用道具 举报

ID:227603 发表于 2018-8-29 12:23 | 显示全部楼层
程序初始化打开中断后入死循环。
   中断开始,中断程序中前两个if语句判断计数(PWM_COUNT)是否等于占空比比对值(PWM_VLAUE),若等于LED亮(PWM高电平)。若计数(PWM_COUNT)等于10,LED灭(PWM低电平)。由于初始占空比比对值(PWM_VLAUE) = 5,所以开始时每中断5次LED输出状态改变一次,占空比5:5。(周期10*200us)
   后两个if语句判断中断次数也就是占空比更新时(HUXI_COUNT)和占空比更新方向(direc_flag是越来越亮还是越来越暗)。当中断次数达到600次(时间600*20us)direc_flag=0,占空比比对值(PWM_VLAUE)+1,经过前两个if语句,占空比变为4:6,依次类推直至1:9,由if(PWM_VLAUE == 9) 将占空比更新方向(direc_flag)变为1。当中断次数(HUXI_COUNT)再次等于600因为(direc_flag)为1,占空比比对值(PWM_VLAUE)开始-1,占空比由1:9变为2:8,依次类推直至9:1,占空比更新方向(direc_flag)变为0,完成一次明暗交替,并进入下次循环。

以上纯属个人见解,说错还请见谅,勿喷.....
回复

使用道具 举报

ID:390552 发表于 2018-8-29 14:37 | 显示全部楼层
建议楼主中断子函数中不要放大段程序,可能会发生意想不到的BUG
回复

使用道具 举报

ID:461428 发表于 2019-1-5 23:20 来自手机 | 显示全部楼层
if((HUXI_COUNT == 600) && (direc_flag == 0)这句占空比咋就变了呢?咋实现的。。逻辑与怎么10%?不明白
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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