找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LED流水灯 求实现思路

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

P0口接八个红色发光LED,P1.0,P1.1,P1.2分别接三个按键,上电后流水灯自上往下,延时2秒闪烁。
P1.0按键控制流水灯工作模式,每按一次改变一次流水灯闪烁模式,从上至下,再按一次,改为从下至上闪烁。
P1.1 按一次,闪烁时延加0.5秒,最慢闪烁为4秒。
P1.2按一次,闪烁时延减0.5秒,最快闪烁为0.5秒)

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

使用道具 举报

沙发
ID:517951 发表于 2021-9-28 14:04 | 只看该作者
delay(unsigned char time)
{
   for (;time;time--)
  ;
}

按不同的键,time取不同的值,就可以改变间隔时间了

回复

使用道具 举报

板凳
ID:969030 发表于 2021-9-29 11:06 | 只看该作者
无非就是切换函数,延迟,这不挺简单的吗
回复

使用道具 举报

地板
ID:57657 发表于 2021-9-29 13:47 | 只看该作者
rayin 发表于 2021-9-28 14:04
delay(unsigned char time)
{
   for (;time;time--)

延时建议用定时器中断,软件延时误差不好计算。
回复

使用道具 举报

5#
ID:23640 发表于 2021-9-29 14:00 | 只看该作者
npn 发表于 2021-9-29 13:47
延时建议用定时器中断,软件延时误差不好计算。

题主刚开始学就别为难他了,简单点先把功能做出来
回复

使用道具 举报

6#
ID:23640 发表于 2021-9-29 14:19 | 只看该作者
unsigned char TEMP;
unsigned int timeout=0;
while(1)
{
        for(i=0;i<8;i++)
        {
                switch(mode)//暂定3个模式
                {
                        case 0:P0=TEMP;TEMP=TEMP<<i;
                                break;
                        case 1:P0=TEMP;TEMP=TEMP>>i;
                                break;       
                }
                delayms(timeout);       
        }
        keyval = keyscan();//按键扫描
        if(keyval==1)//模式键
        {
                mode++;
                if(mode>1)mode=0;
                switch(mode)
                {
                        case 0:TEMP=0X01;
                                break;       
                        case 1:TEMP=0X80;
                                break;
                }       
        }
        else if(keyval==2)//加键
        {
                timeout+=500;       
        }
        else if(keyval==3)//减键
        {
                timeout-=500;       
        }
}
回复

使用道具 举报

7#
ID:800529 发表于 2021-9-29 14:57 | 只看该作者
6楼给出了实现程序,要想时间准,可以考虑改为定时器中断模式。
回复

使用道具 举报

8#
ID:57657 发表于 2021-9-29 16:59 | 只看该作者
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define U8 unsigned char
  4. #define U16 unsigned int
  5. sbit sKEY0 = P1 ^ 0;
  6. sbit sKEY1 = P1 ^ 1;
  7. sbit sKEY2 = P1 ^ 2;
  8. bit key0, key1, key2;
  9. U8 k0ms, k1ms, k2ms;        //3个按键按下的时间(毫秒) 按下计数 松开清0
  10. U16 delay = 500; //流水灯延时(毫秒)
  11. bit lr = 0;     //流水灯方向

  12. void InitTimer0(){
  13.     TMOD = 0x01;
  14.     TH0 = 0x0FC;
  15.     TL0 = 0x18;
  16.     EA = 1;
  17.     ET0 = 1;
  18.     TR0 = 1;
  19. }

  20. void main(){
  21.     InitTimer0();
  22.     while (1) {
  23.         if (sKEY0 == 0) {
  24.             lr = !lr;
  25.             while (sKEY0 == 0);
  26.         }
  27.         if (sKEY1 == 0) {
  28.             if (delay < 4000) delay += 500;
  29.             while (sKEY1 == 0);
  30.         }
  31.         if (sKEY2 == 0) {
  32.             if (delay > 500) delay -= 500;
  33.             while (sKEY2 == 0);
  34.         }
  35.     }
  36. }

  37. void Timer0Interrupt() interrupt 1 {        //12Mhz 1mS 定时器中断
  38.     static U8 a = 1;
  39.     static U16 ms = 0;
  40.     TH0 = 0x0FC;
  41.     TL0 = 0x18;
  42.     if (sKEY0) {k0ms = 0;}else{if (k0ms != 0xFF) {k0ms++;}}
  43.     if (sKEY1) {k1ms = 0;}else{if (k1ms != 0xFF) {k1ms++;}}
  44.     if (sKEY2) {k2ms = 0;}else{if (k2ms != 0xFF) {k2ms++;}}
  45.     key0 = !(k0ms >= 25);       //按键消抖25毫秒
  46.     key1 = !(k1ms >= 25);
  47.     key2 = !(k2ms >= 25);
  48.     if (++ms >= delay) {
  49.         ms = 0;
  50.         P0 = ~a;
  51.         a = lr ? _cror_(a, 1) : _crol_(a, 1);
  52.     }

  53. }
复制代码
回复

使用道具 举报

9#
ID:161164 发表于 2021-9-30 10:21 | 只看该作者
不用定时器版本,误差2.5%
  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 — 65535
  4. typedef         unsigned long        u32;  //0 — 4294967295
  5. sbit KEY_0 = P1 ^ 0;
  6. sbit KEY_1 = P1 ^ 1;
  7. sbit KEY_2 = P1 ^ 2;
  8. sbit Sys_HB = P3^7;       
  9. u16 TMR_ms_ACC = 0;
  10. u8 Delay_XD = 0;                      //消抖计数
  11. u16 Flash_delay = 2000, TMR_Flash_ACC;
  12. bit Swap;

  13. void main()
  14. {u8 i;
  15.     while (1)
  16.     {
  17.         if(TMR_ms_ACC)TMR_ms_ACC--;
  18.         if(!TMR_ms_ACC)
  19.         {   TMR_ms_ACC = 45;
  20.                                                 if(TMR_Flash_ACC)TMR_Flash_ACC--;
  21.                                                 if(!TMR_Flash_ACC)
  22.                                                 {   TMR_Flash_ACC = Flash_delay;
  23.                                                                 if(Swap)
  24.                                                                 {
  25.                                                                         P0 = 0x80 >> i;
  26.                                                                 }else
  27.                                                                 {
  28.                                                                         P0 = 0x01 << i;
  29.                                                                 }i = (++i) % 8;
  30.                                                 }
  31.                                                 Sys_HB ^= 1;//输出系统周期,计算TMR_ms_ACC
  32.         }
  33.         if(!KEY_0 || !KEY_1 || !KEY_2)
  34.         {
  35.             if(Delay_XD < 0xFF)Delay_XD++;
  36.             if(Delay_XD == 250)                      //消抖
  37.             {
  38.                 if(!KEY_0)
  39.                                                                 {
  40.                                                                         Swap ^= 1;
  41.                                                                 }
  42.                 if(!KEY_1)
  43.                                                                 {
  44.                                                                         if (Flash_delay < 4000)
  45.                                                                                 Flash_delay += 500;
  46.                                                                 }
  47.                 if(!KEY_2)
  48.                                                                 {
  49.                                                                         if (Flash_delay > 500)
  50.                                                                                 Flash_delay -= 500;
  51.                                                                 }
  52.             }
  53.         }
  54.         else                                                        //按键抬起
  55.             Delay_XD = 0;                                      //Delay_XD清0

  56.     }
  57. }
复制代码




回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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