单片机跑马灯程序

单片机跑马灯程序,第1张

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

org 0000h

jmp start

org 0030h

start:

mov p0,#11111110b  ;  此时第一个灯亮

call t10s

mov p0,#11111101b  ;此时第二个灯亮

call t10s

mov p0,#11111011b

call t10s

mov p0,#11110111b

call t10s

mov p0,#11101111b

call t10s

mov p0,#11011111b

call t10s

jmp start        ;此处跳到开始 即 循环

;延时子程序10秒=250usX2X200X100

t10s:mov r5,#100

lpr5:mov r6,#200

lpr6:mov r7,#250

djnz r7,$

djnz r6,lpr6

djnz r5,lpr5

ret

end

把灯的正极接电源正极 即vcc 负极分别接p00-p05

此时  给p0  送0灯就亮 1灯就不亮

程序已经过调试 可用

仿真如下:

/ 用P1口接LED / #include //51系列单片机定义文件 #define uchar unsigned char //定义无符号字符 #define uint unsigned int //定义无符号整数 void delay(uint); //声明延时函数 void main(void) { uint i; uchar temp; while(1) { temp=0x01; for(i=0;i<8;i++) //8个流水灯逐个闪动 { P1^=temp; delay(500); //调用延时函数 temp<<=1; } temp=0x80; for(i=0;i/8个流水灯反向逐个闪动 { P1^=temp; delay(500); //调用延时函数 temp>>=1; } temp=0xFE; for(i=0;i<8;i++) //8个流水灯依次全部点亮 { P1=temp; delay(500); //调用延时函数 temp<<=1; } temp=0x7F; for(i=0;i/8个流水灯依次反向全部点亮 { P1=temp; delay(500); //调用延时函数 temp>>=1; } } } void delay(uint t) //定义延时函数 { register uint bt; //register为寄存器变量 即将无符号整形变量bt放在CPU的寄存器中而不是放在内存中 因为该 变量使用频率高 这样可以提高执行效率 for(;t;t--) for(bt=0;bt<255;bt++); }

用 C还是 汇编? 用汇编,稍等片刻!

C(1)

ORG 0000H

MAIN:MOV A,#0FEH

MOV R3,#8

LP: MOV P1,A

RL A

LCALL DELAY

DJNZ R3,LP

MOV R3,#8

SJMP MAIN

DELAY: ;软件延时

MOV R7,#0DH

DL1:

MOV R6,#0F7H

DL0:

MOV R5,#8EH

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

NOP

RET

END

(2)ORG 0000H

MAIN:MOV A,#0FEH

MOV R3,#8

LP: MOV P1,A

RL A

LCALL DELAY

DJNZ R3,LP

MOV P1,#0FFH

LCALL DELAY

MOV R3,#8

MOV A,#07FH

LP2: MOV P1,A

RR A

LCALL DELAY

DJNZ R3,LP2

MOV P1,#0FFH

LCALL T1DELAY

SJMP MAIN

T1DELAY:MOV R5,#20 ; 延时1ms ;硬件延时

MOV TMOD,#10H

MOV TH1,#3CH

MOV TL1,#0B0H

SETB TR1

LP3: JBC TF1,LP4

SJMP LP3

LP4: MOV TH1,#3CH

MOV TL1,#0B0H

DJNZ R5,LP3

RET

试验成功的程序:

  ORG   0000H

  MOV   30H, #0

  MOV   31H, #0

M_LOOP:

  MOV   R2, #8

DISP1:

  CALL  DL

  CALL  SHIFT2

  DJNZ  R2, DISP1

  MOV   R2, #8

DISP2:

  CALL  DL

  CALL  SHIFT1

  DJNZ  R2, DISP2

  SJMP  M_LOOP

;-----------------------

SHIFT1:

  CLR   C

  MOV   A, 30H

  RLC   A

  MOV   30H, A

  CLR   C

  MOV   A, 31H

  RRC   A

  MOV   31H, A

  RET

;-----------------------

SHIFT2:

  SETB  C

  MOV   A, 31H

  RLC   A

  MOV   31H, A

  SETB  C

  MOV   A, 30H

  RRC   A

  MOV   30H, A

  RET

;-----------------------

DL:

  CLR   TI

  MOV   SBUF, 30H

  JNB   TI, $

  CLR   TI

  MOV   SBUF, 31H

  DJNZ  R7, $

  DJNZ  R7, $

  DJNZ  R6, $ - 4

  RET

;-----------------------

END

电路:

参考:

>

ORG

0000H

SJMP

START

ORG

0030H

START:

MOV

A,

#0FEH

;

先让第一个发光二极管点亮

LOOP:

MOV

P1,

A

;

从P1口输出到发光二极管

MOV

R1,

#100

;

延时05秒

DEL1:

MOV

R2,

#200

DEL2:

MOV

R3,

#7

DEL3:

DJNZ

R3,

DEL3

DJNZ

R2,

DEL2

DJNZ

R1,

DEL1

RL

A

;

左移一位,点亮下一个发光二极管

LJMP

LOOP

END

这个是我写的跑马灯程序,没有左右振荡,自己参考参考加上去吧

CSEG AT 0000H

LJMP START

CSEG AT 401BH

LJMP INT

CSEG AT 4100H

START: MOV A,#01H

MOV R1,#03H

MOV R0,#5H

MOV TMOD,#10H

MOV TL1,#57H

MOV TH1,#9EH

ORL IE,#88H

SETB TR1

LOOP1: CJNE R0,#00,DISP

MOV R0,#5H

INC R1

CJNE R1,#27H,LOOP2

MOV R1,#03H

LOOP2: MOV A,R1

MOVC A,@A+PC

JMP DISP

DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH

DB 0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEH

DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH

DB 0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00H

DISP: MOV P1,A

JMP LOOP1

INT: CLR TR1

DEC R0

MOV TL1,#57H

MOV TH1,#9EH

SETB TR1

RETI

END

给个你参考

/ 实验目的:初步了解单片机I/O口的工作原理,进一步掌握51单片机的汇编指令。

实验内容:用汇编指令对单片机I/O口进行编程,控制8个发光二极管的流水亮灭。

/

/ 程序详细功能介绍:

做单一灯的左移右移,八个发光二极管L0-L7分别接在单片机的P00-P07接口上,

输出“0”时,发光二极管亮,开始时P00→P01→P02→P03→┅→P07→P06→┅→P00亮,重复循环。

/

ORG 0000H

LJMP START

ORG 0030H

START:

MOV R2,#8 ;左移次数

MOV A,#0FEH ;A的初始值,即 P00的L0 点亮

SETB C

LOOP: MOV P0,A

LCALL DELAY

RLC A ;左移流水灯(带进位的左移),即亮点向P0口的高位移动

DJNZ R2,LOOP

MOV R2,#8 ;右移次数

LOOP1: RRC A ;右移流水灯

MOV P0,A

LCALL DELAY

DJNZ R2,LOOP1

LJMP START

DELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间,从而改变流水灯移动速度

D1: MOV R6,#20

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET

END

以上就是关于单片机跑马灯程序全部的内容,包括:单片机跑马灯程序、51单片机 跑马灯程序、51单片机跑马灯程序c等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9279551.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存