单片机c语言for循环流水灯,51单片机入门经验分享3-通过流水灯讲解for循环语句...

本文介绍了如何使用51单片机的C语言编程,通过for循环实现流水灯效果,详细解释了for循环的工作原理,并探讨了位操作符如左移、右移和取反在实现过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上一篇帖子,继续来看,既然我们会点亮一个小灯,并可以让其闪烁了,那么我们就尝试着点亮流水灯好了,让8个小灯,从左到右,从右往左来回流动,还是在上一个程序的基础上来修改,很简单依次赋值即可实现。

while(1)

{

P2 = 0XFE;//1111_1110;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0XFD;//1111_1101;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0XFB;//1111_1011;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0XF7;//1111_0111;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0XEF;//1110_1110;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0XDF;//1101_1111;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0XBF;   //1011_1110;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0X7F;   //0111_1111;

Delay500ms();//500ms延时 11.0592MHZ

P2 = 0XBF;     //1011_1110;

Delay500ms();  //500ms延时 11.0592MHZ

P2 = 0XDF;     //1101_1111;

Delay500ms();  //500ms延时 11.0592MHZ

P2 = 0XEF;     //1110_1110;

Delay500ms();  //500ms延时 11.0592MHZ

P2 = 0XF7;     //1111_0111;

Delay500ms();  //500ms延时 11.0592MHZ

P2 = 0XFB;     //1111_0111;

Delay500ms();  //500ms延时 11.0592MHZ

P2 = 0XFD;     //1111_1101;

Delay500ms();  //500ms延时 11.0592MHZ

}

这样弄,虽然很好理解,但是代码显得太冗长了,我们接触下for循环语句,先用for语句来实现我们想要的功能。代码修改如下:

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

{

P2 = ~(0X01 << i);

Delay500ms();//500ms延时 11.0592MHZ

}

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

{

P2 = ~(0X40 >> i);

Delay500ms();//500ms延时 11.0592MHZ

}

用了for循环左移和右移的办法,配合取反实现的,还有一种办法,更简单可以实现来回循环,这便是循环左移和循环右移指令

/*******************************************************************

* 文件名 main函数入口

* 描述:

* 功 能

* 作者:大核桃

* 版本号:V1.00(2018.09.17)

********************************************************************/

void main(void)

{

uint8 i = 0;

uint8 temp;

MCU_Port_Init();//端口模式初始化函数

//上电IO默认是0

LED0 = 1;//输出1

LED1 = 0;

LED2 = 0;

LED3 = 0;

LED4 = 0;

LED5 = 0;

LED6 = 0;

LED7 = 0;//

temp = 0XFE;

while(1)

{

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

{

P2 = temp;

temp = _crol_(temp,1);

Delay500ms();//500ms延时 11.0592MHZ

}

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

{

P2 = temp;

temp = _cror_(temp,1);

Delay500ms();//500ms延时 11.0592MHZ

}

}

这一节,用到了for循环这个知识点,for语句的用法在C语言课本的第120页,详细的了解可以看C语言这本书,我们只列举一个实际例子来说明C语言的流程,就拿下面的代码来说吧。

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

{

P2 = ~(0X01 << i);

Delay500ms();//500ms延时 11.0592MHZ

}

首先i = 0;是给变量赋初值,i<8是循环条件,i++是变量累加,先来看看i = 0;的时候,这个时候判断下语句P2 = 0XFE,然后0 < 8条件成立,i++;

//  i = 0;的时候

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

{

P2 = ~(0X01 << 0);

Delay500ms();//500ms延时 11.0592MHZ

}

//  i = 1;的时候

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

{

P2 = ~(0X01 << 1);

Delay500ms();//500ms延时 11.0592MHZ

}

当 i= 1;的时候,P2 = 0XFD,依然1<8成立,然后i++;

当 i= 2;的时候,P2 = 0XFB,依然2<8成立,然后i++;

当 i= 3;的时候,P2 = 0XF7,依然3<8成立,然后i++;

当 i= 4;的时候,P2 = 0XEF,依然4<8成立,然后i++;

当 i= 5;的时候,P2 = 0XDF,依然5<8成立,然后i++;

当 i= 6;的时候,P2 = 0XBF,依然6<8成立,然后i++;

当 i= 7;的时候,P2 = 0X7F,依然7<8成立,然后i++;

当 i= 8;的时候,8<8不成立,跳出循环执行下面的语句;

这样我们就把for循环的流程给分解了,首先就是赋初值,然后执行循环,循环完之后变量累加,回过头看条件是否成立,如果条件继续成立,则继续循环,累加变量,直到条件不满足为止。

关于取反符号

~这个符号,可以读作取反,注意这不是!(非),数字电路中的 &(按位与) , |  (按位或),!(非)和 &&(逻辑与),||(逻辑或),和~(取反)是不一样的,按位与顾名思义,是位和位之间运算,他们运算是能够得出一个具体的结果的,而逻辑与是对左右两个表达式的真假进行判断,得出的结果不是真就是假。

关于与或非的真值表

与或非是数字电路最基本的知识点,必须要掌握这个知识点。

&, 就好比乘法一样,如果A和B都为1,那么结果就是1,如果有一个为0,则输出都是0,。

|,   就好比加法运算,如果A或者B有一个是1,那么结果就是1,否则就是0;

!,     输入为0时,输出为1,输入为1时,输出为0;

!|,或非门,只有A和B输入全部位0时,输出才为1,否则全为0;

!&,与非门,只有A和B全部输入为1时,输出才为0,否则全为1;

异或门,如果A和B相等时,输出都是0,否则输出都是1。

1、一盏一盏:第一盏先亮--延时--熄灭--延时--下一盏; 2、利用数组方法点亮:定义一个数组(即0xfe,0xfd,0xfb,0xf7,0xef,oxdf,0xbf,0x7f:依次代表只有第一盏,第二盏....亮),再利总线,按顺序点亮八盏3、利用移位方法点亮:(1)、利用移位运算和按位或运算,依次点亮八盏; (2)、包含intrins头文件(里面含有移位函数),使用相应的左移或右移函数进行移位, 下面是代码和注释,详细解释了点亮流水灯的思路,附件含有源代码和仿真文件,有需要的可以下载 //方式0控制流水灯循环点亮 #include //包含51单片机寄存器定义的头文件 #include //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量 sbit P17=P1^7; /************************************************************** 函数功能:延时约150ms **************************************************************/ void delay(void) { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; } /************************************************************** 函数功能:发送一个字节的数据 **************************************************************/ void Send(unsigned char dat) { P17=0; //P1.7引脚输出清0信号,对74LS164清0 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期,保证清0完成 P17=1; //结束对74LS164的清0 SBUF=dat; //将数据写入发送缓冲器,启动发送 while(TI==0) //若没有发送完毕,等待 ; TI=0; //发送完毕,TI被置“1”,需将其清0 } /******************************************* 函数功能:主函数 ******************************************/ void main(void) { unsigned char i; SCON=0x00; //SCON=0000 0000B,使串行口工作于方式0 while(1) { for(i=0;i<8;i++) { Send(Tab[i]); //发送数据 delay(); //延时 } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值