找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1132|回复: 6
收起左侧

单片机堆塔跑马灯程序框架已完成,想要任意定时时间没有思路

[复制链接]
ID:1005692 发表于 2022-6-13 19:14 | 显示全部楼层 |阅读模式
堆塔代码框架完成可以正常跑,但只能调推塔速度和流水速度,这款单片机没有ADC,没法根据电量堆塔跑马灯,定时器有2个,充电模拟ADC 堆塔跑马灯 我想任意定时时间 比如说2分钟,8分钟,16分钟 如果用我这个框架可以用什么方式去实现?求大佬指点谢谢!

单片机源程序如下:
  1. bit    _1ms_flag;
  2. unint  led_run_stage_time_count_1;
  3. unint  led_run_stage_time_count_2;

  4. unchar led_run_stage;

  5. unint  led_switch_time_count;     //闪灯频率
  6. unchar led_switch_stage;
  7. /*----------------------------------------
  8. D1=LED1 D2=LED2 D3=LED3 D4=LED4
  9. 为0时 LED点亮 为1时 LED关闭
  10. --------------------------------------------*/
  11. void ParamInitFunc(void)   // 充电参数初始化
  12. {
  13.   _1ms_flag = 0;
  14.   led_time8=0;
  15.   led_run_stage_time_count_1 = 0;
  16.   led_run_stage_time_count_2 = 0;

  17.   led_run_stage         = 0;
  18.   led_switch_time_count = 0;
  19.   led_switch_stage      = 0;
  20. }

  21. void LED_WorkFunc(void)
  22. {
  23.   if( _1ms_flag )     //定时器0 中断函数定时1ms   置1
  24.   {
  25.     _1ms_flag = 0;
  26.         
  27.         led_run_stage_time_count_1++;      //每毫秒 +1   
  28.         if( led_run_stage_time_count_1 >= 60000 )      // 定时1分钟
  29.         {
  30.           led_run_stage_time_count_1 = 0;
  31.           led_run_stage_time_count_2++;         // 每分钟+1

  32.           if( led_run_stage_time_count_2 >= 2 )    // 定时2分钟   
  33.           {
  34.             led_run_stage_time_count_2 = 0;
  35.          
  36.         
  37.         if( led_run_stage < 3 )
  38.                 {
  39.                   led_switch_stage = 0;
  40.                 }
  41.         
  42.                  led_run_stage++;                           //  每2分钟+1
  43.                 if( led_run_stage >= 3 )        //初始为0,第2分钟为1,第4分钟为2,第6分钟为3
  44.                 {
  45.                   led_run_stage = 3;
  46.                 }
  47.           }
  48.    
  49.         }
  50.         
  51.         led_switch_time_count++;
  52.         if( led_switch_time_count >= 400 )   //闪灯频率 400ms进入一次
  53.         {
  54.           led_switch_time_count = 0;
  55.           switch( led_run_stage )     
  56.           {
  57.             case 0:                               //初始为0  led_run_stage =0
  58.                   led_switch_stage++;
  59.                   if( led_switch_stage > 3 )               // switch 0-1-2-3
  60.                   {
  61.                     led_switch_stage = 0;
  62.                   }
  63.                 break;
  64.                
  65.                 case 1:
  66.                   led_switch_stage++;             //2分钟后 led_run_stage =1
  67.                   if( led_switch_stage > 2 )      // switch 0-1-2
  68.                   {
  69.                     led_switch_stage = 0;
  70.                   }
  71.                 break;
  72.                
  73.                 case 2:
  74.                   led_switch_stage++;          //4分钟后 led_run_stage =2
  75.                   if( led_switch_stage > 1 )   //switch  0-1
  76.                   {
  77.                     led_switch_stage = 0;
  78.                   }
  79.                 break;
  80.                
  81.                 case 3:
  82.                   led_switch_stage++;        //6分钟后 led_run_stage =3
  83.                   if( led_switch_stage > 1 )      //switch  0-1
  84.                   {
  85.                     led_switch_stage = 0;
  86.                   }
  87.                 break;
  88.           }
  89.         }
  90.         
  91.         switch( led_run_stage )    //根据前面定时时间 赋值 led_run_stage
  92.         {
  93.           case 0:                         //初始为0  led_run_stage =0
  94.             if( led_switch_stage == 0 )    // switch 0-1-2-3
  95.                 {
  96.                   D1 = 0;
  97.                   D2 = 1;
  98.                   D3 = 1;        
  99.                   D4 = 1;
  100.                 }
  101.                 else if( led_switch_stage == 1 )
  102.                 {
  103.                   D1 = 1;
  104.                   D2 = 0;
  105.                   D3 = 1;        
  106.                   D4 = 1;
  107.                 }
  108.                 else if( led_switch_stage == 2 )
  109.                 {
  110.                   D1 = 1;
  111.                   D2 = 1;
  112.                   D3 = 0;        
  113.                   D4 = 1;
  114.                 }
  115.                 else if( led_switch_stage == 3 )
  116.                 {
  117.                   D1 = 1;
  118.                   D2 = 1;
  119.                   D3 = 1;        
  120.                   D4 = 0;
  121.                 }
  122.           break;
  123.          
  124.           case 1:              //2分钟后  led_run_stage =1   
  125.             if( led_switch_stage == 0 )            // switch 0-1-2
  126.                 {
  127.                   D1 = 0;
  128.                   D2 = 0;
  129.                   D3 = 1;        
  130.                   D4 = 1;
  131.                 }
  132.                 else if( led_switch_stage == 1 )
  133.                 {
  134.                   D1 = 0;
  135.                   D2 = 1;
  136.                   D3 = 0;        
  137.                   D4 = 1;
  138.                 }
  139.                 else if( led_switch_stage == 2 )
  140.                 {
  141.                   D1 = 0;
  142.                   D2 = 1;
  143.                   D3 = 1;        
  144.                   D4 = 0;
  145.                 }
  146.           break;
  147.          
  148.           case 2:                             //4分钟后  led_run_stage =2
  149.             if( led_switch_stage == 0 )        // switch 0-1
  150.                 {
  151.                   D1 = 0;
  152.                   D2 = 0;
  153.                   D3 = 0;        
  154.                   D4 = 1;
  155.                 }
  156.                 else if( led_switch_stage == 1 )
  157.                 {
  158.                   D1 = 0;
  159.                   D2 = 0;
  160.                   D3 = 1;        
  161.                   D4 = 0;
  162.                 }
  163.           break;
  164.          
  165.           case 3:                          //6分钟后  led_run_stage =3
  166.             if( led_switch_stage == 0 )         // switch 0-1
  167.                 {
  168.                   D1 = 0;
  169.                   D2 = 0;
  170.                   D3 = 0;        
  171.                   D4 = 0;
  172.                 }
  173.                 else if( led_switch_stage == 1 )
  174.                 {
  175.                   D1 = 0;
  176.                   D2 = 0;
  177.                   D3 = 0;        
  178.                   D4 = 1;
  179.                 }
  180.           break;
  181.         }
  182.   }
  183. }

  184. void mian()
  185. {
  186.     ParamInitFunc();            //充电参数初始化
  187. POWER_INITIAL();        //系统初始化
  188.     PWM1_INITIAL();       //初始化PWM
  189.     TIMER0_INITIAL();    //初始化定时器0
  190.      GIE = 1;                  //开中断
  191.      T0IE = 1;               //打开定时器0
  192.     while(1)
  193.     {
  194.         MCLRWDT();                  //清看门狗
  195.          if(CH) //接充电口 高电平
  196.          {
  197.                     if(!MM)// 充电中
  198.                         {

  199.                                 LED_WorkFunc();

  200.                         }
  201.                         else // 充满电
  202.                         {
  203.                                    D1=0;
  204.                                    D2=0;
  205.                                    D3=0;
  206.                                    D4=0;
  207.                         }
  208.             
  209.          }   
  210.          else   //充电 拔除
  211.          {
  212.                                 D1=1;
  213.                                 D2=1;
  214.                                 D3=1;
  215.                                 D4=1;
  216.          }
  217.             
  218.     }

  219. }
复制代码

回复

使用道具 举报

ID:609524 发表于 2022-6-13 21:07 | 显示全部楼层
通过按键改变定时的时间
回复

使用道具 举报

ID:99525 发表于 2022-6-13 23:18 | 显示全部楼层
加按键进行调节或者用串口命令调节
回复

使用道具 举报

ID:1005692 发表于 2022-6-14 09:50 | 显示全部楼层
雪玉寐影 发表于 2022-6-13 23:18
加按键进行调节或者用串口命令调节

我这个功能是模拟充电....没有其他多余动作的
回复

使用道具 举报

ID:161164 发表于 2022-6-14 11:35 | 显示全部楼层
辉芒微 发表于 2022-6-14 09:50
我这个功能是模拟充电....没有其他多余动作的

"任意定时时间 比如说2分钟,8分钟,16分钟"
你这时间是什么?
是led_run_stage_time_count_2的比较值
还是led_run_stage从0到3走一次的时间?
回复

使用道具 举报

ID:1005692 发表于 2022-6-14 15:33 | 显示全部楼层
lkc8210 发表于 2022-6-14 11:35
"任意定时时间 比如说2分钟,8分钟,16分钟"
你这时间是什么?
是led_run_stage_time_count_2的比较值
...

跑 led_run_stage从0到3  的时间
回复

使用道具 举报

ID:213173 发表于 2022-6-14 21:43 | 显示全部楼层
辉芒微 发表于 2022-6-14 09:50
我这个功能是模拟充电....没有其他多余动作的

用时间模拟ADC结果控制进度条。给你一个程序构架,变量按需自行调整。
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char       

  4. uchar code table[]={0xff,0xfe,0xfc,0xf8,0xf0};

  5. uchar num,min;
  6. bit flag;

  7. void InitTimer0(void)//50毫秒@12.000MHz
  8. {
  9.     TMOD = 0x01;
  10.     TH0 = 0x3C;
  11.     TL0 = 0xB0;
  12.     EA = 1;
  13.     ET0 = 1;
  14.     TR0 = 1;
  15. }

  16. void main(void)
  17. {
  18.         uchar i=0,j;
  19.         InitTimer0();
  20.         while(1)
  21.         {
  22.                 if(flag)//周期250ms       
  23.                 {
  24.                         flag=0;
  25.                         if(min<2)      {P1=table[i];j=0;}
  26.                         else if(min<4) {P1=table[i];j=1;}
  27.                         else if(min<6) {P1=table[i];j=2;}
  28.                         else if(min<8) {P1=table[i];j=3;}
  29.                         else if(min>=8){P1=table[i];j=4;}
  30.                         i++;
  31.                         if(i>4)i=j;
  32.                 }
  33.         }
  34. }

  35. void Timer0Interrupt(void) interrupt 1
  36. {
  37.         static char        i;
  38.         TH0 = 0x3C;
  39.         TL0 = 0xB0;
  40.         i++;
  41.         if(i>=5)//250ms
  42.         {
  43.                 i=0;
  44.                 flag=1;
  45.                 if(++num>=240)//分钟
  46.                 {
  47.                         num=0;
  48.                         if(min<8)
  49.                                 min++;
  50.                 }
  51.         }
  52. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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