C语言C51单片机花样流水灯程序分析注释

C语言C51单片机花样流水灯程序分析注释,第1张

和你说一句关键的(别告我你整个程序一句都看不懂):

P1=0xfe;

0xfe是十六进制表示的数,二进制就是1111 1110,通过你的程序和相关注释可以看出,硬件上你有8个led灯连接P1口,且这些led是低电平亮。P1=0xfe(1111 1110)也就是表示七个灯灭,一个灯亮。接下来的代码就是让P1数据0xfe左移且低位补1,移一次就是1111 1101,、两次就是1111 1011,三次是1111 0111。。。以此类推,可以看出它是0由最低位到最高位依次移过去的,而刚说了0表示led亮,这也就是led从一边到另一边依次点亮的效果。

后面的代码按我上面说的自己理解,完全对你解释太麻烦,对你也没多大好处,只有你自己理解了才能学好单片机

#include "reg51h"

main()

{

unsigned int i,j;

while(1)

{

P1=0xfe; //点亮第一个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xfd; //点亮第二个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xfb; //点亮第三个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xf7; //点亮第四个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xef; //点亮第五个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xdf; //点亮第六个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xbf; //点亮第七个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0x7f; //点亮第八个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

}

}

或:

#include "reg51h"

void delay(unsigned int t)

{

unsigned inti,j;

for(i=t;i>0;i--)

for(j=110;j>0;j--);

}

main()

{

unsigned char w,i;

while(1)

{

w=0xfe;

for (i=0;i<8;i++)

{

P1=w; //循环点亮LED

w<<=1; //点亮灯的位置移动,最低位补0

w=w|0x01; //将最低位置1

delay(500); //延时

}

}

}

或:

#include "reg51h"

//程序中使用_crol_函数,所以要包含头文件"intrinsh"

#include "intrinsh"

void delay(unsigned int t)

{

unsigned int i,j;

for(i=t;i>0;i--)

for(j=110;j>0;j--);

}

main()

{

unsigned char temp;

temp=0xfe;

while(1)

{

P1=temp;

delay(500); //延时

temp=_crol_(temp,1); //点亮LED的位置循环左移一位

}

}

#include "REG52H"

// 显示花样流水灯编码

const unsigned char Expetr_ROM[] = { 0xFD, 0xF7, 0xDF, 0x7F, 0xFE, 0xFB, 0xEF, 0xBF

} ;

// 延时1ms

void Delay_1ms(unsigned int Cnt)

{

unsigned int x, y;

for(x = Cnt; x > 0; x--)

for(y = 120; y > 0; y--);

}

int main(void)

{

unsigned char i;

while(1)

{

for(i = 0; i < 8; i++)

{

P1 = Expetr_ROM[i];

Delay_1ms(500);

}

}

}

#include<reg52h>

#include<intrinsh>

#define uint unsigned int

#define uchar unsigned char

#define led P1

uint delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

{

for(y=110;y>0;y--);

}

}

void main()

{

uint i,temp,j;

for(i=0;i<3;i++)

{

led=0xAA;

delay(300);

led=0x55;

delay(300);

}

for(i=0;i<3;i++)

{

temp=0xfe;

for(j=0;j<8;j++)

{

led=temp;

delay(300);

temp=_crol_(temp,1);

}

temp=0xbf;

for(j=0;j<6;j++)

{

led=temp;

delay(300);

temp=_cror_(temp,1);

}

}

for (i=0;i<3;i++)

{

led=0x7e;

delay(300);

led=0xbd;

delay(300);

led=0xdb;

delay(300);

led=0xe7;

delay(300);

}

for (i=0;i<3;i++)

{

led=0xe7;

delay(300);

led=0xdb;

delay(300);

led=0xbd;

delay(300);

led=0x7e;

delay(300);

}

for (i=0;i<3;i++)

{

led=0xff;

delay(300);

led=0x00;

delay(300);

}

led=0xff;

while(1);

}

现象说明:

8个灯,间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环

三次;再分别从两边往中间流动三次;再从中间往两边流

动三次;8个全部闪烁3次;关闭发光管,程序停止。

晶振为110592MHz

我给你个简单的例子:

#include <AT89X51H> //预处理文件里面定义了特殊寄存器的名称如P1 口定义为P1

void main(void)

{

//定义花样数据

const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

0xE7,0xDB,0xBD,0x7E,0xFF};

unsigned int a; //定义循环用的变量

unsigned char b; //在C51 编程中因内存有限尽可能注意变量类型的使用

//尽可能使用少字节的类型,在大型的程序中很

受用

do{

for (b=0; b<32; b++)

{

for(a=0; a<30000; a++); //延时一段时间

P1 = design[b]; //读已定义的花样数据并写花样数据到P1 口

}

}while(1);

}

程序中的花样数据可以自以去定义,因这里我们的LED 要AT89C51 的P1 引脚为低电平才

会点亮,所以我们要向P1 口的各引脚写数据O 对应连接的LED 才会被点亮,P1 口的八个引

脚刚好对应P1 口特殊寄存器的八个二进位,如向P1 口定数据0xFE,转成二进制就是

11111110,最低位D0 为0 这里P10 引脚输出低电平,LED1 被点亮。如此类推,大家不难算

出自己想要做的效果了。

留个邮箱给你发个入门文档

代码已修改,并仿真通过。

#include<reg51h>     //包含单片机寄存器的头文件

#include "intrinsh"

#define uchar unsigned char

#define uint unsigned int

 sbit CLK=P1^0;

 sbit IN =P1^1;

//uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uint code w[]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};//新建了一个流水表

void delay(uint i)

{

    uint j;

    uchar k;

    for(j=i;j>0;j--)

        for(k=125;k>0;k--);

}

//发送1字节给74LS164

void send_byte(uchar temp)

{

    uchar i;

    for(i=0;i<8;i++)

    {

        if(temp & 0x80)

        {

            IN =1;

        }

        else

        {

           IN =0;

        }

        CLK = 0;

         _nop_();  //if Keil,require use intrinsh

        CLK = 1;

        

        temp=temp<<1;// temp左移1位

    }

}

//发送2字节给74LS164

void send_word(uint temp)

{

    

    send_byte((uchar)(temp>>8));//先发送高字节

    send_byte((uchar)(temp&0x00FF));//再发送低字节

}

void main(void)

{

    uint i;

    

    while(1)

    {

        for(i=0;i<16;i++)

        {

            //send_byte(a[i]);

            send_word(w[i]);//发送2字节

            delay(4000);

            

           

        }

    }

}

//右边补0,直接移位就可以temp<,=1; 如果流水灯只有一个亮,下面的程序就是对的,移位之后补1

#include "reg51h"

void delay(unsigned char m);

main()

{

unsigned char temp;

temp=0xfe; //temp=1111 1110,使得P1口的某个引脚为低电平(亮)

while(1)

{

P1=temp; //P1口的数据来自temp,而temp的数据是不断变化的

temp=temp<<1 | 0x01;//temp向左移动一位,右边补0

if(temp==0xff)

temp=0xfe; //( 这里就是要填补的空!!!!!!!!!)

delay(20);

}

}

void delay(unsigned char m) //延时子程序

{

unsigned char i,j,k; //定义字符型变量,范围为0至255

for (i=0;i<m;i++)

{

for (j=0;j<100;j++)

{

for (k=0;k<100;k++);

}

}

以上就是关于C语言C51单片机花样流水灯程序分析注释全部的内容,包括:C语言C51单片机花样流水灯程序分析注释、keil软件用单片机控制8个LED流水灯来回点亮(C语言程序)、单片机流水灯c语言程序。灯按从左到右2468然后1357依次循环亮。速求啊!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9303652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存