找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机呼吸灯流水程序如何改为呼吸一下右移一下?

[复制链接]
跳转到指定楼层
楼主
想问一下各位前辈,这个呼吸灯的程序,需要怎么改一下能变成八个io口控制八个小灯,呼吸一下右移一下,呼吸一下右移一下,程序最好简洁点

单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit led=P1^0;
void pwm_led();
void delay(uint);

void main()
{
        while(1)
        {
                pwm_led();        
        }
}

void pwm_led()
{
        uint cycle=500,pwm=0;
                for(pwm=1;pwm<cycle;pwm++)
                {
                        led=0;                           
                        delay(pwm);                  
                        led=1;                           
                        delay(cycle-pwm);  
                }
                for(pwm=cycle-1;pwm>0;pwm--)
                {
                        led=0;
                        delay(pwm);               
                        led=1;
                        delay(cycle-pwm);        
                }        
}

void delay(uint t)
{
        while(--t);
}

51hei图片_20220330215323.jpg (659 KB, 下载次数: 35)

51hei图片_20220330215323.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-3-31 09:56 | 只看该作者
先弄个简单的流水灯代码

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. void flow_led();
  5. void Delay500ms();

  6. void main()
  7. {
  8.         while(1)
  9.         {
  10.                 flow_led();        
  11.         }
  12. }

  13. void flow_led()
  14. {
  15.         uchar flow;
  16.                 for(flow=0;flow<8;flow++)
  17.                 {
  18.                                 P1=~(0x01 << flow);                           
  19.                                 Delay500ms();         
  20.                 }
  21. }

  22. void Delay500ms()                //@11.0592MHz
  23. {
  24.                 unsigned char i, j, k;

  25.                 _nop_();
  26.                 i = 4;
  27.                 j = 129;
  28.                 k = 119;
  29.                 do
  30.                 {
  31.                         do
  32.                         {
  33.                                 while (--k);
  34.                         } while (--j);
  35.                 } while (--i);
  36. }
复制代码

再把它们结合起来就可以了

回复

使用道具 举报

板凳
ID:860248 发表于 2022-3-31 20:46 | 只看该作者
/***** 呼吸灯流水程序 呼吸一下右移一下 *****/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i = 0;
uchar code LEDflow[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

void delay(uint t)
{
        while(--t);
}

void pwm_led()
{
        for (i=0; i<8; i++)
        {
        uint cycle=500, pwm=0;
                for(pwm=cycle-1;pwm>0;pwm--)
                {
                        P1 = 0x00;
                        delay(pwm);               
                        P1 = LEDflow;
                        delay(cycle-pwm);        
                }        
                for(pwm=1;pwm<cycle;pwm++)
                {
                        P1 = 0x00;                           
                        delay(pwm);                  
                        P1 = LEDflow;                           
                        delay(cycle-pwm);  
                }
        }
}


void main()
{
        while(1)
        {
               pwm_led();        
        }
}

你好
按照你的意思只增加少许, 这样可以吗.

回复

使用道具 举报

地板
ID:517333 发表于 2022-3-31 21:37 | 只看该作者
采用for循环和位移函数
回复

使用道具 举报

5#
ID:161164 发表于 2022-3-31 21:42 | 只看该作者
kscheang 发表于 2022-3-31 20:46
/***** 呼吸灯流水程序 呼吸一下右移一下 *****/
#include
#define uchar unsigned char

去仿真或下到实机看看就知到啊~
回复

使用道具 举报

6#
ID:860248 发表于 2022-3-31 22:29 | 只看该作者
我想过用FOR 和<<移位, 但会和楼主的设计概念和程序更改相差较远, 用这个只加上数组作移位就可以
回复

使用道具 举报

7#
ID:978416 发表于 2022-4-1 16:47 | 只看该作者
kscheang 发表于 2022-3-31 20:46
/***** 呼吸灯流水程序 呼吸一下右移一下 *****/
#include
#define uchar unsigned char

非常感谢,确实很简洁,在P1=LEDflow;这里是不是低加上【i】;开始运行不行一看编码我的是共阳的,再次感谢。
回复

使用道具 举报

8#
ID:978416 发表于 2022-4-1 16:55 | 只看该作者
lkc8210 发表于 2022-3-31 09:56
先弄个简单的流水灯代码

再把它们结合起来就可以了

感谢
回复

使用道具 举报

9#
ID:978416 发表于 2022-4-1 16:58 | 只看该作者

谢谢,施用FOR循环解决的uchar code table [8] = {0xFE,0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF,
for (i=0; i<8; i++)                         //....
        {
        uint cycle=500, pwm=0;
                       

                                 for(pwm=cycle-1;pwm>0;pwm--)
                {
                        P1 = 0xff;
                        delay(pwm);               
                        P1 = table;
                        delay(cycle-pwm);        
                }        


                                for(pwm=1;pwm<cycle;pwm++)
                {
                        P1 = 0xff;           //....               
                        delay(pwm);                  
                        P1 =table;                           
                        delay(cycle-pwm);  
                }                       
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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