❶ 若51單片機P1口接了8個LED,編寫程序完成跑馬燈程序要求大約1秒變化一次
//假設晶振12MHZ,P1控制8個LED低電平亮
#include "reg51.h"
unsigned int YSJS=0;
signed char LED=0XFE;
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==2000) //500uS*2000=1000000uS=1S
{
P1 = LED;
LED=LED<<1;
LED=LED | 1
if(LED==0XFF)LED=0XFE;
YSJS = 0
}
}
❷ 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的流程圖,這種流程圖不知怎麼寫好,而且寫出來基本是對每行的代碼的解釋。
❸ 單片機中的流水燈,花樣燈,跑馬燈
等 到 你單片機學到一定程度就理解了,這些燈只是按照自己的意思來亮,至於名稱都無所謂
❹ 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();
}
}
}
(4)51單片機跑馬燈擴展閱讀:
Proteus 自從有了單片機也就有了開發系統,隨著單片機的發展開發系統也在不斷發展。 keil是一種先進的單片機集成開發系統。它代表著匯編語言單片機開發系統的最新發展,首創多項便利技術,將開發的編程/模擬/調試/寫入/加密等所有過程一氣呵成,中間不須任何編譯或匯編。
❺ 用51單片機(匯編語言寫)寫一個跑馬燈程序知道的幫個忙寫寫。
急用!請教!!!
用匯編語言程序,程序功能:實現方向可控的跑馬燈
編程要求:用八個LED發光二極體實現跑馬燈(即:8個燈依次輪流發光,每次只亮一個燈),系統啟動後,跑馬燈右向流轉,按下K1鍵,則反向流轉,再按則再反向……。接線方法:流水燈接P0口,按鍵K1可自選P1~P3任一引腳。
❻ 51單片機跑馬燈函數,參數是燈的個數,這個函數怎麼寫(C語言版的)
51單片機可以用十六進制數控制一個口,假如使用P1口,一個燈就是11111110,低電平燈亮,把這個二進制數轉成十六進制,按位取反,兩個燈同理
❼ 51單片機 跑馬燈 所需器材
單片機,晶振,電容,電阻,發光二極體,7805,直流電源,萬用板,單片機燒寫器,電腦等
❽ 51單片機跑馬燈電路圖(左右來回循環),8個led燈分別接在P2口,c程序、模擬圖如下。電路並未出現預期效果
電路:
一般的單片機 和 TTL集成電路晶元,都是灌電流能力強,拉電流能力極弱。
為此,應該用輸出低電平,來帶動負載。
而你的電路,是用高電平帶動LED發光的,模擬,也許還行;實際的電路,LED是不會亮的。
❾ 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燈就不亮
程序已經過調試可用
模擬如下:
❿ 用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); /*延時*/ } }