思路:
控制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;
}
}
}