找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1836|回复: 18
打印 上一主题 下一主题
收起左侧

请大神们赐教单片机键控LED程序思路 谢谢

[复制链接]
跳转到指定楼层
楼主
ID:202586 发表于 2021-4-18 20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现,谢谢大家

大神们请教你们,我想用1个开关(K1,)控制两个IO口(LED1,LED2),假如K1合闭为低电平,延时2秒钟后LED1和LED2点亮,5秒钟后LED1熄灭,LED2还亮着,2分钟后LED1又亮起来,5秒钟后LED1,LED2都熄灭,不管任何时候K1断开为高电平时LED1,LED2都熄灭,一直循环,用的STC15F104W单片机,多时段的程序还不会弄,请大神们多多指教谢谢。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:894154 发表于 2021-4-19 08:20 | 只看该作者
用Switch就很好理解了
switch(key)
  {
      case 0:if(mscount)   break;
      case 1:LED1=0;LED2=0;break;
      default:break;
  }

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:592807 发表于 2021-4-19 10:25 | 只看该作者
哪来的的多时段?5秒一次中断,中断一次全局变量flag_5S+=1,,flag_5S==1时LED1灭和flag_5S==60时flag_5S=0;LED1亮。数羊只会数1-5,有20只羊,那你分成4组不就行了,每组5只。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:77840 发表于 2021-4-19 13:11 | 只看该作者
你可以参考用定时器典型用法来设置好时间基数,比如设置定时器10ms溢出一次,那溢出标志TF0(或TF1)就作为if语句判断条件来执行变量计数,变量计数达到100次就是1秒,再以此作为条件来执行IO输出的亮灭。你可以自己去计算需要的计数值,以获取具体的执行效果。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:326430 发表于 2021-4-19 13:16 | 只看该作者
楼上说的对,做个时间片就行了。
回复

使用道具 举报

6#
ID:587810 发表于 2021-4-19 13:27 | 只看该作者
你可以设计固定时间中断一次,在中断程序中用一个int变量来记录时间,每中断一次记录一次,然后再用if-else指令或者switch-Case做判断,来执行led的亮灭顺序就好。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:202586 发表于 2021-4-23 20:17 | 只看该作者
好的。谢谢大家的帮助,谢谢
回复

使用道具 举报

8#
ID:911048 发表于 2021-4-23 21:29 | 只看该作者
可以用两个if,一个判断低电平,一个判断高电平。对应实现功能的程序写if里。
回复

使用道具 举报

9#
ID:911048 发表于 2021-4-23 21:32 | 只看该作者
可以用中断来实现,把你想要实现功能的写在中断程序里
回复

使用道具 举报

10#
ID:202586 发表于 2021-4-26 17:22 | 只看该作者
        if(k1)       
                                {
                               
                               
                                        LED1=0;//关闭
                                         LED2=0;//关闭       
                                       
                                        CNT_TIMER1++;
                                        if(CNT_TIMER1>40)        //计时2S
                                        {
                                       
                                                LED1=1;        //打开
                                                 LED2=1;        //打开
                                                
                               
                                        }
                                }
                                else       
                                {
                                      CNT_TIMER2++;
                                        if(CNT_TIMER2>100)        //计时大于5S
                                        {  
                                       
                                                {
                                       
                                                LED1=1;        //打开
                                                LED2=0;//关闭
                                                                                                                                                                                
                               
                                                 }

                       

                                        }
                                        else
                                        {           
                                                       
                                                CNT_TIMER3++;
                                                if(CNT_TIMER3>2400)//计时2分钟
                                        {       
                                                LED1=1;        //打开
                                                LED2=1;        //打开
                                                 }
                                  else
                                        {           
                                                       
                                                CNT_TIMER4++;
                                                if(CNT_TIMER4>100)//计时5S
                                        {       
                                                LED1=0;        //关闭
                                                LED2=0;        //关闭
                                     }



                                        }          
                       
                                }                                

                        }
回复

使用道具 举报

11#
ID:202586 发表于 2021-4-26 17:25 | 只看该作者
这样不行,2分多钟后不能停下来,请老师们帮我看下谢谢
回复

使用道具 举报

12#
ID:202586 发表于 2021-4-26 17:28 | 只看该作者
(K1,)控制两个IO口(LED1,LED2),假如K1合闭为低电平,延时2秒钟后LED1和LED2点亮,5秒钟后LED1熄灭,LED2还亮着,2分钟后LED1又亮起来,5秒钟后LED1,LED2都熄灭,等待下一次开关断开后再合闭,不管任何时候K1断开为高电平时LED1,LED2都熄灭,一直循环,用的STC15F104W单片机,还不会弄,请大神们多多指教谢谢。
回复

使用道具 举报

13#
ID:592807 发表于 2021-4-26 18:16 | 只看该作者
学徒工--静 发表于 2021-4-26 17:28
(K1,)控制两个IO口(LED1,LED2),假如K1合闭为低电平,延时2秒钟后LED1和LED2点亮,5秒钟后LED1熄灭,LED2 ...

你要么在亮灭一定次数后吧定时器关掉,要么就该标志位
回复

使用道具 举报

14#
ID:202586 发表于 2021-4-27 07:30 | 只看该作者
老师怎么弄,我不知道啊,请帮帮我谢谢
回复

使用道具 举报

15#
ID:592807 发表于 2021-4-27 08:41 | 只看该作者
学徒工--静 发表于 2021-4-27 07:30
老师怎么弄,我不知道啊,请帮帮我谢谢

程序规范一下,问题一下子就出来了。
     if(k1)      
        {                       
           LED1=0;//关闭
           LED2=0;//关闭      
           CNT_TIMER1++;
           if(CNT_TIMER1>40)        //计时2S
               {
                  LED1=1;        //打开
                 LED2=1;        //打开
                }
           }
    /*上面部分,K1闭合状态下有效,LED1,LED2关闭,2秒后LED1,LED2打开,
         但是CNT_TIMER1一直保持大于40的记录,
         因此每次进入中断必然经历LED1 LED2先关闭再开启过程,太快了,可能肉眼不可见
*/
     else      
     {
       CNT_TIMER2++;
        if(CNT_TIMER2>100)        //计时大于5S
           {  
               {
                   LED1=1;        //打开
                   LED2=0;//关闭
                }
             }
             else
               {           
                  CNT_TIMER3++;
/*我不知道这是谁教你写的,这么多循环嵌套,思路是怎么来的。
  当开关K1==0时候,CNT_TIMER2+=1;但是当CNT_TIMER2小于或者等于200时,CNT_TIMER3+=1。
  也就是说在 CNT_TIMER2 小于或者等于200的前提下CNT_TIMER2 = CNT_TIMER3.
问一下,当CNT_TIMER2大于200的时候,CNT_TIMER3呢?
*/
                     if(CNT_TIMER3>2400)//计时2分钟
                        {      
                           LED1=1;        //打开
                           LED2=1;        //打开
                          }
                         else
                           {           
                                 CNT_TIMER4++;
                                 if(CNT_TIMER4>100)//计时5S
                                   {      
                                       LED1=0;        //关闭
                                       LED2=0;        //关闭
                                     }
                                 }         
      }                                

                        


回复

使用道具 举报

16#
ID:89515 发表于 2021-4-27 09:22 来自手机 | 只看该作者
按你的逻辑,你得一直按着按键2分多钟!!!这是干嘛呢?
回复

使用道具 举报

17#
ID:89515 发表于 2021-4-27 09:40 来自手机 | 只看该作者
是开关呢!那直接用一个时间变量就行了,每次清零。if:开关闭合的所有功能else:开关开启的功能。但是必须分状态,不然对开关打开检测会有延时。
回复

使用道具 举报

18#
ID:202586 发表于 2021-5-14 07:55 来自手机 | 只看该作者
mengzhixinheng 发表于 2021-4-27 09:40
是开关呢!那直接用一个时间变量就行了,每次清零。if:开关闭合的所有功能else:开关开启的功能。但是必须 ...

谢谢您老师,我想用
(K1,)控制两个灯(LED1,LED2),假如K1合闭为低电平,2秒钟后LED1和LED2都点亮,过5秒钟后LED1熄灭,LED2还亮着,过2分钟后LED1又亮起来,再过5秒钟后LED1,LED2都熄灭,一直等待K1断开,如果K1三分钟还没断开的话,我想用LED1和LED2闪烁报警,不管任何时候如果K1断开为高电平时直接熄灭LED1和LED2,等待下一次K1合闭执行以上的动作,
问题就出在这里我不知道它要怎么写,前面的是开关K1关闭时有二种状态,我的意思第一种状态就是过了132秒后,即使K1开关还是关闭的状态也要LED1和LED2全部熄灭;
第二种状态就是180秒后如果K1开关还是关闭状态的话,就让LED1和LED2以1秒一次的闪烁报警。
不管任何时候如果K1断开了就直接熄灭LED和1LED2。等待着开关K1的下次合闭,不知道这样会不会冲突,能不能帮我写个学习一下谢谢
回复

使用道具 举报

19#
ID:213173 发表于 2021-5-14 14:57 | 只看该作者
学徒工--静 发表于 2021-4-26 17:28
(K1,)控制两个IO口(LED1,LED2),假如K1合闭为低电平,延时2秒钟后LED1和LED2点亮,5秒钟后LED1熄灭,LED2 ...

这是非常简单的逻辑控制,给你写一个示例,你试试。IO口可以根据实际需要重新定义,最好避开P3.0和P3.1,以免影响下载程序。

  1. #include <STC15F2K60S2.H>//头文件适用STC15F104W
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit key =P3^2;
  5. sbit LED1=P3^3;
  6. sbit LED2=P3^4;

  7. bit sign=0,flag=0;
  8. uchar sec,num;

  9. //ms延时子函数(11.0592MHz 1T单片机)
  10. void delay(uint k)
  11. {
  12.         uint i,j;
  13.         for(i=k;i>0;i--)
  14.                 for(j=829;j>0;j--);
  15. }
  16. //启动开关函数
  17. void switch_scan()
  18. {
  19.         if(!key)
  20.         {
  21.                 delay(10);
  22.                 if(!key && !sign)
  23.                 {
  24.                         sign=1;
  25.                         flag=1;
  26.                 }
  27.         }
  28.         else
  29.         {
  30.                 sign=0;
  31.                 flag=0;
  32.         }
  33. }

  34. void Timer0Init()        //50毫秒@11.0592MHz
  35. {
  36.         TMOD= 0x01;                //设置定时器模式
  37.         TL0 = 0x00;                //设置定时初值
  38.         TH0 = 0x4C;                //设置定时初值
  39.         TR0 = 1;                        //定时器0开始计时
  40.         EA  = 1;                        //开总中断
  41.         ET0 = 1;                        //开T0中断
  42. }

  43. void main()
  44. {
  45.         Timer0Init();
  46.         while(1)
  47.         {
  48.                 switch_scan();
  49.                 if(flag)
  50.                 {
  51.                         if(sec>=2&&sec<7)//延时2秒钟后LED1和LED2点亮5秒钟
  52.                         {
  53.                                 LED1=0;
  54.                                 LED2=0;
  55.                         }
  56.                         else if(sec>=7&&sec<127)//5秒钟后LED1熄灭,LED2还亮着2分钟
  57.                         {
  58.                                 LED1=1;
  59.                         }
  60.                         else if(sec>=127&&sec<132)//2分钟后LED1又亮起来5秒钟
  61.                         {
  62.                                 LED1=0;
  63.                         }
  64.                         else if(sec>=132)//5秒钟后LED1,LED2都熄灭
  65.                         {
  66.                                 LED1=1;
  67.                                 LED2=1;
  68.                                 flag=0;
  69.                         }
  70.                 }
  71.                 else //全部复位
  72.                 {
  73.                         LED1=1;
  74.                         LED2=1;
  75.                         sec=0;
  76.                         num=0;
  77.                 }
  78.         }
  79. }

  80. void timer0_isr()interrupt 1
  81. {
  82.         TL0 = 0x00;                //设置定时初值
  83.         TH0 = 0x4C;                //设置定时初值
  84.         if(flag)
  85.         {
  86.                 if(++num>=20)
  87.                 {
  88.                         num=0;
  89.                         sec++;                       
  90.                 }
  91.         }
  92. }

复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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