基于51单片机的各种花样的流水灯c51程序

发布者:SparkleMagic最新更新时间:2012-09-24 来源: 21ic 关键字:51单片机  流水灯  c51程序 手机看文章 扫描二维码
随时随地手机看文章

/*-----------------------------------------------
功能:流水灯对称移动闪烁(双闪烁)

------------------------------------------------*/

#include
#define uint unsigned int
void delay(uint);
main()
{
        uint comp1=0xfe;
        uint comp2=0x80;
        P1=0x7e;
        delay(30000);
        while(1)
        {
                P1=0xff;
                comp1<<=1;
                comp1|=0x01;
                comp2>>=1;
                P1&=comp1;
                P1^=comp2;
                delay(30000);
                if(P1==0xe7)
                {
                        comp1<<=1;
                        comp1|=0x01;
                        comp2>>=1;          
                }      

                if(comp1==0x7f)
                {
                        comp1=0xfe;
                        comp2=0x80;             
                }     
        }              
}
void delay(uint cnt)
{
     while(cnt--);    
}


/*-----------------------------------------------------------------

只循环一次,而没有一直循环下去,出错地方在:

通过添加一条测试语句:

                                                 if(comp1==0x7f)
                                                 {
                                                         comp1=0xfe;  comp2=0x80;
                                                         P1=0x00;  delay(30000);

                                                 }     

发现if语句没有被执行,自然继续左右移动:

1111 1111&1111 1111^0000 0000==11111 1111

所以看起来是执行了一次while中的代码。

 

具体为什么不行,还不清楚……   

更正下列代码后,能够实现功能。                                                    

                                                 if(P1==0x7e)
                                                 {
                                                         comp1=0xfe;
                                                         comp2=0x80;
                                                 }

或者:                                    

                                                 if(comp2==0x01)
                                                 {
                                                         comp1=0xfe;
                                                         comp2=0x80;
                                                 }

--------------------------------------------------------------*/[page]

*********************************************

/*-----------------------------------------------
功能:流水灯(单向单闪烁)

------------------------------------------------*/

#include
#define uint unsigned int
void delay(uint);
main()
{
        //uint fre=0x03;
        //uint comp1=0xfe,comp2=0x80;
        P1=0xfe;
        while(1)
        {
        /*------------------------------------------------------------------

                    模块1:循环单向闪烁,只有一个灯亮灭
            执行3次,转入下一种闪烁

        --------------------------------------------------------------------*/
                while(1)
                {
                        delay(30000);
                        P1<<=1;
                        P1|=0x01;
                        if(P1=0x7f)
                        {
                                delay(30000);       
                                P1=0xfe;

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

 

/*-----------------------------------------

程序运行结果左右两端跳动,原因是:

if(P1=0x7f);中的等号也成了赋值号,更正为if(P1==0x7f);

特别注意,不要把判断语句种的等号误写为赋值号。

-----------------------------------------*/

[page]

**************************************

 

/*-----------------------------------------------
功能:花样灯(单向单闪烁+单向双闪烁)

------------------------------------------------*/

#include
#define uint unsigned int
void delay(uint);
main()
{
        uint fre=0x04;
        uint comp1=0xfe,comp2=0x80;
        while(1)
        {
                /*-------------------------------------------------------------------

                            模块1:循环单向闪烁,只有一个灯亮灭
                                        执行3次,转入下一种闪烁

                --------------------------------------------------------------------*/
                P1=0xfe;
                while(1!=fre--)
                {
                        delay(30000);
                        P1<<=1;
                        P1|=0x01;
                        if(P1==0x7f)
                        {
                                delay(30000);       
                                P1=0xfe;

                        }
                }
                /*-------------------------------------------------------------------

                          模块2:循环单向闪烁,只有两个灯亮或者灭
                                          执行3次,转入下一种闪烁

                --------------------------------------------------------------------*/
                P1=0xfc;
                while(3!=fre++)
                {
                        delay(30000);
                        P1<<=2;
                        P1|=0x03;
                        if(P1==0x3f)
                        {
                                delay(30000);
                                P1=0xfc;
                        }
                }       
        }       
}
void delay(uint cnt)
{
  while(cnt--);
}

 

/*----------------------------------------------------

两个模块均没有问题,但是放在一起,并没有得到想要的结果,

第一个循环没有进行完全,且两个循环的循环的次数与要求的不符。

错误地方在于:模块1和模块2的循环控制的只是一次亮灭,更正为:

 

#include
#define uint unsigned int
void delay(uint);
main()
{
        uint fre=0x04;
        uint fre1,fre2;
        uint comp1=0xfe,comp2=0x80;
        while(1)
        {
                /*--------------------------------------------------------------------

                            模块1:循环单向闪烁,只有一个灯亮灭
                                        执行3次,转入下一种闪烁

               --------------------------------------------------------------------------*/
            P1=0xfe;
                while(1!=fre--)
                {
                        fre1=0x08;
                        while(1!=fre1--)
                        {
                                delay(3000000);
                                P1<<=1;
                                P1|=0x01;
                                if(P1==0x7f)
                                {
                                        delay(3000000);       
                                        P1=0xfe;
                                }
                        }
                }
                /*-------------------------------------------------------------------

                            模块2:循环单向闪烁,只有两个灯亮或者灭
                                          执行3次,转入下一种闪烁               

                --------------------------------------------------------------------*/
                P1=0xfc;
                while(3!=fre++)
                {
                        fre2=0x04;
                        while(1!=fre2--)
                        {
                                delay(3000000);
                                P1<<=2;
                                P1|=0x03;
                                if(P1==0x3f)
                                {
                                        delay(3000000);
                                        P1=0xfc;
                                }
                        }          
                }
        }       
}
void delay(uint cnt)
{
  while(cnt--);
}

注意控制语句中fre++和fre--;并且fre1和fre2的初始化不能出错,

由于if()语句的出现,fre1和fre2的取值要比预想的减一。

----------------------------------------------------------*/

 

关键字:51单片机  流水灯  c51程序 引用地址:基于51单片机的各种花样的流水灯c51程序

上一篇:单片机c语言教程:建立你的第一个KeilC51项目
下一篇:基于单片机的LED彩灯控制器

推荐阅读最新更新时间:2024-03-16 13:09

8051单片机实战分析(以STC89C52RC为例) | 03 - LED流水灯
1 原理图 从图中不难看出,整个P2端口都接有LED,写代码时需要驱动整个P2端口。 2 代码 #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 #include intrins.h //因为要用到左右移函数,所以加入这个头文件 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define led P2 //将P2口定义为led 后面就可以使用led代替P2口 /**********************************************************
[单片机]
80<font color='red'>51单片机</font>实战分析(以STC89C52RC为例) | 03 - LED<font color='red'>流水灯</font>
51单片机的上拉电阻一般多大
1、51单片机的p0口为了实现准3态,采用了oc输出,也就是集电极悬空输出,也有叫图腾柱输出的。这种电路结构,只有下拉能力,高电平输出没有电流,在高电平时表现为高阻态;加上上拉电阻,就会失去高阻态,变成 1、0 两态。 2、p0口上拉电阻的选择,应遵循基本的电路设计原则,不能盲目套用,要看后级情况而定: 例如,后级驱动的是1只npn三极管,这个三极管的放大倍数( )=100倍,三极管的负载电流(ic)要求100ma,当电源为5v时: a、三极管的ib=ic/ =1ma; b、上拉电阻大约=r=5v/ib=5k ; c、为了使三极管注入ib后就迅速进入导通(开)状态,r应再小一些,如4k3; 3、由上面计算可见,三极管的负载大小、放大
[单片机]
51单片机第五弹---外部中断
什么叫中断 中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序;当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序。 51单片机的中断 80c51提供有5个中断源,分别为:2个外部中断,2个定时/计数器中断,1个串口发送/接收中断。并且具有2个中断优先级,可以实现2级中断服务程序嵌套。 首先要弄中断设置 ,中断原理图如下: 以 设置INT0为例:IT0=1;EX0=1; 最后打开总中断 EA=1; 如图 : 2个外部中断分别接 p3.2 p3.3 即开关K3 K4 ,也就是说按开关K3转
[单片机]
c51单片机定时中断的精确定时编程方法总结
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期 。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。 文中以定时器T1工作在定时方式1为例,晶振频率为12MHz 。 1 方法1 在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时
[单片机]
51单片机智能调光台灯电路原理图+程序设计
1.功能介绍 智能台灯可分成自动和手动两种模式。在自动模式下,台灯能根据环境光的亮暗与人是否被台灯所检测到(人是否在)来自动开启台灯。当人被微机检测到,环境光又达到某个程度的时候(可以设定与调节),台灯就会开启。如果环境光没有达到这个程度,台灯不会开启。当人没有被微机检测到,无论多暗,台灯也不会开。  手动模式是为了不习惯使用自动模式的人或是台灯中的微机出故障等紧急情况时用的。在手动模式下,智能台灯和普通台灯是一样使用的。 主要功能 : (1)亮度不够且有人靠近时台灯自动亮; (2)靠的太近会提醒坐姿不正(蜂鸣器) (3)附近无人时台灯自动熄灭(30秒) 时间可调 (4)根据环境亮度调节等亮度 (5)可手动调节台灯亮度 (6
[单片机]
<font color='red'>51单片机</font>智能调光台灯电路原理图+<font color='red'>程序</font>设计
用Proteus学习51单片机之I2C(IIC)总线
在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想用多一点芯片吧,老觉得IO口不够用。学串口的时候觉得串口是个好东西,连两条线就够了,现在学到I2C,觉得这也是一个非常好的东西,也是两条线,还能给每个总线上的设备设立地址,简直就是一个小网络了。 I2C总线使用两条线,一条是时钟线,称为SCL,一条是数据线,称为SDA,各个设备就并在总线上,每一个总线上的设备都有一个自己的地址,主机在操作设备的时候,都会先发送一个地址码,告诉被操作机,接下来的命令由它接收。 接下来说一下I2C总线的数据有效性。I2C总线进行数据传送时,要求SCL为高电平时,SDA上的数据必需保持稳定,换言之,当
[单片机]
用Proteus学习<font color='red'>51单片机</font>之I2C(IIC)总线
51单片机实验8:led点阵(1):点亮一个点
开发板led点阵模块电路图如下: 74HC595:74HC595是一个8位串行输入、并行输出的位移缓存器。芯片第11角为数据输入时钟线,上升沿有效。芯片第12脚为输出存储器锁存时钟线,上升沿有效。芯片第13脚为输出有效(低电平)。芯片第14脚为串行数据输入。 为表示出输入74HC595的8位二进制数,开发板加入了led模块(图一中绿色所示)。若要使led发光,则需将JP595接vcc。 OE为输出有效控制端,低电平有效,所以务必将JOE短接片短接到GND端。 _nop_();函数为延时一个机器周期,所对应头文件为intrins.h #include reg52.h #include intrins.h #
[单片机]
<font color='red'>51单片机</font>实验8:led点阵(1):点亮一个点
基于51单片机的无线信号编解码技术研究
随着微电子、计算机信息技术的迅速发展,由单片机和无线传输模块组成的无线数据通信系统在石油、电力、水文、冶金、安防等行业的无线控制、数据采集、故障报警等诸多领域中得到越来越广泛的应用。而数据的编解码对于无线传输可靠性的影响举足轻重。目前编解码方式主要有硬件编解码和软件编解码两种。本文在对已有硬件及软件编解码技术研究的基础上,设计并通过STC89C516RD+单片机实现了一种以软件方式对传输数据编解码的方法。 1 现有的编解码技术 1.1 硬件编解码技术  目前有多种用于编码和解码的专用芯片,PT2262/PT2272是比较常用的一种。在通常的使用中,一般采用8位地址码和4位数据码,这时编码芯片PT2262和解码芯片PT2272的第
[工业控制]
基于<font color='red'>51单片机</font>的无线信号编解码技术研究
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved