找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

森哥的流水灯程序(c51单片机),看的明白你就超神了.

[复制链接]
ddk 发表于 2013-10-30 16:10:39 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
森哥的流水灯程序(C51单片机),看的明白你就超神了.
#include<AT89X51.h>
#define uint unsigned int
#define uchar unsigned char
uchar zhongduan=0,m=0,mn=0,ll=0,shezhi=0,tiaosu=0,moshi=1;
uint sudu=20,zuixiao=20,biansu=0;
uchar jian(void)
{
        static uchar  jianzhi=0,jiancha=0;
        uchar i,k;
        P3=0xFF;
        k=(~P3)&0x3C;
        switch (jiancha)
        {
                case 0:
                        if(k)
                {
                                jiancha=1;
                }               
                        return(0);
                case 1:
                        if(k)
                        {
                                for(i=0;i<=4;i++)
                        {
                                if(k<(1<<(i+2)))  //不用==用<起到多按键仍成立
                                {
                                        jianzhi=i; //因判断用小于号故当前按键为i-1
                                        break;
                                }
                        }
                                jiancha=2;
                        }
                        else
                                jiancha=0;
                        return(0);
                case 2:
                        if(!k)
                        {
                                jiancha=0;
                                return(jianzhi);
                        }
                        return(0);
                default:
                        break;
        }
}
void liushui1(void)           //流水灯
{
        P1=~(1<<m);
        if(++ll>=(zuixiao+(7-m)*biansu))
        {
                ll=0;
                if(m==7)
                   m=0;
            else
                   m++;
        }
}
void liushui2(void)
{
        P1=~(1<<m);
        if(++ll>=(zuixiao+(7-m)*biansu))
        {
                ll=0;
                if(mn==0)
                {
                        if(m==7)
                    {
                             mn=1;
                    }                  
                else
                         m++;
                }
                if(mn==1)
                {
                        if(m==0)
                    {
                             mn=0;
                    }                  
                else
                         m--;
                }
        }
}
void liushui3(void)
{
        P1=0xFF<<m;
        if(++ll>=(zuixiao+(8-m)*biansu))
        {
                ll=0;
                if(mn==0)
                {
                        if(m==8)
                    {
                             mn=1;
                    }                  
                else
                         m++;
                }
                if(mn==1)
                {
                        if(m==0)
                    {
                             mn=0;
                    }                  
                else
                         m--;
                }
        }
}
void liushui4(void)
{
        if(mn==0)
        {
                P1=0xFF<<m;
        }
        else
        {
                P1=~(0xFF<<m);
        }
        if(++ll>=(zuixiao+(8-m)*biansu))
        {
                ll=0;
                if(m==8)
                {
                        m=0;
                        mn=!mn;
                }                  
            else
                   m++;
        }
}
void liushui5(void)
{
        P1=~((1<<m)|(1<<(7-m)));
        if(++ll>=sudu)
        {
                ll=0;
                if(m==7)
                        m=0;
                else
                        m++;
        }
}
void liushui6(void)
{
        P1=(0xFF<<m)&(0xFF>>m);
        if(++ll>=sudu)
        {
                ll=0;
           if(mn==0)
           {
                    if(m==4)
                    {
                            mn=1;
                    }
                    else
                            m++;
            }
            else
            {
                    if(m==0)
                    {
                            mn=0;
                    }
                    else
                            m--;
            }
        }
}
void liushui7(void)
{
        if(mn==0)
        {
                P1=(0xFF<<m)&(0xFF>>m);
        }
        else
        {
                P1=~((0xFF<<m)&(0xFF>>m));
        }
        if(++ll>=sudu)
        {
                ll=0;
                if(m==4)
                {
                    m=0;
                        mn=!mn;
                }
                else
                        m++;
        }
}
void zui(void)
{
        P1=~(1<<m);
        if(++ll>=zuixiao)
        {
                ll=0;
                if(m==7)
                   m=0;
            else
                   m++;
        }
}
void bian(void)
{
        P1=0xFF>>(biansu/5);
}
void main(void)
{
        uchar p;
        TMOD=0x01;
        EA=1;
        ET0=1;
        TH0=(65536-5000)/256;
        TL0=(65565-5000)%256;
        TR0=1;
        while(1)
        {
                if(zhongduan)
                {
                        zhongduan=0;
                        p=jian();
                        if(p!=0)
                        {
                                ll=0;
                                mn=0;
                                m=0;
                                switch(p)
                           {
                                case 1:
                                        if(shezhi)
                                                shezhi=0;
                                        else
                                        {
                                                shezhi=1;
                                                tiaosu=0;
                                        }       
                                        break;
                                case 2:
                                        if(shezhi)
                                        {
                                                tiaosu=!tiaosu;
                                        }
                                        else
                                        {
                                                if(moshi>=7)
                                                        moshi=1;
                                                else
                                                        moshi++;
                                        }
                                case 3:
                                {
                                        if(shezhi)
                                        {
                                                if(tiaosu)
                                                {
                                                        if(biansu==40)
                                                        {
                                                                biansu=0;
                                                        }
                                                        else
                                                                biansu+=5;
                                                }
                                                else
                                                {
                                                        if (320<=zuixiao+8*biansu)
                                                        {
                                                                zuixiao=10;
                                                        }
                                                        else
                                                        {
                                                                zuixiao+=10;
                                                        }
                                                }                                                       
                                        }
                                        else
                                        {
                                                if(sudu>=320)
                                                {
                                                        sudu=10;
                                                }
                                                else
                                                {
                                                        sudu+=10;
                                                }
                                        }
                                        break;
                                }
                                case 4:
                                {
                                        if(shezhi)
                                        {
                                                if(tiaosu)
                                                {
                                                        if(biansu==0)
                                                        {
                                                                biansu=35;
                                                        }
                                                        else
                                                                biansu-=5;
                                                }
                                                else
                                                {
                                                        if (zuixiao<=5)
                                                        {
                                                                zuixiao=320-8*biansu;
                                                        }
                                                        else
                                                        {
                                                                zuixiao-=5;
                                                        }
                                                }                                                       
                                        }
                                        else
                                        {
                                                if(sudu==5)
                                                {
                                                        sudu=315;
                                                }
                                                else
                                                {
                                                        sudu-=5;
                                                }
                                        }
                                        break;
                                }
                                default:
                                        break;
                         }
                        }
                        if(shezhi)
                        {
                                if(tiaosu)
                                {
                                        bian();
                                }
                                else
                                {
                                        zui();
                                }
                        }
                        else
                        {
                                switch(moshi)
                                {
                                        case 1:
                                                liushui1();
                                                break;
                                        case 2:
                                                liushui2();
                                                break;
                                        case 3:
                                                liushui3();
                                                break;
                                        case 4:
                                                liushui4();
                                                break;
                                        case 5:
                                                liushui5();
                                                break;
                                        case 6:
                                                liushui6();
                                                break;
                                        case 7:
                                                liushui7();
                                                break;
                                }
                        }
                }
        }
}
void zhong(void) interrupt 1
{
        zhongduan=1;
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
}




灯光脚是  p1   x8个      按键是   p32  p33   p34   p35
cy1144391746 发表于 2013-10-30 17:54:08 | 显示全部楼层
我觉得我可以看完就已经超神了,我现在还是在自学AT89c52的,你这个有点看不懂,芯片不一样。
nhgaoweili 发表于 2013-12-2 13:24:52 | 显示全部楼层
什么牌子的芯片
yjdcwlx 发表于 2014-1-6 20:41:48 | 显示全部楼层

感谢分享,看看
hurbo 发表于 2014-2-8 00:30:06 | 显示全部楼层
看了一下,挺复杂的,有调速,变速,多种流水效果,闲的时候我仿真一下,是不是很好看
工程师 发表于 2014-3-2 09:00:53 | 显示全部楼层
感谢分享,看看
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:21 , Processed in 0.054646 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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