找回密码
 立即注册

QQ登录

只需一步,快速开始

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

有没有学长教个单片机按键流水灯的题

  [复制链接]
跳转到指定楼层
楼主
ID:404823 发表于 2018-10-23 19:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
P3.2 开始,按此键8个流水灯由上而下循环流动; P3.3 停止,按此键led全灭.  P3.4上,按此键led由上而下流动 ;  P3.5下,按此键led由下而上流动;
老师布置的作业,课上听的稀里糊涂的。望大神们教教萌新,细节你们自己可以定,作业的全部内容就是这个
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:157238 发表于 2018-10-23 20:15 | 只看该作者
检测按键,编写亮灯子程序
检测按键的电平变化,当连接按键的引脚发生电位变化时进入子程序执行灯操作。
回复

使用道具 举报

板凳
ID:414277 发表于 2018-10-23 20:53 | 只看该作者
检测按键的状态,然后左移或者右移P0的值,或者让P0的值等于定值,究竟是0x00,还是0xff,要根据你的开发板来定
回复

使用道具 举报

地板
ID:398075 发表于 2018-10-23 21:01 | 只看该作者
这个看你用的LED的情况
回复

使用道具 举报

5#
ID:398075 发表于 2018-10-23 21:02 | 只看该作者
还可以使用中断来进行流水灯的变化
回复

使用道具 举报

6#
ID:244223 发表于 2018-10-23 21:03 | 只看该作者
看原理图做啊,看一下你用的板子的led灯是给什么电平亮,然后在头文件下定义一个标志位flag赋值0(看你这个要求最好定义成int什么的不要bit),在按键中(P32中把flag置为1)(P33置为2)(P34置为3)(P35置为4),然后在主函数中判断flag的值,执行你们老师给你们的要求
回复

使用道具 举报

7#
ID:414305 发表于 2018-10-23 21:28 | 只看该作者
这个应该是最基础的吧
回复

使用道具 举报

8#
ID:414305 发表于 2018-10-23 21:36 | 只看该作者
这个应该是最基础的,P3.2  P3.3  P3.4  P3.5分别使用 if 判断,或者用switch 。单片机要用心学,学好了很有用
回复

使用道具 举报

9#
ID:414328 发表于 2018-10-23 22:04 | 只看该作者
很多教材有这样的例程,你可以多看看。
回复

使用道具 举报

10#
ID:414330 发表于 2018-10-23 22:14 | 只看该作者
这个我会的,你加我私信我qq 1004890607
回复

使用道具 举报

11#
ID:413530 发表于 2018-10-23 23:41 | 只看该作者
需要用到左移右移函数,也可以直接延时函数一个一个灯的编程,按键可以用外部中断来控制或者if函数,按键注意松手检测
回复

使用道具 举报

12#
ID:164602 发表于 2018-10-24 09:12 | 只看该作者
高手们说了这么多,就是没有程序啊,我不是高手,不过这个问题我能解决。
#include<reg51.h>
#include<intrins.h>       

#define GPIO_LED P2

sbit k1=P3^2;
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;

void Delay10ms(unsigned int c);

void main(void)
{
        unsigned int i,n;
        while(1)
        {       
                if(k1==0)
                {
                        Delay10ms(1);
                        if(k1==0)
                        {
                                n=1;
                                GPIO_LED=0xfe;
                                while((i<50)&&(k1==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if(k2==0)
                {
                        Delay10ms(1);
                        if(k2==0)
                        {
                                n=2;
                                GPIO_LED=0xff;
                                while((i<50)&&(k2==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if(k3==0)
                {
                        Delay10ms(1);
                        if(k3==0)
                        {
                                n=3;
                                GPIO_LED=0x7f;
                                while((i<50)&&(k3==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if(k4==0)
                {
                        Delay10ms(1);
                        if(k4==0)
                        {
                                n=4;
                                GPIO_LED=0xff;
                                while((i<50)&&(k3==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if (n==1)
                {
                        GPIO_LED=_crol_(GPIO_LED,1);
                        Delay10ms(50);
                }
                if (n==3)
                {
                        GPIO_LED=_cror_(GPIO_LED,1);
                        Delay10ms(50);
                }
        }               
}

void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

你没有说你的电路是怎么样的,按键我可以按照你说的写(程序调试是我的板子,按键IO口有点不一样,发给你的程序,已经按照你的按键修改了),LED灯就没法照你说的写了(我的板子是P2口)。按键时,动作慢点,就可以达成效果。
回复

使用道具 举报

13#
ID:343796 发表于 2018-10-24 09:34 | 只看该作者
写个灯的亮灭数组,在循环就可以了
回复

使用道具 举报

14#
ID:414476 发表于 2018-10-24 10:14 | 只看该作者
while中循环检测按键电平值
回复

使用道具 举报

15#
ID:412932 发表于 2018-10-24 10:40 | 只看该作者
检测按键的状态,然后左移或者右移P0的值,或者让P0的值等于定值,究竟是0x00,还是0xff,
回复

使用道具 举报

16#
ID:414527 发表于 2018-10-24 11:16 | 只看该作者
就写几个数组就可以了
回复

使用道具 举报

17#
ID:317622 发表于 2018-10-24 11:20 | 只看该作者
检测按键,编写亮灯子程序 检测按键的电平变化,当连接按键的引脚发生电位变化时进入子程序执行灯操作。
回复

使用道具 举报

18#
ID:414530 发表于 2018-10-24 11:23 | 只看该作者
也没说是汇编还是C啊
回复

使用道具 举报

19#
ID:413123 发表于 2018-10-24 11:23 | 只看该作者
先检测P端口状态,编写流水灯,通过左移右移来定值
回复

使用道具 举报

20#
ID:414604 发表于 2018-10-24 14:09 | 只看该作者
利用高低电平
回复

使用道具 举报

21#
ID:241273 发表于 2018-10-24 15:31 | 只看该作者
搜索51单片机教程100例
回复

使用道具 举报

22#
ID:404823 发表于 2018-10-24 17:19 | 只看该作者
感谢各位大佬,已经写好了
回复

使用道具 举报

23#
ID:404823 发表于 2018-10-24 17:20 | 只看该作者
HC6800-ES-V2.0 发表于 2018-10-24 09:12
高手们说了这么多,就是没有程序啊,我不是高手,不过这个问题我能解决。
#include
#include       

非常感谢,还是你最实在0.0
回复

使用道具 举报

24#
ID:404823 发表于 2018-10-24 21:15 | 只看该作者
HC6800-ES-V2.0 发表于 2018-10-24 09:12
高手们说了这么多,就是没有程序啊,我不是高手,不过这个问题我能解决。
#include
#include       

为什么k1==0延时之后还要有有if(k==0),
GPIO_LED=0xfe; 是让led灭还是亮
能解释下这个吗? 为什么i要<50
while((i<50)&&(k1==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
为什么灭灯键k2要有延时,不能直接全灭吗?
回复

使用道具 举报

25#
ID:164602 发表于 2018-10-25 08:39 | 只看该作者
赶紧的别墨迹 发表于 2018-10-24 21:15
为什么k1==0延时之后还要有有if(k==0),
GPIO_LED=0xfe; 是让led灭还是亮
能解释下这个吗? 为什么i要

前面发的程序,有点小瑕疵,是因为相同程序结构复制粘贴的原因,修改后重发,并回答你的问题。
第一:修改小瑕疵后的程序:
#include<reg51.h>
#include<intrins.h>        

#define GPIO_LED P2

sbit k1=P3^2;
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;

void Delay10ms(unsigned int c);

void main(void)
{
        unsigned int i,n;
        while(1)
        {        
                if(k1==0)
                {
                        Delay10ms(1);
                        if(k1==0)
                        {
                                n=1;
                                GPIO_LED=0xfe;
                                while((i<50)&&(k1==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if(k2==0)
                {
                        Delay10ms(1);
                        if(k2==0)
                        {
                                n=2;
                                GPIO_LED=0xff;
                                while((i<50)&&(k2==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if(k3==0)
                {
                        Delay10ms(1);
                        if(k3==0)
                        {
                                n=3;
                                GPIO_LED=0x7f;
                                while((i<50)&&(k3==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if(k4==0)
                {
                        Delay10ms(1);
                        if(k4==0)
                        {
                                n=4;
                                GPIO_LED=0xff;
                                while((i<50)&&(k4==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
                if (n==1)
                {
                        GPIO_LED=_crol_(GPIO_LED,1);
                        Delay10ms(50);
                }
                if (n==3)
                {
                        GPIO_LED=_cror_(GPIO_LED,1);
                        Delay10ms(50);
                }
        }               
}

void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

第二:关于你的问题:
(1)为什么if (k1==0)延时后,还要有if (k1==0)
这是为了按键消抖,按下一个键,可不是你眼睛看到的一开一关,会有很多次的开关,叫抖动,所以要延时一会,让开关接触稳定后,再判断,这里消抖,叫按下消抖。
(2)while也是为了消除抖动,这次上松键抖动。至于50,这个值可以大点,也可以小点,只是为了让按键松开后稳定,另一个原因是不让这种情况出现——你按着键就是不松开,那样程序就死在这里了,有了50次的限制,程序可以跳出来,不会“死”。
(3)我的单片机开发板上,LED都是负极接在单片机IO口上的,即高电平灯灭,低电平灯亮(我看到的绝大多数板子都是这样接的,原因可能是——单片机低电平时能通过的电流大一些吧)。所以,0xfe,就是11111110,最低位灯亮,以后的移动,就向高位移动。后面设置0x7f,就是01111111,最高位灯亮,以后就向低位移动。你只说灯的循环亮,没有说同时有几个灯亮,我就设置的一个灯亮循环。

从你提的问题上看,你需要学习的东西还有很多,不仅仅是这个程序问题。呵呵,这次有我给你做作业,下次呢?我现在知道了,为什么那些高手不给你写程序,因为那样是在害你,让你不学习——考个大学,特别是搞自动化专业的,好好珍惜吧!我害你一次了,呵呵,下次不再害你了。
回复

使用道具 举报

26#
ID:415377 发表于 2018-10-25 18:08 | 只看该作者
就是将与LED灯相连的端口控制,然后利用中断延时就可以了
回复

使用道具 举报

27#
ID:415377 发表于 2018-10-25 18:09 | 只看该作者
代码在这里:
回复

使用道具 举报

28#
ID:415377 发表于 2018-10-25 18:10 | 只看该作者
代码如下:#include"reg51.h" #include"intrins.h"//移位函数 #include"stdio.h" #define uchar unsigned char #define uint unsigned int sbit on1=P1^2; sbit off1=P1^3; sbit shang=P1^4; sbit xia=P1^5; void off(int temp); void on(int temp); void up(int temp); void down(int temp); void delayms(uint j)//延时函数 {  uint i;         for(;j>0;j--)         {i=250;    while(--i);    i=249;          while(--i);           }  } void off(int temp) {  while(1)          { P0=0xff;              if(on1==0)                                  on(temp);      } } void on(int temp) {   while(1)               {   P0=temp;//点亮P0.0                          if(off1==0)                                   off(temp);                          if(shang==0)                                  up(temp);                          if(xia==0)                                  down(temp);                            delayms(300);                           temp=_crol_(temp,1);//左移一位                  }   } void up(int temp) {            while(1)               {P0=temp;//点亮P0.0                                 if(xia==0)                                   down(temp);                                 if(on1==0)                 on(temp);                          if(off1==0)                                  off(temp);                          delayms(300);                            temp=_crol_(temp,1);//左移一位             }                          } void down(int temp) {                          while(1)                      { P0=temp;//点亮P0.7                                   if(on1==0)                            on(temp);                                 if(shang==0)                                         up(temp);                            if(off1==0)                                  off(temp);       delayms(300);                           temp=_cror_(temp,1);//右移一位                                   } } main() {  uchar s1=0xfe;          P0=0xff;         while(1)                 { if(off1==0)                  off(s1);                 if(on1==0)                    on(s1);   }  }
回复

使用道具 举报

29#
ID:97574 发表于 2018-10-25 20:21 | 只看该作者
如果流水灯不用定时器实现的话就比较麻烦点,需要在软件延时里面插入按键监控,有按键按下的时候跳出延时函数
回复

使用道具 举报

30#
ID:415470 发表于 2018-10-25 20:45 | 只看该作者
看原理图做啊,看一下你用的板子的led灯是给什么电平亮,然后在头文件下定义一个标志位flag赋值0(看你这个要求最好定义成int什么的不要bit),在按键中(P32中把flag置为1)(P33置为2)(P34置为3)(P35置为4),然后在主函数中判断flag的值,执行你们老师给你们的要求
回复

使用道具 举报

31#
ID:415470 发表于 2018-10-25 20:46 | 只看该作者

看原理图做啊,看一下你用的板子的led灯是给什么电平亮,然后在头文件下定义一个标志位flag赋值0(看你这个要求最好定义成int什么的不要bit),在按键中(P32中把flag置为1)(P33置为2)(P34置为3)(P35置为4),然后在主函数中判断flag的值,执行你们老师给你们的要求1^2; sbit off1=P1^3; sbit shang=P1^4; sbit xia=P1^5; void off(int temp); void on(int temp); void up(int temp); void down(int temp); void delayms(uint j)//延时函数 {  uint i;         for(;j>0;j--)         {i=250;    while(--i);    i=249;          while(--i);           }  } void off(int temp) {  while(1)          { P0=0xff;              if(on1==0)                                  on(temp);      } } void on(int temp) {   while(1)               {   P0=temp;//点亮P0.0                          if(off1==0)                                   off(temp);                          if(shang==0)                                  up(temp);                          if(xia==0)                                  down(temp);                            delayms(300);                           temp=_crol_(temp,1);//左移一位                  }   } void up(int temp) {            while(1)               {P0=temp;//点亮P0.
回复

使用道具 举报

32#
ID:415540 发表于 2018-10-25 22:45 | 只看该作者
很简单的
回复

使用道具 举报

33#
ID:384396 发表于 2018-10-26 20:00 | 只看该作者
检测按键,编写亮灯子程序
检测按键的电平变化,当连接按键的引脚发生电位变化时进入子程序执行灯操作。
回复

使用道具 举报

34#
ID:416106 发表于 2018-10-27 00:19 | 只看该作者

搜索51单片机教程100例
回复

使用道具 举报

35#
ID:291477 发表于 2018-10-27 08:12 | 只看该作者
这是四个按键 控制LED移位的小程序,稍加改动就可以使用了#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit s1=P1^4; sbit s2=P1^5; sbit s3=P1^6; sbit s4=P1^7; void delay(uint z) {         uint x,y;         for(x=z;x>0;x--)                 for(y=110;y>0;y--); } void keycan() {         uint i;         if(s1==0)         {                 delay(30);                 if(s1==0)                 {                         i++;                         switch(i)                         {                                 case 1:                                                 P0=0x7f;                                                 break;                                 case 2:                                                 P0=0xbf;                                                 break;                                 case 3:                                                 P0=0xdf;                                                 break;                                 case 4:                                                 P0=0xef;                                                 break;                                 case 5:                                                 P0=0xf7;                                                 break;                                 case 6:                                                 P0=0xfb;                                                 break;                                 case 7:                                                 P0=0xfd;                                                 break;                                 case 8:                                                 P0=0xfe;                                                 break;                                 default:i=0;                         }                         while(!s1);                 }         }         if(s2==0)         {                 delay(30);                 if(s2==0)                 {                         i++;                         switch(i)                         {                                 case 1:                                                 P0=0xfd;                                                 break;                                 case 2:                                                 P0=0xfb;                                                 break;                                 case 3:                                                 P0=0xf7;                                                 break;                                 case 4:                                                 P0=0xef;                                                 break;                                 case 5:                                                 P0=0xdf;                                                 break;                                 case 6:                                                 P0=0xbf;                                                 break;                                 case 7:                                                 P0=0x7f;                                                 break;                                 case 8:                                                 P0=0xfe;                                                 break;                                 default:i=0;                         }                 while(!s2);                 }         } } void keycan1() {         uint i;         if(s3==0)         {                 delay(30);                 if(s3==0)                 {                         i++;                         switch(i)                         {                                 case 1:                                                 P2=0x7f;                                                 break;                                 case 2:                                                 P2=0xbf;                                                 break;                                 case 3:                                                 P2=0xdf;                                                 break;                                 case 4:                                                 P2=0xef;                                                 break;                                 case 5:                                                 P2=0xf7;                                                 break;                                 case 6:                                                 P2=0xfb;                                                 break;                                 case 7:                                                 P2=0xfd;                                                 break;                                 case 8:                                                 P2=0xfe;                                                 break;                                 default:i=0;                         }                         while(!s3);                 }         }         if(s4==0)         {                 delay(30);                 if(s4==0)                 {                         i++;                         switch(i)                         {                                 case 1:                                                 P2=0xfd;                                                 break;                                 case 2:                                                 P2=0xfb;                                                 break;                                 case 3:                                                 P2=0xf7;                                                 break;                                 case 4:                                                 P2=0xef;                                                 break;                                 case 5:                                                 P2=0xdf;                                                 break;                                 case 6:                                                 P2=0xbf;                                                 break;                                 case 7:                                                 P2=0x7f;                                                 break;                                 case 8:                                                 P2=0xfe;                                                 break;                                 default:i=0;                         }                         while(!s4);                 }         } } void main() {         P0=0xfe;         P2=0xfe;         while(1)         {                 keycan();                 keycan1();         } }
回复

使用道具 举报

36#
ID:291477 发表于 2018-10-27 08:13 | 只看该作者
这是通过 K1-K4 控制LED移位的小程序看一下稍加改动就好了
回复

使用道具 举报

37#
ID:291477 发表于 2018-10-27 08:14 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P1^4;
sbit s2=P1^5;
sbit s3=P1^6;
sbit s4=P1^7;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void keycan()
{
        uint i;
        if(s1==0)
        {
                delay(30);
                if(s1==0)
                {
                        i++;
                        switch(i)
                        {
                                case 1:
                                                P0=0x7f;
                                                break;
                                case 2:
                                                P0=0xbf;
                                                break;
                                case 3:
                                                P0=0xdf;
                                                break;
                                case 4:
                                                P0=0xef;
                                                break;
                                case 5:
                                                P0=0xf7;
                                                break;
                                case 6:
                                                P0=0xfb;
                                                break;
                                case 7:
                                                P0=0xfd;
                                                break;
                                case 8:
                                                P0=0xfe;
                                                break;
                                default:i=0;
                        }
                        while(!s1);
                }
        }
        if(s2==0)
        {
                delay(30);
                if(s2==0)
                {
                        i++;
                        switch(i)
                        {
                                case 1:
                                                P0=0xfd;
                                                break;
                                case 2:
                                                P0=0xfb;
                                                break;
                                case 3:
                                                P0=0xf7;
                                                break;
                                case 4:
                                                P0=0xef;
                                                break;
                                case 5:
                                                P0=0xdf;
                                                break;
                                case 6:
                                                P0=0xbf;
                                                break;
                                case 7:
                                                P0=0x7f;
                                                break;
                                case 8:
                                                P0=0xfe;
                                                break;
                                default:i=0;
                        }
                while(!s2);
                }
        }
}
void keycan1()
{
        uint i;
        if(s3==0)
        {
                delay(30);
                if(s3==0)
                {
                        i++;
                        switch(i)
                        {
                                case 1:
                                                P2=0x7f;
                                                break;
                                case 2:
                                                P2=0xbf;
                                                break;
                                case 3:
                                                P2=0xdf;
                                                break;
                                case 4:
                                                P2=0xef;
                                                break;
                                case 5:
                                                P2=0xf7;
                                                break;
                                case 6:
                                                P2=0xfb;
                                                break;
                                case 7:
                                                P2=0xfd;
                                                break;
                                case 8:
                                                P2=0xfe;
                                                break;
                                default:i=0;
                        }
                        while(!s3);
                }
        }
        if(s4==0)
        {
                delay(30);
                if(s4==0)
                {
                        i++;
                        switch(i)
                        {
                                case 1:
                                                P2=0xfd;
                                                break;
                                case 2:
                                                P2=0xfb;
                                                break;
                                case 3:
                                                P2=0xf7;
                                                break;
                                case 4:
                                                P2=0xef;
                                                break;
                                case 5:
                                                P2=0xdf;
                                                break;
                                case 6:
                                                P2=0xbf;
                                                break;
                                case 7:
                                                P2=0x7f;
                                                break;
                                case 8:
                                                P2=0xfe;
                                                break;
                                default:i=0;
                        }
                        while(!s4);
                }
        }
}
void main()
{
        P0=0xfe;
        P2=0xfe;
        while(1)
        {
                keycan();
                keycan1();
        }
}
回复

使用道具 举报

38#
ID:244512 发表于 2018-10-27 10:55 | 只看该作者
兄弟啊,单片机学习是一个需要动手能力的;你先从学会点亮一个LED灯开始吧!
回复

使用道具 举报

39#
ID:416218 发表于 2018-10-27 11:32 | 只看该作者
汇编写还是c写?
回复

使用道具 举报

40#
ID:244512 发表于 2018-11-29 14:32 | 只看该作者
从汇编开始,然后用C。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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