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

用汇编代码设计程序,完成8个LED灯的循环闪烁:
LED1亮,其余灭->LED2亮,其余灭……,如此循环5次后,进行全灭->全亮闪烁,时间间隔为500ms用p0口控制
org 0000h
RESET: LJMP MAIN
ORG 000BH
LJMP IT0P
ORG 1000H MAIN: MOV A,#01H
MOV R1,#28H LOOP: MOV P0,A
RLC A
ACALL DELAY
DJNZ R1,LOOP
MOV A,#0FFH LOOP1: MOV P0,A
CPL A
ACALL DELAY
LJMP LOOP1 DELAY: MOV SP,#60H
MOV B,#1AH
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB TR0
SETB ET0
SETB EA
HERE: SJMP HERE IT0P: MOV TL0,#0B0H
DJNZ B,LOOP2
CLR TR0
LOOP2: RETI
END
这是我的代码,为什么起不到延时的作用

;用汇编代码设计程序,完成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
RR A
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
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-23
你在定时中断里执行了CLR TR0,把定时器停下了,一次中断后,不会再有中断了追问

如何更改呀,如何反复调用定时器延时程序,再跳转至主程序中执行 SETB TR0
为何定时器没有再次启动

追答

可以把这条指令删了

追问

能个我一个改正后的正确代码吗,我已经试了一上午了。谢谢了

本回答被网友采纳
第2个回答  2012-03-23
楼上说对哈

关于AT89c51单片机定时器实现延时子程序的问题
;用汇编代码设计程序,完成8个LED灯的循环闪烁:;LED1亮,其余灭->LED2亮,其余灭……,如此循环5次后,;进行全灭->全亮闪烁,时间间隔为500ms用p0口控制 下列程序已经测试通过 ;--- ORG 0000H LJMP MAIN ORG 000BH LJMP T0_INT MAIN:SETB TR0 ;T0定时方式0 MOV SP, #60...

单片机AT89C51的一段ASM代码出现了问题 LED数码管不亮 不知道是我电...
你这个程序 数码管 应该用共阳的,能亮出来 但程序 太乱了 同时在一个数码管上显示了几个数,显示不正常,这样的电路 在仿真时还能掺和,实际电路是不行的,当然学习能仿真出来 已经是一大进步,先不要太复杂 一步一步 增加难度,这样比较 容易。

AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊...
void main(void )\/\/主程序 { TMOD=0x01;\/\/ 定时器1工作方式一 ET0=1;EA=1;TH0=(65536-10000)\/256;\/\/定时10ms TL0=(65536-10000)%256;TR0=0;\/\/上电先不启动 while(1){ if(key1==0)\/\/判断按键是否按下 { Delay1ms(10);\/\/延时消抖 if(key1==0){ while(key1==0);\/\/等待...

AT89C51单片机定时中断时怎么只中断一次
你的中断程序是子程序的形式,没有reti,也就是即使产生了中断,也只能是一次,因为TF0不会自动清零。

求用单片机设计一个秒表AT89C51
DELAY: ;延时子程序.AA4: MOV R4, #0 DJNZ R4,DJNZ R4,RET ;--- X0_INT: ;启动\/停止 CPL F0 RETI ;--- X1_INT: ;

AT89C51单片机的P1口控制8盏LED流水灯
include "reg51.h" \/\/ 包含头文件 define uchar unsigned char void delay02s(void) \/\/ 延时0.2s子程序 { unsigned char i,j,k;for ( i=2;i>0;i-- )for (j=200;j>0;j-- )for (k=250;k>0;k-- );} void main (void) \/\/ 主函数 { uchar i,j;...

用单片机AT89C51驱动两位数码管显示00--99依次循环程序代码
以下是用单片机AT89C51驱动两位数码管显示00--99循环的程序代码片段:程序开始于0000h地址,通过计数器temp(22h)控制数码管从00到99的循环显示。计数器初始化为0,然后调用子程序display进行显示。每当计数器加1并判断是否达到100后,若未满则返回stlop继续循环,满100则清零重新开始。display子程序中,先...

用C语言编写AT89C51单片机程序,设计一个智能数字钟。
void delay(int); \/\/延时 \/\/***彩灯的 uchar light[24]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};int n,m=6,h;void go();\/\/===主函数===...

at89c51单片机实现电子时钟,不带闹铃。显示时分秒。求图求程序
\/*---延时子程序---*\/ void delay(uint count) \/\/delay { uint i;while(count){ i=200;while(i>0)i--;count--;} } void dsreset(void) \/\/send reset and initialization command { uint i; \/\/DS18B20初始化 DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;} bit ...

用单片机控制的LED流水灯设计(电路、程序全部给出)
位控制与延时艺术 关键的延时子程序DELAY,如下所示,通过定时器实现延迟,为LED的切换提供稳定的间隔。每个延时周期为255步,通过循环移位法实现。在编程的高级技巧中,查表法的运用也值得探讨。通过MOV DPTR, #TAB指令,访问预先编写的流水花样数据表,根据表中的值控制LED的显示效果。创意无限:自定义...

相似回答