OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3573|回复: 3

呼吸灯问题,请教下大神,已经折腾很久了

[复制链接]

22

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2019-3-1
在线时间
43 小时
发表于 2019-6-2 09:18:50 | 显示全部楼层 |阅读模式
开发需求是:
1. 刚开始LED1和LED2均灭
2.  LED1渐亮渐灭一次,然后LED1灭。
3.  LED2渐亮渐灭一次,然后LED2灭。
    就这样一直循环




我写的代码为何实现不了,求大神解答,折腾很久了




#include "reg51.h"                        


sbit LED1=P2^0;
sbit LED2=P2^1;




unsigned char cycle=0;
unsigned int step=1;
unsigned int bright=0;




unsigned char cycle2=0;
unsigned int step2;
unsigned int bright2=0;






void test1(void);
void test2(void);
void delay(unsigned int time_i);








void main()
{






  while(1)
  {




    test1();        




    test2();                  




}


}


void test1(void)
{




  if(++cycle >250)
                  {
                  cycle = 0;
                                   
                                   switch (step)
                                   {
                                   case 1 :
                                                bright++;
                                                if(bright > 250)
                                                {
                                                step ++;
                                                }break;
                                                
                                        case 2 :
                                                bright--;
                                                if(bright < 1)
                                                {
                                                step2 = 1;
                                       
                                                }break;


                                   }
                  }


                if(cycle < bright)
                                {
                                        LED1=0;        //灯亮
                                
                                }
                else
                                {
                                        LED1=1;        // 灯灭
                                
                                }
















}




void test2(void)
{


if(++cycle2 >250)
                  {
                  cycle2 = 0;
                                   
                                   switch (step2)
                                   {
                                   case 1 :
                                                bright2++;
                                                if(bright2 > 250)
                                                {
                                                step2 ++;
                                                }break;
                                                
                                        case 2 :
                                                bright2--;
                                                if(bright2 < 1)
                                                {
                                                step = 1;
                                                }break;


                                   }
                  }


                if(cycle2 < bright2)
                                {
                                        LED2=0;        //灯亮
                                
                                }
                else
                                {
                                        LED2=1;        //
                                       
                                }
















}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2019-4-24
在线时间
78 小时
发表于 2019-6-2 19:21:10 | 显示全部楼层
    test1();  ,   test2(); 这两个函数中没有一个循环结构,都是执行一下就退出,在 while(1)   {          test1();                 test2();                        }中,这两个函数执行一步就进退出再进入下一个。你可以让一个灯呼吸再两个,你参考#include < reg51.h >
#include < intrins.h >

sbit  K1 =P3^0 ;                    //增加键
sbit  K2 =P3^1 ;                    //减少键
sbit  BEEP =P3^5 ;                //蜂鸣器
unsigned char PWM=0x7f ;   //赋初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{  

    P0=0xff;
    TMOD=0x21 ;
    TH0=0xfc ;             //1ms延时常数 12M
    TL0=0x18 ;            //频率调节

    TH1=PWM ;            //脉宽调节
    TL1=0 ;

     EA=1;
     ET0=1;
     ET1=1;
   
     TR0=1 ;

   while(1)
   {
     do{
          if(PWM!=0xff)
           {
                                PWM++ ;
                                delayms(10);
                        }
           else
                        Beep() ;
        }
     while(K1==0);
     do{
           if(PWM!=0x01)
          {
                                PWM-- ;
                                delayms(10);
                  }
           else
                        Beep() ;
        }while(K2==0);
   }
}

/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1
{  
    TR1=0 ;
    TH0=0xfc ;
    TL0=0x66 ;
    TH1=PWM ;
    TR1=1 ;
    P0=0x00 ;      //启动输出
}

/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
    TR1=0 ;
    P0=0xff ;     //结束输出
}

/*********************************************************/
//蜂鸣器子程序
/*********************************************************/

void Beep()     
  {
      unsigned char i  ;
      for (i=0; i<100; i++)
        {
          delay(100)  ;
          BEEP=!BEEP  ;                //Beep取反
        }
     BEEP=1  ;                            //关闭蜂鸣器
     delayms(100);
  }

/*********************************************************/
// 延时子程序
/*********************************************************/  
void delay(unsigned char t)
{
    while(t--)   ;
}

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)

{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0; i < 120; i++) ;
     }
}
回复 支持 反对

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-6-3 09:07:11 | 显示全部楼层
LED控制引脚要用PWM波控制亮灭,不能用直接设置输出高低电平来控制。
回复 支持 反对

使用道具 举报

2

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2019-4-24
在线时间
78 小时
发表于 2019-6-3 11:31:04 | 显示全部楼层
HXYDJ 发表于 2019-6-3 09:07
LED控制引脚要用PWM波控制亮灭,不能用直接设置输出高低电平来控制。

用51普通IO输出高低电平,模拟PWM,89C51没有PWM只能模拟。目前STC增强型单片机有PWM外设不需要模拟。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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