1. 在單片機編寫走馬燈程序中,怎樣實現當按下一個鍵使八個燈全亮,當松開按鍵時又回到原來的亮燈的程序中。
這個程序結構的問題,有很多種方法,這里提供兩種做為參考,一,以按鍵為條件做個分支(就是if else語句),按鍵無按下時運行跑馬燈,有按鍵時輸出全亮。這是初學者最容易理解的。二,程序的結構調整一下,做一個輸出的BUF,按鍵按下時填BUF全亮的數據,這時跑馬燈的數據是停在那裡的,不按下時BUF放入跑馬燈的數據,開始繼續運行,這個結構放在這實際不實用,但當很多地方同時操作同一設備時就有用了,寫大一點的程序一般都這么用,我個人的見解。
2. 51單片機 跑馬燈程序
org0000h
jmpstart
org0030h
start:
movp0,#11111110b;此時第一個燈亮
callt10s
movp0,#11111101b;此時第二個燈亮
callt10s
movp0,#11111011b
callt10s
movp0,#11110111b
callt10s
movp0,#11101111b
callt10s
movp0,#11011111b
callt10s
jmpstart;此處跳到開始即循環
;延時子程序10秒=250usX2X200X100
t10s:movr5,#100
lpr5:movr6,#200
lpr6:movr7,#250
djnzr7,$
djnzr6,lpr6
djnzr5,lpr5
ret
end
把燈的正極接電源正極即vcc負極分別接p0.0-p0.5
此時給p0送0燈就亮1燈就不亮
程序已經過調試可用
模擬如下:
3. 51單片機匯編語言編寫一個跑馬燈的程序,初學者做實驗用,具體要求如下,好了可以加分
程序1:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#5FH
LOOP:
MOV A,P2
MOV B,A
MOV P0,A
MOV P1,#0FFH
LOOP1:
LCALL DELAY
MOV C,P1.7
MOV A,P0
RLC A
MOV P0,A
MOV A,P1
RLC A
MOV P1,A
MOV A,P2
CJNE A,B,LOOP
SJMP LOOP1
DELAY:
MOV R2,#60
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
END
程序2:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#5FH
JNB P2.0,LOOP1 ;
JNB P2.1,LOOP2 ;
SJMP MAIN
LOOP1:
MOV P0,#0FEH
MOV P1,#0FFH
LOOP11:
MOV C,P1.7
MOV A,P0
RLC A
MOV P0,A
MOV A,P1
RLC A
MOV P1,A
JNB P2.1,LOOP2
SJMP LOOP11
LOOP2:
MOV P0,#0FCH
MOV P1,#0FFH
LOOP21:
MOV C,P1.7
MOV A,P0
RLC A
MOV P0,A
MOV A,P1
RLC A
MOV P1,A
JNB P2.0,LOOP1
SJMP LOOP21
DELAY:
MOV R2,#60
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
END
4. 單片機89C51用匯編製作跑馬燈P1控制8個LED(D1~D8)燈實現流水燈的效果,高手速度來
很酷的流水燈
#include <reg51.h>
typedef unsigned char uchar;
#define Ton 40
#define LED P0
sbit leds=P1^4;
sbit LED0 = P0^0;
sbit LED1 = P0^1;
sbit LED2 = P0^2;
sbit LED3 = P0^3;
sbit LED4 = P0^4;
sbit LED5 = P0^5;
sbit LED6 = P0^6;
sbit LED7 = P0^7;
unsigned char Maikuan=0;
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar Occupy_led; //占空比越大,燈越亮
bit light;
uchar m;
void Inittime()
{
TMOD = 0x02; //定時器0,工作方式2,自動重裝
TH0 = 256-Ton;
TL0 = 256-Ton;
ET0 = 1;
EA = 1;
TR0 = 1;
}
//定時器0中斷
void time0() interrupt 1 using 0
{
Maikuan++;
}
void main()
{
unsigned char i = 0,j = 0; //初始化i,j
leds=0;
Inittime();
while (1)
{
//第1,3,5,7個燈半亮,其餘的全亮。
for(i=254; i>0; i--)
{
while ( Maikuan!=20)
{
LED = 0x00;
}
while ( Maikuan!=200)
{
LED = 0x55;
}
Maikuan = 0;
}
//最難的:8個燈從第一個開始依次漸亮,直到最後一個。再從最後一個起漸暗,直到第一個。如此循環往復。
for(j = 0;j<=7;j++)
{
i = 0;
while(i!=255) // 由暗變亮
{
if( Maikuan == 0) // 點亮
{
LED = ledon[j];
}
if(Maikuan == i) // 熄滅
{
LED = 0xff;
}
if( Maikuan== 255)
{
i++;
}
}
}
for(j=7;j>=0;j--)
{
i = 0;
while(i!=255) // 由亮變暗
{
if(Maikuan == 0) // 熄滅
{
LED = 0xff;
}
if( Maikuan == i) // 點亮
{
LED = ledon[j];
}
if( Maikuan == 255)
{
i++;
}
}
}
//所有的燈逐漸從暗到全亮,再由全亮到暗。
for (m=254; m>0; m--)
{
while (Maikuan!=Occupy_led)
{
LED = 0x00;
}
while (Maikuan!=127)
{
LED = 0xff;
}
Maikuan = 0;
if (light)
{
Occupy_led++;
}
else
{
Occupy_led--;
}
if (Occupy_led==128)
{
Occupy_led = 127;
light = !light;
}
if (Occupy_led>128)
{
Occupy_led = 0;
light = !light;
}
}
}
}
5. 51單片機設計跑馬燈的程序用(c語言)編寫
|P1口接8個發光二極體共陽
#include <AT89X51.H>
unsigned char i;
unsigned char temp;
unsigned char a,b;
void delay(void)
{
unsigned char m,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
void main(void)
{
while(1)
{
temp=0xfe;
P1=temp;
delay();
for(i=1;i<8;i++)
{
a=temp<<i;
b=temp>>(8-i);
P1=a|b;
delay();
}
for(i=1;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P1=a|b;
delay();
}
}
}
(5)單片機跑馬燈設計擴展閱讀:
Proteus 自從有了單片機也就有了開發系統,隨著單片機的發展開發系統也在不斷發展。 keil是一種先進的單片機集成開發系統。它代表著匯編語言單片機開發系統的最新發展,首創多項便利技術,將開發的編程/模擬/調試/寫入/加密等所有過程一氣呵成,中間不須任何編譯或匯編。
6. 單片機跑馬燈匯編程序詳細解釋
ORG
0000H
SJMP
START
ORG
0030H
START:
MOV
A,
#0FEH
;
先讓第一個發光二極體點亮
LOOP:
MOV
P1,
A
;
從P1口輸出到發光二極體
MOV
R1,
#100
;
延時0.5秒
DEL1:
MOV
R2,
#200
DEL2:
MOV
R3,
#7
DEL3:
DJNZ
R3,
DEL3
DJNZ
R2,
DEL2
DJNZ
R1,
DEL1
RL
A
;
左移一位,點亮下一個發光二極體
LJMP
LOOP
END
這個是我寫的跑馬燈程序,沒有左右振盪,自己參考參考加上去吧
7. 用51單片機設計8個燈的跑馬燈程序拜託各位大神
/**************************************************************** 程序名稱: 八位LED雙燈右移動流水燈顯示 說明:使用本程序你必須把 SE3設置為2-3短接 SE4設置為1-2短接 *****************************************************************/ /*頭文件*/ #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char /*埠定義*/ #define led_port P0 /*定義LED顯示的數據腳*/ /*1MS為單位的延時程序*/ void delay_1ms(uchar x) { uchar j; while(x--){ for(j=0;j<125;j++) {;} } } /*主程序*/ void main() { uchar led_sdata; /*顯示寄存器*/ uchar i; while(1){ led_sdata=0xfe; /*初始化顯示寄存器為1號燈亮*/ led_port = led_sdata; /*將顯示寄存器輸出到LED埠*/ delay_1ms(200); delay_1ms(200); /*延時*/ led_sdata=0xfc; /*顯示寄存器為1.2號燈亮*/ for(i=0;i<8;i++){ led_port = led_sdata; /*將顯示寄存器輸出到LED埠*/ led_sdata = (led_sdata<<1)+1; /*將顯示寄存器數據左移1位,並將第一位置高,即熄滅*/ delay_1ms(200); delay_1ms(200); /*延時*/ } led_sdata=0xff; /*燈全滅*/ led_port = led_sdata; /*將顯示寄存器輸出到LED埠*/ delay_1ms(200); delay_1ms(200); /*延時*/ } }