1. 用C51單片機控制12個LED流水燈的C語言程序怎麼寫
#include "REG52.H"
//控制引腳定義
sbit LED1 = PX.X; //P0.0-P3.7任意引腳
.... .... .......
sbit LED12 = PX.X;
//宏定義燈亮燈滅
#define LED1_ON( ) LED1 =0 //陽極接電源
#define LED1_OFF( ) LED1 =1 //陽極接電源
....... ............. .............
#define LED12_ON( ) LED12 =0 //陽極接電源
#define LED12_OFF( ) LED12 =1 //陽極接電源
void Init_GPIO( )//埠引腳初始化,關閉所有指示燈
{
LED1_OFF( ) ;
..............
LED12_OFF( ) ;
}
void Delay_ms( u16 dat ) //延時函數
{
u16 i, j;
for(i = dat; i>0; i--)
{
for (j=300; j>0; j--);
}
}
int main( ) //主函數
{
Init_GPIO( );//引腳初始化
while(1) //大循環
{
LED1_ON( );//點亮第一個LED
LED2_OFF( );
.............
LED12_OFF( );
Delay_ms(1000);//延時 參數自己可以根據晶振頻率自己調節
LED1_OFF( ); //點亮第二個LED
LED2_ON( );
LED3_OFF( );
.............
LED12_OFF( );
Delay_ms(1000);
............. //按照上面修改;
LED1_OFF( );//點亮第十二個LED
LED2_OFF );
LED3_OFF( );
.............
LED12_ON( );
Delay_ms(1000);
}
}
2. 51單片機流水燈程序
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//點亮第一個燈
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延時1秒
for(i = 0;i < 110; ++i)
{
for(j = 0; j < 1000; ++j)
{
;//什麼也不做
}
}
//點亮第二個燈
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//點亮剩餘的燈
//省略……
while(1);
}
流水燈幾點說明:
void:因為該延時函數不需要返回值,所以寫為void
delay1s:該函數的函數名,命名需要符合C語言的標識符命名規則。
(): 不需要傳入參數,所以括弧中為空
至此我們可以把流水燈程序寫為以下形式:
3. C51單片機編程,按鍵控制流水燈
#include "reg51.h"
unsigned char led[]={0xfe,0xfd,0xfb,0xf7}; //LED燈的花樣數據
void delay(unsigned char time){ //延時函數
unsigned int j=15000;
for(;time>0;time--)
for(;j>0;j--);
}
void main(){
bit dir=0,run=0; //標志位定義及初始化
char i;
while(1){
switch (P0 & 0x0f){ //讀取鍵值
case 0x0e:run=1;break; //K1動作,設run=1
case 0x0d:run=0,dir=0;break; // K2動作,設run=dir=0
case 0x0b:dir=1;break; //K3動作,設dir=1
case 0x07:dir=0;break; //K4動作,設dir=0
}
if (run) //若run=dir=1,自上而下流動
if(dir)
for(i=0;i<=3;i++){
P2=led[i];
delay(200);
}
else
for(i=3;i>=0;i--){ //run=1,dir=0,自下而上流動
P2=led[i];
delay(200);
}
else P2=0xff; //若run=0,全部燈滅
}
}
4. 51單片機LED流水燈怎麼實現從兩邊同時逐個點亮到中間,又從中間逐個熄燈到兩邊
簡單點的,用表格,事先計算好,放到ROM中,用的時候逐行編譯輸出就可以。
復雜點的,開一個緩沖區,用循環程序,根據花樣的不同,每次填充一行,並輸出,然後再計算一下行。除非表格太大,不建議這樣用。
#define len 8
char tablelist[][len] =
{
"00000000",
"10000001",
"01000010",
"00100100",
"00011000",
}
outline( char * s )
{
int i;
for(i=0; i<len; ++i )
{
if ( s[i] == '0' )
{
// 對應的燈亮
}
else
{
// 對應的燈滅
}
}
}
main()
{
for(;;)
{
outline( &tablelist[i]);
delay(..);
}
}
5. 51單片機中如何用匯編語言編寫流水燈
流水燈就是51單片機控制led燈依次點亮的控制方式。具體程序如下:
ORG 0000H;復位啟動
AJMP START;
ORG 001BH;T1中斷
AJMP T1INT;
;定義變數========================
YSJSEQU 30H;延時計數器
LEDEQU 31H;LED控制緩沖器
;主程序==========================
START:MOV LED,#0FEH;初始化數據
MOV YSJS,#0;
MOV TMOD,#10H;定時器1工作於方式1,16位定時器
MOV TL1,#0B0H;設置定時初值
MOV TH1,#3CH;定時時間=50mS
SETB ET1;使能定時器1中斷
SETB TR1;啟動定時器1
SETB EA;開總中斷
MOV P1,LED;初始化流水燈
LOOP:JMP LOOP;循環等待中斷
T1INT:PUSH PSW;定時器1中斷程序
PUSH ACC;保護現場
MOV TH1,#3CH;定時時間=50mS
MOV TL1,#0B0H;
INC YSJS;
PUSH ACC;保護ACC
MOV A,YSJI;
CJNE A,#2,QT1;50mS*2=100mS
MOV P1,LED;
MOV A,LED;
RL A;累加器A的值循環左移1位
MOV LED,A;
MOV YSJS,#0;
QT1:POP ACC;恢復現場
POP PSW;
RETI;返回主程序
END;匯編程序結束
(5)基於c51單片機流水燈設計擴展閱讀:
實現流水燈的三個方法:
第一種,匯流排方法實現流水燈。這是一種比較笨但又最易理解的方法,採用順序程序結構,用位指令控制P1口的每一個位輸出高低電平,加上延時函數,即可控制每個LED燈的亮滅。
第二種,移位方法實現流水燈採用循環程序結構編程。首先在程序開始給P1.0口送一個低電平,其它位為高。然後延時一段時間再讓低電平往高位移動,這樣就實現「流水」的效果了。
第三種,庫函數實現流水燈。利用左移函數進行。
6. 51單片機流水燈用C語言編寫的設計程序
其實很簡單
就是用_cror_()函數或者 _crol_()函數,第一個是右移第二個是左移