① 怎麼控制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);
}
}
}