单片机 定时器使用

来源:百度知道 编辑:UC知道 时间:2024/05/21 21:36:00
题目要求:89c51,要求P1^0口每1s取反一次。使用T0定时器方式1,晶振12MHZ,
根据公式:(2^16-x初值)*震荡周期*12=50ms,求出x=3CB0H;
我想使用循环程序方法程序实现,即赋值B为20,DJNZ方法,20次定时50ms即达到1s。

我的程序及问题:
ORG 0000H
LJMP MAIN;为什么用LJMP跳转?
ORG 00B0H;T0的中断入口。
AJMP SERVE;为什么这里用AJMP来转啊。

;主程序:
ORG 0030H
MAIN:
MOV SP,#60H;设堆栈指针,为什么要用SP啊?
MOV B,#0F6H;循环20次,20*50ms;即一秒;
SETB EA;允许总中断。
SETB ET0;允许T0中断。

MOV TMOD,#10;T0定时方式为1;
MOV TL0,#0B0H;
MOV TH0,#3Ch;每次定时为50ms

SETB TR0;启动TR0;

SJMP $;等待。
;中断程序。
ORG 0040H
SERVE: MOV TL0,#0B0H;
MOV TH0,#3CH;
DJNZ B,LOOP ;没有到10次,就跳到LOOP.
CPL P1.0;计时10次就把P10取反吧。要求不断的重复。
JMP MAIN;?这里错了吗?

LOOP:RETI;中断返回。返回到哪儿?
END
非常感谢楼下朋友的详细讲解,非常非常地;
还有问题,里面的堆栈指针是干什么用的?

你是刚学习单片机吗?
对于Ljmp和Ajmp 只是寻址范围稍有区别 前者为长转移指令 后者是绝对转移指令,后者范围转移范围在同一个2K字节空间以内,一般没有太大的区别。程序写的较短较密的用后一个就可以。
还有哦
你的程序中有几个错误
T0的入口地址可是000Bh
堆栈指针是C51中已经定义好的专用指针,用于暂存一些有用变量中的内容
20次循环为14h
还有中断返回返回到等待区就好,表示继续执行同样的程序,这样才能循环1S的方波

建议你可以看看你的教材 上面应该都有介绍的。
《单片机原理及应用教程》 第2版 机械工业出版社
这本书是我学过的教材,我觉得挺实用的,你可以参考一下上面107页的程序。

下面是我给你改过的程序 可以参考一下哦!

ORG 0000H
AJMP MAIN
ORG 000BH
AJMP PART1

ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R7,#0AH
MOV IE,#82H;这个和你的按位启动是一样效果
SETB TR0
SJMP $

PART1:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R7,FANHUI
CPL P1.0
MOV R7,#0AH
FANHUI:
RETI
end

其实堆栈指针在51系列中已经定义好了一段区域,最多用于子程序中,例如你在主程序中用了寄存器R1,而且其值在你主程序的其他位置还有用,而且你需要用到一个跳转指令在子程序中进行操作,怕在子程序中也要用到R1,那么先用堆栈将R1的值暂存起来,等完成子程序得时候再退栈,这样原来的R1中的值将不会被破坏。这里还要注意哦,堆栈是顺序操作的,它是后进先出原则哦,这个你可以参考一下C语言。