关于AT89c51单片机定时器实现延时子程序的问题

关于AT89c51单片机定时器实现延时子程序的问题,第1张

用汇编代码设计程序,完成8个LED灯的循环闪烁:

LED1亮,其余灭->LED2亮,其余灭……,如此循环5次后,

进行全灭->全亮闪烁,时间间隔为500ms用p0口控制

下列程序已经测试通过

----------------------

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0_INT

MAIN:

SETB TR0 T0定时方式0

MOV SP, #60H

MOV IE, #82H

MOV B, #61 定时500ms,500 000 / 8192 = 61

-----------------------

MOV A, #127

MOV R1, #40

LP0:MOV P0, A

JBC F0, $ + 5

SJMP $ - 3

RRA

DJNZ R1, LP0

-----------------------

CLR A

LP1:MOV P0, A

JBC F0, $ + 5

SJMP $ - 3

CPL A

LJMP LP1

-----------------------

T0_INT: 自动重新装入0

DJNZ B, T0_END

MOV B, #61

SETB F0

T0_END:

RETI

-----------------------

END

这么简单的要求,不用大动干戈。

看看下面的程序,是不是最简单:

ORG 0000H

SETB TR0 启动T0

MOV R2, #250 定时计数初值

LOOP:

MOV TH0, #(8192 - 8000) / 32 定时8ms

MOV TL0, #(8192 - 8000) MOD 32

JNB TF0, $ 等待8ms

CLR TF0

DJNZ R2, LOOP 每隔8ms,R2减一次一

CPL P1.0 R2为0则LED亮灭转换

LJMP 0000H

END

本程序,已经实验成功。

我来试试吧,用汇编语言编写:

ORG 0

JMP MAIN

MAIN:SETB P1.0

ACALL DELAY

CLR P1.0

ACALL DELAY

JMP MAIN

DELAY:MOV R1,#10 500ms的延时子程序

MOV TMOD,#1 定时器0方式1

AGAIN:MOV TL0,#LOW(65536-50000)装载计数初值的低位

MOV TH0,#HIGH(65536-50000) 装载计数初值的高位

SETB TR0 启动

LOOP1:JBC TF0,LOOP2查询并清除溢出位

JMP LOOP1

LOOP2:DJNZ R1,AGAIN

CLR TR0

RET

END

刚才我拿51的测试板编译了一下,下载后可以正常运行,你直接拷贝应该就能用,嘻嘻


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

原文地址: http://outofmemory.cn/yw/7780746.html

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

发表评论

登录后才能评论

评论列表(0条)

保存