找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机流水灯程序如何加个开关换向?

[复制链接]
跳转到指定楼层
楼主
想要用p1的开关来控制流水灯的方向改变,求解决思路

单片机源程序如下:
#include<reg52.h>   //头文件
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
void delayms(uchar ms) //延时子函数
{
   uchar i;
   while(ms--)
   for(i=0;i<123;i++);
}
void main()//主函数
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延时100ms
      P0=(P0<<1)|(P0>>7);//循环移位
    }
}  

1.png (140.4 KB, 下载次数: 16)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

来自 6#
ID:121859 发表于 2022-10-12 08:41 | 只看该作者
#include<reg52.h>   //头文件
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义

sbit Key = P1^0;
bit  Forward;

void delayms(uchar ms) //延时子函数
{
   uchar i;
   while(ms--)
   {
        for(i=0;i<123;i++);        //酌情减小
   }
}
void main()//主函数
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延时100ms
      if(Key==0)
      {
        while(Key==0);
        Forward = !Forward;
      }
      if(Forward){P0=(P0<<1)|0x01;if(P0==0xff)P0=0xfe;}
      else{P0=(P0>>1)|0x80;if(P0==0xff)P0=0x7f;}
    }
}
回复

使用道具 举报

沙发
ID:1047343 发表于 2022-10-11 22:45 来自触屏版 | 只看该作者
求大伙指点一下
回复

使用道具 举报

板凳
ID:624769 发表于 2022-10-11 23:07 | 只看该作者
在你的代码基础上改的。

#include<reg52.h>   //头文件
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义

sbit Key = P1^0;
bit        Press,Forward;

void delayms(uchar ms) //延时子函数
{
   uchar i;
   while(ms--)
   {
           if(Key == 0) Press = 1;        //检查Key
        for(i=0;i<123;i++);        //酌情减小
   }
}
void main()//主函数
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延时100ms
      if(Press)
      {
              Press = 0;
        Forward = !Forward;
      }
      if(Forward)      P0=(P0<<7)(P0>>1);//循环移位
      else      P0=(P0<<1)(P0>>7);//循环移位
    }
}

回复

使用道具 举报

地板
ID:1047343 发表于 2022-10-12 08:10 | 只看该作者
188610329 发表于 2022-10-11 23:07
在你的代码基础上改的。

这连原来的循环都没有了,p1.0的开关也没用上
回复

使用道具 举报

5#
ID:1047343 发表于 2022-10-12 08:20 | 只看该作者
188610329 发表于 2022-10-11 23:07
在你的代码基础上改的。

对不起是我的问题,代码是正确的,感谢指导
回复

使用道具 举报

7#
ID:123289 发表于 2022-10-12 09:04 | 只看该作者
1、没有换相这一说!也没有流水这一说!!这有N个灯从一个显示状态【A】,切换成另一个显示状态【B】而矣!!!
【A】=第3个灯亮,【B】=第4个灯亮,于是就认为是向右了。
【A】=第3个灯亮,【B】=第2个灯亮,于是就认为是向左了。
2、任意给个信号(如开关),收到信号后,修改一个[【A】【B】的状态就可以达成,你希望的任何状态形式。
回复

使用道具 举报

8#
ID:1047343 发表于 2022-10-12 10:23 来自触屏版 | 只看该作者
zhxiufan 发表于 2022-10-12 08:41
#include   //头文件
#include
#define uchar unsigned char//宏定义

这个优化了上面的,把key从延时函数里移到了主函数里,感谢大佬
回复

使用道具 举报

9#
ID:624769 发表于 2022-10-12 12:02 | 只看该作者
zephry 发表于 2022-10-12 10:23
这个优化了上面的,把key从延时函数里移到了主函数里,感谢大佬

到底是不是优化,当你多按几次按键,或者,你把  delayms(uchar ms)   这个 uchar  修正成 uint  
你delayms(500); 这个 500 正确传递进去了(你现在传得其实是244), 你就明白 为什么  按键判断要写在  delay 函数里了。
回复

使用道具 举报

10#
ID:1047409 发表于 2022-10-12 13:23 | 只看该作者
#include <REGX51.H>
unsigned char k=0;
void delay(unsigned int num)
{
         unsigned int i,j;
         for(i=0;i<num;i++)
         for(j=0;j<120;j++)
        ;
}
void main()
{
         unsigned char i,j;  
       
          IT0=1; //ÅäÖÃ′¥·¢·½ê½£¬Ï½μÑØ′¥·¢
          EX0=1;  //ÖD¶ÏÔêDí
          EA=1;  //×ü¿a1Ø
          PX0=0;  //ÖD¶ÏóÅÏè¼¶£¬Ä¬èÏóÅÏè¼¶¿éòÔê¡
          while(1)
                {
                if(k==0)
                        {
                                j=0xfe;
                                for(i=0;i<8;i++) //¶¨òåiÎa0~8μÄìõ¼têy£¬jÎaLED1μ½8μÄ
                                 {
                                        P1=j;
                                        j=(j<<1)|0x01;
                                        delay(300);
                                 }
                  }                       
                        else
                        {
                                        j=0x7f;
                                        for(i=8;i>0;i--)
                                 {
                                        P1=j;
                                        j=(j>>1)|0x80;
                                        delay(300);
                                 }
                        }
                }
}

void waib0() interrupt 0  //°′ò»ÏÂè¡·′
{
        k=~k;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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