思路:
控制8个LED灯,使用上拉方式控制,引脚高电平灯灭,引脚低电平灯亮。
这8个LED使用同一P口上的所有引脚,假设为P1口中的P1.0-P1.7共8个脚。
软件中,只需要将这些灯使用一个for循环即可。
代码
#include<reg51.h>
unsignedcharPData;//记录当前是哪个状态,值为1表示亮,输出到P口时取反
//延时,本函数是非精确延时,若需要精确延迟则需要根据本函数的汇编语句进行精确计算后调整循环体次数
voiddelay(unsignedintms){
unsignedchari;
while(ms--){
for(i=0;i<120;t++){
;
}
}
}
voidmain(){
unsignedchari=0;
PData=0x00;//全灭状态
while(1){//无限循环亮灭状态
for(i=0;i<8;i++){//从最低位循环到不是常亮的最高位
P1=~(PData+(1<<i));//第i位亮
delay(500);
P1=~PData;//第i位灭
delay(500);
}
}
}
B. 请运用位移法利用单片机的P2口实现的8个LED流水灯功能。要求:1.流水的顺序是从左到右 2.每次只亮一盏灯
用红色的替换对应语句,即可得反方向了,去试试吧;
C. 关于单片机流水灯左移右移的问题
51单片机
的左移右移,首先在开始要调用"intrins.h"的文件包,这个文件包含_cror_(右移),_crol_(左移);然后通过for语句来控制;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(k=250;k>0;k--);
理解这三句,第一句是指:m=20;m>0然后m--是真就执行:
for(n=20;n>0;n--)
for(k=250;k>0;k--);
这两句,m--一直减,减一次,里面就执行一次,这里是20次。
流水灯的左右移,第一用"intrins.h"的文件包,第二要要会定义赋值变量,第三延时,这是关键。
D. 单片机流水灯设计,使八个led灯右移
#include <AT89X52.h> //调用51单片机的头文件
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
unsigned int a; //定义一个int型变量,做延时用
P0=0;
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
for(a=0;a<20000;a++); //延时若干时间,具体时长暂不理会
if(P0==0)
P0=0x01;
else
P0=P0<<1; //将PO左移
}
}
E. 单片机点亮一个灯泡时,为什么要进行左移一个单位呢,这里有点不懂还望大神解答
这个是为了让时间长一点,单片机运行速度还是比较快的。你看只有led8_one的最高位是1,才点亮灯。其他的时间是关闭灯的。每次移位就是为了让led8_one的那个1向最高位动一次。
F. 求用C语言编程实现51单片机的LED灯移动
#include<reg51.h>
#define uchar unsigned char
sbit c10=P1^0;
sbit c11=P1^1;
sbit c12=P1^2;
sbit c13=P1^3;
uchar led1,led3;
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
uchar keyval=0xff;
led1=0xfe;
led3=0xf8;
while(1)
{
if(c10==0)
{
delay(10);
if(c10==0)
{
while(c10==0);
keyval=0;
}
}
if(c11==0)
{
delay(10);
if(c11==0)
{
while(c11==0);
keyval=1;
}
}
if(c12==0)
{
delay(10);
if(c12==0)
{
while(c12==0);
keyval=2;
}
}
if(c13==0)
{
delay(10);
if(c13==0)
{
while(c13==0);
keyval=3;
}
}
switch(keyval)
{
case 0:
P0=led1;
led1=(led1<<1)|0x01;
if(led1==0xff)led1=0xfe;
delay(100);
case 1:
P0=led1;
led1=(led1>>1)|0x80;
if(led1==0xff)led1=0x7f;
delay(100);
case 2:
P0=led3;
led3=(led3<<1)|0x01;
if((led3&0xf0)==0x30)led3=0x3e;
if((led3&0xf0)==0x70)led3=0x7c;
if((led3&0xf0)==0xf0)led3=0xf8;
break;
case 3:
P0=led3;
led3=(led3>>1)|0x80;
if((led3&0x0f)==0x0c)led3=0x7c;
if((led3&0x0f)==0x0e)led3=0x3e;
if((led3&0x0f)==0x0f)led3=0x1f;
break;
default:break;
}
}
}