51单片机,让8个led从头亮到尾再从尾亮到头,有没有更简单的方法呢。
答案:6 悬赏:30 手机版
解决时间 2021-11-07 19:43
- 提问者网友:你挡着我发光了
- 2021-11-07 16:27
51单片机,让8个led从头亮到尾再从尾亮到头,有没有更简单的方法呢。
最佳答案
- 五星知识达人网友:过活
- 2021-11-07 17:42
void main (void)
{
unsigned int i, j = 0;
unsign char mask = 1;
while (1)
{
P1 = ~mask;
for(i=0;i<2000;i++);
P1 = 0xff;
for(i=0;i<2000;i++);
if (!j)
{
if (mask == 0x80)
j = 1;
else
mask <<= 1;
}
else
{
if (mask == 0x01)
j = 0;
else
mask >>= 1;
}
}
}
{
unsigned int i, j = 0;
unsign char mask = 1;
while (1)
{
P1 = ~mask;
for(i=0;i<2000;i++);
P1 = 0xff;
for(i=0;i<2000;i++);
if (!j)
{
if (mask == 0x80)
j = 1;
else
mask <<= 1;
}
else
{
if (mask == 0x01)
j = 0;
else
mask >>= 1;
}
}
}
全部回答
- 1楼网友:从此江山别
- 2021-11-07 20:47
是不是下面这个最简单:
#include
#include
void main (void)
{
unsigned char mask = 1, j = 0;
unsigned int i;
while (1) {
if (j < 7) mask = _crol_(mask, 1);
else mask = _cror_(mask, 1);
P1 = ~mask; for(i = 0; i < 30000; i++);
P1 = 0xff; // for(i = 0; i < 10000; i++);
j++;
j = j % 14;
}
}
#include
#include
void main (void)
{
unsigned char mask = 1, j = 0;
unsigned int i;
while (1) {
if (j < 7) mask = _crol_(mask, 1);
else mask = _cror_(mask, 1);
P1 = ~mask; for(i = 0; i < 30000; i++);
P1 = 0xff; // for(i = 0; i < 10000; i++);
j++;
j = j % 14;
}
}
- 2楼网友:蕴藏春秋
- 2021-11-07 20:33
#include
//这里既然用到每个P1口,就不用sbit每个P1口了,实可以对P1口直接赋值的。。
int delay(int a)
{
int b,c;
for(b=0;b for(c=0;c }//延时函数
main()
{
int d;
P1=0;//令P1口输出0,灯全不亮。
delay(100);//延时一下
P1=0x01;//延时后,让P1的第一个灯亮。这也是下面程序循环移动的条件,不然P1=0,移位就没用了。
while(1)//让灯循环跑起来,即进去死循环。
{
for(d=0;d<7;d++)
{
delay(100);
P1=P1<<1;//此时P1为00000001,开始循环左移动7次,最终为10000000
}
for(d=0;d<7;d++)
{
delay(100);
P1=P1>>1;//此时P1为10000000,开始循环右移动7次,最终为00000001
}
}
}
刚刚用我的学习板下载了HEX,虽然我的是P0口输出,但实验结果符合您的要求,现在改成P1口,应该OK。如果你硬件没描述错的话,你把上述程序灌到单片机看看。另外请注意我delay函数的安排,有的时候你出不来自己想要的效果,很可能是把延时函数安排错位置了。如有不懂,请继续咨询我。
辛苦完成,希望采纳。
//这里既然用到每个P1口,就不用sbit每个P1口了,实可以对P1口直接赋值的。。
int delay(int a)
{
int b,c;
for(b=0;b for(c=0;c }//延时函数
main()
{
int d;
P1=0;//令P1口输出0,灯全不亮。
delay(100);//延时一下
P1=0x01;//延时后,让P1的第一个灯亮。这也是下面程序循环移动的条件,不然P1=0,移位就没用了。
while(1)//让灯循环跑起来,即进去死循环。
{
for(d=0;d<7;d++)
{
delay(100);
P1=P1<<1;//此时P1为00000001,开始循环左移动7次,最终为10000000
}
for(d=0;d<7;d++)
{
delay(100);
P1=P1>>1;//此时P1为10000000,开始循环右移动7次,最终为00000001
}
}
}
刚刚用我的学习板下载了HEX,虽然我的是P0口输出,但实验结果符合您的要求,现在改成P1口,应该OK。如果你硬件没描述错的话,你把上述程序灌到单片机看看。另外请注意我delay函数的安排,有的时候你出不来自己想要的效果,很可能是把延时函数安排错位置了。如有不懂,请继续咨询我。
辛苦完成,希望采纳。
- 3楼网友:woshuo
- 2021-11-07 19:02
#include
void delay1s()
{
unsigned char i;
TMOD=0x00;
for(i=0;i<0xc8;i++)
{
TH1=0x63;
TL1=0x18;
TR1=1;
while(!TF1);
TF1=0;
}
}
void main()
{
unsigned char led[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
unsigned char j;
TMOD=0x00;
while(1)
{
for(j=0;j<16;j++)
{
P0=led[j];
delay1s();
}
}
}
想要灯怎么亮改括号里的数组就可以了,希望可以帮到你
void delay1s()
{
unsigned char i;
TMOD=0x00;
for(i=0;i<0xc8;i++)
{
TH1=0x63;
TL1=0x18;
TR1=1;
while(!TF1);
TF1=0;
}
}
void main()
{
unsigned char led[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
unsigned char j;
TMOD=0x00;
while(1)
{
for(j=0;j<16;j++)
{
P0=led[j];
delay1s();
}
}
}
想要灯怎么亮改括号里的数组就可以了,希望可以帮到你
- 4楼网友:長槍戰八方
- 2021-11-07 18:46
左移右移
- 5楼网友:夜风逐马
- 2021-11-07 18:07
我比较喜欢用" 循环 + 移位" , 应该还有更简单的,
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯