① 怎么控制51系列单片机流水灯先左移再右移最好有分析
#include<reg52.h>
#include <intrins.h> 头文件
#define uchar unsigned char 宏定义
uchar a,b;
uchar b=1;
uchar a=0xfe; 变量定义和初始化
void main() 主函数
{
EA=1;IT1=1;ET0=1;中断允许设置
TH0=-5000/256;
TL0=-5000%256; 赋值
TMOD=0x01;
TR0=1; 启动
while(1); 等待中断产生
}
void timer0(void) interrupt 1 using 1 中断函数
{
TH0=-5000/256;
TL0=-5000%256; 重新赋值
b=b+1; 计算时间
if(b==40) 0.5秒时间到
{
b=0; 清0
P1=a; P1口赋值 0XFE 二进制11111110 也就是第一盏亮其他灭
a=_crol_(a,1); 库函数实现循环
P1=a; 把循环后的值重新付给P1口
}
}
以上只是单方向的循环 还缺少延时函数 加在赋值后面
双向循环 可以用左移右移指令
赋值 P1口 A=A<<1 循环左移一位 A=A>>1 循环右移一位
② 51单片机LED左移完右移为什么不行
22行在while 里面,必然会循环执行,P0=~(1<<8),结果是 0xff,也就是没灯亮。
也就是说,在执行右移的时候,是先灭,亮第1颗,再灭一段时间,再右移下一颗,再灭一段时间,右移下一颗…………
#define LED_Num 8
if(cnt<LED_Num) P0=~(1<<cnt);
else P0=~(1<<(LED_Num-1<<1)-cnt);
for(i=0;i<30000;i++);
cnt=++cnt%(LED_Num-1<<1);
另外,以后不要用 延时函数了。
③ 关于单片机流水灯左移右移的问题
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"的文件包,第二要要会定义赋值变量,第三延时,这是关键。
④ 单片机点亮一个灯泡时,为什么要进行左移一个单位呢,这里有点不懂还望大神解答
这个是为了让时间长一点,单片机运行速度还是比较快的。你看只有led8_one的最高位是1,才点亮灯。其他的时间是关闭灯的。每次移位就是为了让led8_one的那个1向最高位动一次。
⑤ 单片机led左移然后右移循环亮灭的汇编语言
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
MOV R2,#8
LOOP1:
MOV P0,A
LCALL DELAY
RL A
DJNZ R2,LOOP1
MOV R2,#8
LOOP2:
MOV P0,A
LCALL DELAY
RR A
DJNZ R2,LOOP2
SJMP MAIN
DELAY:
MOV R2,#200
DLY:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DLY
RET
END
⑥ 利用51单片机某个端口实现:首先让LED灯 每两位循环左移8次,循环右移8
#include <reg52.h>
#include <intrins.h>
sbit LED7 = P1^7;
sbit LED0 = P1^0;
#define N 1000
//-------------------------------------------------------
//延时Z个ms
//-------------------------------------------------------
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
void main()
{ unsigned int i,j;
while(1)
{
P1 = 0xfc;
for(i=0;i<8;i++) //循环左移
{
P1 =_crol_(P1,2);
delay(N);
}
for(i=0;i<8;i++) //循环右移
{
P1 =_cror_(P1,2);
delay(N);
}
for(i=1;i<=10;i++) //奇、偶交替闪烁10次
{
P1 = 0xaa; //奇数0xaa
delay(N);
P1 = 0x55; //偶数0x55
delay(N);
}
for(j=0;j<8;j++) // 循环左移
{ P1 = 0xfe;
P1 =_crol_(P1,1);
delay(N);
}
for(i=0;i<8;i++) //循环右移
{ P1 = 0x7f;
P1 =_cror_(P1,2);
delay(N);
}
}
}