❶ 51單片機跑馬燈程序
不好意思,延時用了樓上的。keil下編譯OK。假設P1接燈。
ORG00H
SJMPSTART
ORG30H
START:
MOVA,#00
SETBC
MOVR0,#9
;從左到右
LOOP1:
RLCA
MOVP1,A
ACALLDELAY
DJNZR0,LOOP1
;從右到左
MOVR0,#9
LOOP2:
RRCA
MOVP1,A
ACALLDELAY
DJNZR0,LOOP2
SJMPSTART
DELAY:
MOVR6,#20
DELAY_0:MOVR5,#255
DJNZR5,$
DJNZR6,DELAY_0
RET
這個程序比較簡單了。再精簡,只能精簡一句,將MOVP1,A放在DELAY函數里。這樣減少一行。
簡單介紹一下:
首先就是你要輪流點亮,就是將1循環一圈,因為你要全滅一次,所以用到CY。
RG00H
SJMPSTART
ORG30H
START:
MOVA,#00;//清空A寄存器
SETBC;//將CY置1,然後帶進位左移就會進入將A的b0
MAINLOOP:;//大循環起始
MOVR0,#9;設置移位次數,要滅一次,所以設置為9
;從左到右
LOOP1:
RLCA;帶進位左移一次;第一次移位結果為01
MOVP1,A;將A中值放入P1點亮對應LED;該句可放在DELAY里,然後從右到左也去掉該句
ACALLDELAY;延時,保持燈亮一段時間,自己根據實際情況調整一下。
DJNZR0,LOOP1;循環,點亮下一個燈,最後一次,A為0,將全滅一次,CY為1
;從右到左
MOVR0,#9;設置循環次數
LOOP2:;循環起始表示
RRCA;帶進位右移,第一次結果為80H
MOVP1,A;更新P1點亮對應LED
ACALLDELAY;延時,保持燈亮一段時間
DJNZR0,LOOP2;循環,點亮下一個燈
SJMPMAINLOOP;循環,重新開始下一輪
如果你是管腳輸出低LED才亮,只需將MOVA,#00和SETBC改為MOVA,#0FFH和CLRC即可。
方案2:位定址區00做標志,為0從左到右,該標志為1從右到左
ORG00H
SJMPSTART
ORG30H
START:
MOVA,#00
SETBC
MOVR0,#9
CLR00H
LOOP1:
RLLED:
JB00H,RRLED
RLCA
AJMPDISP
RRLED:
RRCA
DISP:
MOVP1,A
ACALLDELAY
DJNZR0,LOOP1
CPL00H
AJMPSTART
DELAY:
MOVR6,#20
DELAY_0:MOVR5,#255
DJNZR5,$
DJNZR6,DELAY_0
RET
下面是方案1的流程圖,這種流程圖不知怎麼寫好,而且寫出來基本是對每行的代碼的解釋。
❷ 單片機,跑馬燈
void delay(unsigned char i)
{
unsigned char m;
for(i;i>0;i--)
{
for(m=120;m>0;m--);
}
}
和
void delay()
{
unsigned int i,m;
for(i=110;i>0;i--)
{
for(m=120;m>0;m--);
}
}
延時時間長短不一樣
❸ 怎麼用單片機按鍵控制循環跑馬燈
我剛好寫過一個這樣的程序,參考一下吧,希望對你有幫助
/*硬體電路連接:流水燈接在P0口, 陽極接高電平,
陰極接P0口,4個按鍵分別接P3.4,P3.5, P3.6,P3.7 ,按下時是低電平 */
#include <regx51.h>
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
int a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//左流水燈數組
int b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//右流水燈數組
int c[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; //逐盞點亮,逐盞滅掉數組
//************************************************************************************************************
void delay()
//延時子程序
{int i;
for(i=0;i<30000;i++);
}
//**********************************************************************************************************
void aa() //實現要求(1)的子程序(key1按下時流水燈,彈開時全滅)
{ int i=0;
while(!key1) //判斷是否有鍵按下
{P0=a[i];delay();i++;if(i==8)i=0;}//流水燈
}
//*************************************************************************************************************
void bb() // 實現要求(2)的子程序(key2按下時實現計數功能,彈開時停止計數;)
{
while(!key2){P0--;delay();if(P0==0)P0=0xff;} //判斷是否有鍵按下,按下則計數器加1
}
//*************************************************************************************************************
void cc() // 實現要求(3)的子程序(key3按下時實現逐盞點亮,逐盞滅掉)
{ int i=0;
P0=0xff ;// 發光二極體全滅
while(!key3) //判斷是否有鍵按下
{P0=c[i];delay();i++;if(i==16)i=0;}//逐盞點亮,逐盞滅掉
}
//*************************************************************************************************************
void dd() // 實現要求(4)的子程序(key4按第一次按下,左流水,第二次按下,右流水,第三次按下,熄滅)
{ int i=0,j=0,k=0,h=0;
loop:P0=0xff;
if(key4==0)
//第一次判斷是否有鍵按下
{for(i=0;i<30000;i++); //延時防抖動
if(key4==1)
//判斷按鍵是否彈起
while(1){P0=a[j];delay();j++;if(j==8)j=0; //左流水燈
if(key4==0)
//第二次判斷是否有鍵按下
{for(i=0;i<30000;i++);
//延時防抖動
if(key4==1)
//判斷按鍵是否彈起
while(1){P0=b[k];delay();k++;if(k==8)k=0; //右流水燈
if(key4==0)
//第三次判斷是否有鍵按下
{for(i=0;i<30000;i++);
//延時防抖動
if(key4==1)
//判斷按鍵是否彈起
goto loop;
//跳轉到LOOP處,即P3=0xff,此時燈全滅
}}}}}}
//****************************************************************************************************************
main()
{while(1){P0=0xff;
while(!key1)aa();
while(!key2)bb();
while(!key3)cc();
while(!key4)dd();
}}
❹ 單片機跑馬燈
#include#include#defineucharunsignedchar#(uintx){uchari;while(x--){for(i=0;i
❺ 單片機跑馬燈!
這只是個宏定義,
#define DataPort P0
#define LedPort P3 //自己定義,根據你連的引腳
注意上邊兩句,現在#define LedPort P3 //自己定義,根據你連的引腳
是P3,就是LedPort相當於P3,當改成#define LedPort P1時,LedPort相當於 P1,
請參考C語言宏定義部分知識
❻ 單片機編寫跑馬燈指令 在線等
#include<reg51.h>
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
sbit led_k=P1^0;
sbit =P1^1;
sbit we=P1^2;
void delayms(unsigned int i);/*延時函數*/
main()
{
led_k=1;/*打開8個led的總開關*/
=0;
we=0;
while(1)
{
led1=0;
delayms(500);
led1=1;
delayms(500);
led2=0;
delayms(500);
led2=1;
delayms(500);
led3=0;
delayms(500);
led3=1;
delayms(500);
led4=0;
delayms(500);
led4=1;
delayms(500);
led5=0;
delayms(500);
led5=1;
delayms(500);
led6=0;
delayms(500);
led6=1;
delayms(500);
led7=0;
delayms(500);
led7=1;
delayms(500);
led8=0;
delayms(500);
led8=1;
delayms(500);
}
}
void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
這是逐個點亮的,給你思路,你只要將四個燈點亮寫在一塊,再延遲後點亮就OK
❼ 單片機跑馬燈如何編程!
如果是一個位元組型的數據控制LED燈的話,且是1控制LED燈滅,0控制燈亮。
從滅到亮,先是0xFF,然後開始左移,最終移到0x00,就是全亮了。
從亮到滅,先是0x00,然後左移並且加1,重復此工作就是0xFF了
按照上面的思想,你自己應該可以搞定的。
❽ 單片機中的流水燈,花樣燈,跑馬燈
等 到 你單片機學到一定程度就理解了,這些燈只是按照自己的意思來亮,至於名稱都無所謂
❾ 單片機跑馬燈代碼
//假設晶振12MHZ,P1控制8個LED低電平亮
#include "reg51.h"
unsigned int YSJS=0;
signed char LED=0XFF;
void main(void)
{
TMOD |= 0X10; //定時器1工作於方式1,16位定時器
TH1 = 0XFE; //定時器1定時時間=500uS
TL1 = 0X0C;
ET1 = 1; //使能定時器1中斷
TR1 =1;
EA =1; //開總中斷
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定時器1中斷函數使用默認寄存器組
{
TH1 = 0XFE; //定時器1定時時間=500us
TL1 = 0X0C;
YSJS++;
if(YSJS==1000) //500uS*1000=500000us=0.5s,可調整
{
P1 = LED;
LED=LED<<1
if(LED==0X00)LED=0XFF;
YSJS = 0
}
}