找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 970|回复: 3
收起左侧

请教下单片机堆塔跑马灯代码异常问题

[复制链接]
ID:1005692 发表于 2022-6-9 17:35 | 显示全部楼层 |阅读模式
遇到个项目  国产8位单片机没AD  充电LED显示这里卡住了 共有4颗LED 分别 LED1、LED2、LED3、LED4  //D1  D2  D3  D4
堆塔跑马灯 4颗灯跑马灯,定时一段时间 LED1灯常亮其余跑马灯 后续定时一段时间 依次类推 到最后一颗LED4闪烁,满电灯全亮。 我写了的这个在while里面有问题,定时函数里面写的标志位 没作用
代码进到跑马灯void ledpmd()里面第一个if,后面else if 跑不起来 求大佬指教一下

void  ledpmd(void)
{   
        if(cm_ledfag==1)   // 充电开启 前2分钟流水跑马灯
        {
             if(cn1s)
            {
                time1s++;
                cn1s=0;
            }
            if(time1s>40)  //定时1s
            {
                time1s=0;
               
                if(ledcn++>4)

                ledcn=0;

                    switch(ledcn)
                    {
                        case 0:     
                                    D1=1;
                                    D2=1;
                                    D3=1;        
                                    D4=1;
                        break;

                        case 1:                                            
                                     D1=0;                                                                     
                        break;

                        case 2:
                                     D2=0;                                                                                                                              
                        break;

                        case 3:            
                                     D3=0;                                                                                                         
                        break;

                        case 4:            
                                     D4=0;                                                                                                         
                        break;        

                        default:


                        break;

                    }  //switch
                }   
            }  //  
   
        else if(led_state==2)  // 定时2分钟标志位  LED1常亮 LED2-LED4流水跑马灯
        {
            if(cn1s)
            {
                time1s++;
                cn1s=0;
            }
            if(time1s>40)   //定时1s
            {
                time1s=0;
                              
                    if(ledcn++>4)
                                
                        ledcn=0;
                                                
                    switch(ledcn)
                    {
                        case 0:     
                             D1=0;
                             D2=1;
                             D3=1;        
                             D4=1;
                        break;

                        case 1:                                            
                              D1=0;                                                                     
                        break;

                        case 2:
                              D2=0;                                                                                                                              
                        break;

                        case 3:            
                              D3=0;                                                                                                         
                        break;

                        case 4:            
                              D4=0;                                                                                                         
                        break;        

                        default:
                                                  

                        break;

                    }  //switch
                                             
              }   
           }  //  2分钟
   
        else if(led_state==3)   // 定时20分钟标志位  LED1-LED2常亮 LED3-LED4流水跑马灯
        {
            if(cn1s)
            {
                time1s++;
                cn1s=0;
            }
            if(time1s>40)  //定时1s
            {
                time1s=0;
                       
                    if(ledcn++>4)
                                
                        ledcn=0;
                                                
                    switch(ledcn)
                    {
                        case 0:     
                             D1=0;
                             D2=0;
                             D3=1;        
                             D4=1;
                        break;

                        case 1:                                            
                              D1=0;                                                                     
                        break;

                        case 2:
                              D2=0;                                                                                                                              
                        break;

                        case 3:            
                              D3=0;                                                                                                         
                        break;

                        case 4:            
                              D4=0;                                                                                                         
                        break;        

                        default:
                                                  

                        break;

                    }  //switch
                                             
              }   
           }        //  20分钟

          else if(led_state==4)    // 定时30分钟标志位  LED1-LED3常亮  LED4闪灯
           {
            if(cn1s)
            {
                time1s++;
                cn1s=0;
            }
            if(time1s>40)  //定时1s
            {
                time1s=0;
                       
                    if(ledcn++>4)
                                
                        ledcn=0;
                                                
                    switch(ledcn)
                    {
                        case 0:     
                             D1=0;
                             D2=0;
                             D3=0;        
                             D4=1;
                        break;

                        case 1:                                            
                              D1=0;                                                                     
                        break;

                        case 2:
                              D2=0;                                                                                                                              
                        break;

                        case 3:            
                              D3=0;                                                                                                         
                        break;

                        case 4:            
                              D4=0;                                                                                                         
                        break;        

                        default:
                                                  

                        break;

                    }  //switch
                                             
              }   
           }
}

void main()
{
    POWER_INITIAL();        //系统初始化
    PWM1_INITIAL();          //初始化T2
    TIMER0_INITIAL();  
     GIE = 1; //开中断
     T0IE = 1;
     
   // LED灯初始化           
        D1=0;     //=1置高  关闭LED   
        D2=0;
        D3=0;
        D4=0;        
        PR2L=0;
        led_state=0;
        ledpmd();
        
     while(1)
     {
         MCLRWDT();          //清看门狗
         
            if(flag2s)  //关闭开机画面
            {
               flag2s=0;
                D1=1;
                D2=1;
                D3=1;   
                D4=1;
            }
          //--------------------------------  
            if(CH) //充电高电平
            {
                MCLRWDT();
                             
            //-------跑马灯入口----------
                    ledpmd();     
            //------------------------------            
                cm_ledfag=1;         //状态位   
        //----------2min------------------   
                if(flag_m1)     // 中断函数里面1分钟 flag_m1 置一次1
                {
                    min2++;
                    flag_m1=0;
                }
                if(min2>1)
                {
                    min2=0;
                    flag_m1=0;
                    cm_ledfag=0;
                    led_state=2;    //状态位                           
                    cn5s=0;
                    flag5s=0;
                }   
       //------------20min-----------------         
                if(flag_m1)
                {
                    min20++;
                    flag_m1=0;
                }
                if(min20>19)
                {
                    min20=0;
                    flag_m1=0;
                    cm_ledfag=0;
                    led_state=3;    //状态位                           
                    cn5s=0;
                    flag5s=0;
                }   
        //--------------30min----------------
                if(flag_m1)
                {
                    min30++;
                    flag_m1=0;
                }
                if(min30>29)
                {
                    min30=0;
                    flag_m1=0;
                    cm_ledfag=0;
                    led_state=4;        //状态位                    
                    cn5s=0;
                    flag5s=0;
                }  
        //-------------------------------------
            }
      
   } //while
      
}  //main


回复

使用道具 举报

ID:301191 发表于 2022-6-10 16:26 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:161164 发表于 2022-6-10 16:50 | 显示全部楼层
你只用一个 flag_m1来判断1分钟
第一个if判断完后就清零
下面的if进不去

而且你把cm_ledfag=1;放在while(1)里
那他就永远等于1了
下面的if当然进不去

  1.      cm_ledfag=1;         //状态位   
  2.      while(1)
  3.      {
  4.          MCLRWDT();          //清看门狗
  5.          
  6.             if(flag2s)  //关闭开机画面
  7.             {
  8.                flag2s=0;
  9.                 D1=1;
  10.                 D2=1;
  11.                 D3=1;   
  12.                 D4=1;
  13.             }
  14.           //--------------------------------  
  15.             if(CH) //充电高电平
  16.             {
  17.                 MCLRWDT();
  18.                              
  19.             //-------跑马灯入口----------
  20.                     ledpmd();     
  21.             //------------------------------            
  22.                 if(flag_m1)     // 中断函数里面1分钟 flag_m1 置一次1
  23.                 {
  24.                     if(minCnt<30)minCnt++;
  25.                     flag_m1=0;
  26.                 }
  27.         //----------2min------------------   
  28.                 if(minCnt==2 && led_state!=2)
  29.                 {
  30.                     cm_ledfag=0;
  31.                     led_state=2;    //状态位                           
  32.                     cn5s=0;
  33.                     flag5s=0;
  34.                 }   
  35.        //------------20min-----------------   
  36.                 if(minCnt==20 && led_state!=3)
  37.                 {
  38.                     cm_ledfag=0;
  39.                     led_state=3;    //状态位                           
  40.                     cn5s=0;
  41.                     flag5s=0;
  42.                 }   
  43.         //--------------30min----------------
  44.                 if(minCnt==30 && led_state!=4)
  45.                 {
  46.                     cm_ledfag=0;
  47.                     led_state=4;        //状态位                    
  48.                     cn5s=0;
  49.                     flag5s=0;
  50.                 }  
  51.         //-------------------------------------
  52.             }
  53.       
  54.    } //while
复制代码



回复

使用道具 举报

ID:609524 发表于 2022-6-11 17:56 | 显示全部楼层
lkc8210 发表于 2022-6-10 16:50
你只用一个 flag_m1来判断1分钟
第一个if判断完后就清零
下面的if进不去

单片机也没比较器吗,如果有的话可以用比较器做,这样效果会好一点
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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