P1.0口作为输出,接1只发光二极管,编写程序使其发光二极管闪亮的程序

P1.0口作为输出,接1只发光二极管,编写程序使其发光二极管闪亮的程序,第1张

ORG 0000H 程序从0地址开始

START: CLR P1.0点亮发光二极管

LCALL DELAY 调用延时子程序(亮1秒钟)

SETBP1.0 关掉发光二极管

LCALL DELAY 调用延时子程序(关1秒钟)

LJMPSTART 跳到START标号处执行

DELAY: 1秒延时子程序(12MHz晶振)

MOV R5,#8 R5寄存器加载8次

D0:MOV R7,#250 R7寄存器加载250次数

D1:MOV R6,#250 R6寄存器加载250次数

D2:DJNZR6,D2D2循环执行R6次

DJNZR7,D1D1循环执行R7次

DJNZR5,D0D0循环执行R5次

RET 返回主程序

END 主程序结束

#include <reg51.h>

#define LED P1 //宏定义,使用LED代替P1口(相当于LED=P1)

#define uchar unsigned char //用uchar代替unsigned char方便 *** 作

#define uint unsigned int

/*------------------time ms延时函数-----------------*/

void delay_ms(uint time)

{

uchar tres

for(time>0time--)

{

tres=150

while(tres--)

}

}

void main()

{

uchar t

LED=0X01//P1=00000001B

while(1)//死循环,不停的点亮和熄灭LED

{

for(t=0t<8t++)

{

LED=~LED//按位取反,点亮一个LED

delay_ms(100)//延时0.1s

LED=~LED//按位取反

LED<<=1//左移一位,点亮不同的LED

}

LED=0X80//P1=10000000B

for(t=0t<8t++)

{

LED=~LED//按位取反,点亮一个LED

delay_ms(100)//延时0.1s

LED=~LED//按位取反

LED>>=1//右移一位,点亮不同的LED

}

LED=0X01//P1=00000001B

}

}

程序:

ORG

0000H

LJMP

MAIN

ORG

4000H

MAIN:MOV

R5,#04H

LOOP:MOV

R1,#00H

MOV

A,#0FEH

L1:MOV

P1,A

LCALL

DELAY

RL

A

INC

R1

CJNE

R1,07H,L1

MOV

R2,#00H

MOV

A,#01H

L2:MOV

P1,A

LCALL

DELAY

RR

A

INC

R2

CJNE

R2,07H,L2

DJNE

R5,LOOP

DELAY:MOV

R6,#02H

D1:MOV

R7,#0FFH

D2:DJNZ

R7,D2

DJNE

R6,D1

RET

END

电路:

连接灯的阴极至P1口上即可,复位和震荡电路不需要我说了吧

说明一下,延时时间不准确,不过基本接近1ms的

t=(256*2+1)*2+1+2=1028

如果想做到精确延时的话建议在DELAY中使用NOP指令调理,自己试一下吧

最好是用Keil仿真一下确定延时时间。

很久没有汇编了,仔细检查一下,估计有Bug也不一定。


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

原文地址:https://54852.com/yw/11126020.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存