⑴ 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);
另外,以後不要用 延時函數了。
⑵ 請問C51單片機的循環左移和循環右移函數中的「循環」是指什麼
C51單片機的循環左移函數是,_crol_(變數名,n),循環右移函數是,_cror_(變數名,n),函數中的「循環」是指變數的8位二進制數依次向左移一位,或向右移一位。
你比如的,取8位數,讓1111 1110循環左移一位,就是在1111 1110、1111 1101、1111 1011、1111 0111、1110 1111,等等,每移位一次,8位數向左或向右移一位。繼續移位,就會循環重復的。
⑶ 51單片機數碼管右移程序的理解問題
while(1)
{
j++;
if(j==20) //用於移動完成後顯示一段時間,這個程序上電時不會立即顯示對吧
{
j=0;
if(0==k) //K == 0時,以下程序表示在數據全部移出顯示的時候,對數碼做清零操作,以便數字能夠從左邊開始向右移動
{
for(s=0;s<8;s++) //完全循環完成後清零所有緩沖區
TempData[s]=0x00;
}
TempData[7-i]=DuanMa[k]; //把需要顯示的字元依次送緩沖區// 第一次 出來一個0,後面類推
TempData[8-i]=0x00; //不需要顯示的區域清零//由於上條語句給TempData[7]給了0的斷碼,那麼下次來的時候就要清掉,以保證只有一個數字移動。
i++;
if(i==(8-k)) //這里的不用解釋了吧,8個數碼管
{
i=0;
k++;
if(k==8)
k=0;
}
}
Display(0,8);//從第一位顯示,共顯示8位
}
⑷ 51單片機的c語言 左移右移怎麼用想用來控制流水燈,請幫忙寫個完整的c程序,參考下,埠隨意
# include "reg51.h" // 包含頭文件
#define uchar unsigned char
void delay02s(void) // 延時0.2s子程序
{
unsigned char i,j,k;
for ( i=2;i>0;i-- )
for (j=200;j>0;j-- )
for (k=250;k>0;k-- );
}
void main (void) // 主函數
{
uchar i,j;
while (1) // 死循環
{
j=0x01; // j初始化為0x01,左移初始值
for(i=0;i<8;i++) // for循環語句,完成8個循環
{
P1= ~ j; // 對變數j 中的值按位取反後,從P1口輸出
delay02s( ); // 延時0.2s
j= j<<1; // 左移1位
}
j=0x80; // 設置右移初始值j為0x80
for (i=0;i<8;i++)
{
P1= ~ j;
delay02s( );
j= j>>1; // 右移1位
}
}
}
⑸ 51單片機執行循環右移指令的問題
我是這樣想的,每個單元右移8位,然後四個單元右移,就是33H-30H,32H-33H,31H-32H,30H-31H,再左移8位,再單元左移,重復4次。
⑹ 用51單片機循環右移應該怎麼實現
你的這個數是
0111
1111
1111
1111
1111
1111
1111
1111
0x7fffffff
已經超過了51單片機的表達范圍,所以直接用命令是不行了,用一個演算法吧。
⑺ 如何實現51單片機的按鍵k1按下,LED流水燈向右移動,按鍵k2被按下,LED流水燈向左移動
51單片機實現方法:
按鍵控制標志位flag取反。
然後把下面的代碼放到循環里:
U8 temp0 = 1。
U8 temp1 = 0x80。
U8 i = 0。
if(flag == 1)。
{。
for(i=0;i<8;i++)。
{。
P1=temp0<<i。
}。
}。
else。
{。
for(i=0;i<8;i++)。
{。
P1=temp1>>i。
}。
}。
}。
對控制LED口的寄存器進行位操作,按k1左移,按K2就是右移了。
51單片機是對兼容英特爾8051指令系統的單片機的統稱。51單片機廣泛應用於家用電器、汽車、工業測控、通信設備中。因為51單片機的指令系統、內部結構相對簡單,所以國內許多高校用其進行單片機入門教學。
51單片機的特點:
同樣的一段程序,在各個單片機廠家的硬體上運行的結果都是一樣的,如ATMEL的89C51(已經停產)、89S51,PHILIPS,和WINBOND等,我們常說的已經停產的89C51指的是ATMEL公司的AT89C51單片機。
同時是在原基礎上增強了許多特性,如時鍾,更優秀的是由Flash(程序存儲器的內容至少可以改寫1000次)存儲器取代了原來的ROM(一次性寫入),AT89C51的性能相對於8051已經算是非常優越的了。
⑻ 51單片機中,將R4、R5寄存器連接起來循環向右移位一次,怎麼編這段程序
MOV A,R5
MOV C,ACC.0 ;先將R5的最低位存到CY
MOV A,R4
RRC A ;將R4帶進位右移就可以將CY的值(R5的最低位)移到R4的最高位,同時也將R4的最低位移到CY
MOV R4,A
MOV A,R5
RRC A; 將R5帶進位右移就可以將CY的值(R4的最低位)移到R5的最高位(同時也將R5的最低位移到CY)
MOV R5,A
⑼ 單片機 移位操作 右移 C語言
先說第一個問題:
比如用查表法將結果保存到變數i中,查表變數為x,則i=table[x],記住c語言裡面數組是從0開始的,比如說上面的0x01就是table[0],0x02是table[1],以此類推。
再說第二個問題:
比如說從p1.0口發送出去,則可以寫為
sbitout=p1^0;//定義out為p1.0口,這樣今後好寫程序
chari;
for(i=0;i<8;i++)
{
out=data&0x80;//因為高位在前,將它寫成二進制就明白了
data<<=1;
}
上面的程序就能搞定了;
應該是所有的單片機都有cy位(不知道浮點dsp有沒有);
c語言中左移和右移之後低位或高位自動補零,cy位也保持為零(視編譯器而定,這個得看編譯器手冊),有些編譯器提供了循環移位的函數;
還有什麼不明白的補充問題就是
⑽ 51單片機中右移指令先後區別