Ⅰ c51單片機中如何用匯編語言編寫流水燈
51單片機用匯編語言編寫流水燈程序,就是控制多個LED
,使其在特定時間間隔內,只有一個LED
發光,其他熄滅,用這種方式順序移動點亮LED的位置,就形成了流水燈的效果。以下是程序:
;假設晶振12MHZ,P1控制8個LED低電平亮
;啟動入口========================
ORG
0000H
;復位啟動
AJMP
START
;
ORG
001BH
;T1中斷
AJMP
T1INT
;
;定義變數========================
YSJS
EQU
30H;延時計數器
LED
EQU
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
;匯編程序結束
Ⅱ 51單片機設計流水燈
;電路圖在附件內,經模擬通過,不知能不能達到你的要求。
;想要您的分真難啊
;呵呵!
org 0000h
ajmp start
org 0030h
start:
mov a,#0ffh ;
clr c ;
mov r2,#08h ;循環八次。
loop: rlc a ;帶進位左移。
mov p1,a ;輸出到P1口。
call delay ;延時一段時間
djnz r2,loop ;反復循環
mov r2,#07h ;再往回循環。
loop1: rrc a ;帶進位右移
mov p1,a ;輸出到P1口。
call delay ;延時一段時間
djnz r2,loop1 ;反復循環
jmp start ;重新開始
delay: mov r3,#20 ;延時子程序
d1: mov r4,#20
d2: mov r5,#248
djnz r5,$
djnz r4,d2
djnz r3,d1
ret
end
Ⅲ 用51單片機編寫8盞流水燈程序,
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVA,#0FEH
MOVR2,#8
LOOP:
MOVP0,A
LCALLDELAY
RLA
DJNZR2,LOOP
CPLA
LCALLDELAY
CPLA
LCALLDELAY
RLA
LCALLDELAY
CPLA
LCALLDELAY
MOVR2,#7
SJMPMAIN
END
Ⅳ 求基於51單片機的流水燈的設計
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit keya=P2^1;//這里看你把按鍵設置在哪個引腳上,這個是實現功能2
sbit keyb=P2^2;//這個是實現功能2
sbit keyc=P2^7;//實現功能3
void delay(uint z)
unit x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void key1()
{
if(keya==0)
{ uint x;
while(keyb)
{
P1=0xfe; //前一個燈亮
delay(1000);//1HZ
P1=P1<<1;//這里移動一位,也就是第二個燈亮,實現四種效果之一,一個一個燈輪流亮
}
if(keyb==0)
{ uint y;
P1=0xf0//前四個燈亮;
delay(1000);
P1=P1<<;//這里移動四位,即是前四個亮完後四個亮,如此循環,是第二種效果
}
}
void key2()
{
if(keyc==0)
{
P1=0xff;//使得燈全亮;
while(!keyc);//放開按鍵keyc後,此時keyc為1,程序不往下執行,所以只有再按下按鍵才能運行下面的程序
P1=0x00;//燈全滅
while(keya||keyb);//這里不能使用keyc了,如果使用keyc則在滅了之後又得按這個按鍵才能使全滅,這樣循環下去功能1就無法實現了
}
void main()
{
while(1)
{
key1();
key2();
}
}
你試一下吧,太晚了,沒時間幫你畫模擬和試程序
Ⅳ 單片機流水燈課程設計
ORG 0000H //存儲器起始地址
AJMP START //直接跳轉執行程序
ORG 0030H //用戶程序起始地址
START: MOV P0,#0FFH //熄滅所有LED燈
MOV A,#0FEH //傳遞數值設置P0.0亮
AAA: MOV P0,A //P0.0點亮
LCALL DELAY //跳轉到DELAY延時子程序
JNB P1.3,BBB //判斷P1.3是否為0,如果為0則跳轉到BBB標簽實現逆向跑馬燈
RL A //A寄存器的數值循環左移一位,即FE左移1位後是FD
AJMP AAA //直接跳轉到AAA標簽,即實現LED燈從P0.0向P0.7正向跑馬燈
BBB: MOV A,#7FH //傳遞數值設置P0.7亮
CCC: MOV P0,A //P0.7點亮
LCALL DELAY //跳轉到DELAY延時子程序
JNB P1.0,START //判斷P1.0是否為0,如果為0則跳轉到START標簽實現正向跑馬燈
RR A //A寄存器的數值循環右移一位,即7F右移1位後是BF
AJMP CCC //直接跳轉到CCC標簽,即實現LED燈從P0.7向P0.0逆向跑馬燈
DELAY: MOV R7,#250 //延時子程序第三層250*100*10次循環
DL1: MOV R6,#100 //延時子程序第二層100*10次循環
DL2: MOV R5,#10 //延時子程序第一10次循環
DJNZ R5,$ //R5減1,不為0則繼續減
DJNZ R6,DL2 //R6減1,不為0則轉到DL2標簽
DJNZ R7,DL1 //R7減1,不為0則轉到DL1標簽
RET //子程序返回(至於延時多長時間得看硬體決定)
//12Mhz C51的話,延時500毫秒多一點點[(250*100*10+2+2)*2微秒]
//DJNZ MOV RET都是雙周期指令
END //匯編結束標識
JNB P1.3,BBB //JNB就是判斷位,判斷P1.3位是否為0,如果為0則跳轉到後面BBB標簽對應的地址,否則執行下面一行指令。
JNB P1.0,START //判斷P1.0位是否為0,如果為0則跳轉到後面START標簽對應的地址,否則執行下面一行指令。
P1.3外接一個按鈕,按鈕按一下時執行逆向跑馬燈,P1.0同樣外接一個按鈕,按鈕按一下時執行正向跑馬燈。如果兩個按鈕都按下時就打架P0.0和P0.7輪流亮。
RL A //這個RL是循環左移位操作,就是把A寄存器裡面的數值二進制位左移一位再保存到A寄存器裡面。比如A=11111110B(0xFE)時,左移一位後A=11111101B(0xFD),再左移一位後變成A=11111011B(0xFB)。
Ⅵ 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語言的標識符命名規則。
(): 不需要傳入參數,所以括弧中為空
至此我們可以把流水燈程序寫為以下形式:
Ⅶ 如何用單片機簡單製作一個流水燈
工具:STC系列51單片機、串口轉換器(USB轉TTL 或232轉TTL)
材料:實驗板一塊(可以買現成的,也可以買麵包板自己搭建),電阻、LED燈 若干,5V電源等。
以下程序可以直接用Keil C 直接編譯執行。
//可以通過左移函數_crol_()和右移函數_cror_()來實現LED等的來迴流動。
//具體實現方法可以參考如下程序:
#include<reg51.h>
#include<intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uinta);
voidmain()
{
P1=0xfe;
while(1)
{
//向左循環點亮LED
for(i=0;i<7;i++)
{
P1=_crol_(P1,1);//左移一位,點亮下一位LED
delay(55);
}
//向右循環點亮LED
for(i=0;i<7;i++)
{
P1=_cror_(P1,1);//右移一位,,點亮上一位LED
delay(55);
}
}
}
//延時函數,延時a毫秒
voiddelay(uinta)
{
uintx,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
Ⅷ 很簡的51單片機C語言流水燈程序
1、51單片機C語言實現循環8個流水燈左移三次,後右移三次。
常式:
#include<reg51.h> //51單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
sbit beep=P2^3;
void delay(uint z) //延時函數,z的取值為這個函數的延時ms數,如delay(200);大約延時200ms.
{ //delay(500);大約延時500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函數
{
uchar a,i,j;
while(1) //大循環
{
a=0xfe; //賦初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //點亮小燈
beep=0; //開啟蜂鳴器
delay(50); //延時50毫秒
beep=1; //關閉蜂鳴器
delay(50); //再延時50毫秒
a=_crol_(a,1); //將a變數循環左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //點亮小燈
beep=0; //開啟蜂鳴器
delay(50); //延時50毫秒
beep=1; //關閉蜂鳴器
delay(50); //再延時50毫秒
a=_cror_(a,1); //將a變數循環右移一位
}
}
}
2、51單片機是對所有兼容Intel
8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8031單片機,後來隨著Flash
rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。
Ⅸ 51單片機流水燈5v怎麼畫
1、首先要設計電路圖,利用proteus軟體進行電路圖的設計。所需元器件:AT89C51單片機1個。LED-RED8個。電源VCC1個。
2、使用keil4軟體進行流水燈程序的編輯。
3、方法一編寫程序採用的是左移函數(_crol_(a,b))和右移函數(_cror_(a,b))的方法,需在前加上頭文件#include
4、總結:單片機流水燈的設計分為兩個步驟,第一步是原理圖的繪制;第二步是keil4流水燈控製程序的編寫。在寫程序的時候最好使用第一種方法,採用位移函數來進行流水燈的設計。