单片机 定时器使用

题目要求:89c51,要求P1^0口每1s取反一次。使用T0定时器方式1,晶振12MHZ,根据公式:(2^16-x初值)*震荡周期*12=50ms,求出x=3CB0H;我... 题目要求: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
非常感谢楼下朋友的详细讲解,非常非常地;
还有问题,里面的堆栈指针是干什么用的?
展开
 我来答
添星2525
2009-03-25
知道答主
回答量:8
采纳率:0%
帮助的人:0
展开全部
你是刚学习单片机吗?
对于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语言。
gbchang
2009-03-23 · 超过22用户采纳过TA的回答
知道答主
回答量:43
采纳率:0%
帮助的人:43.1万
展开全部
看来楼主需要系统的总结下了:)

正确区分LJMP、AJMP、SJMP、JMP指令
无条件转移指令(共4条)
LJMP addr16 ; PC〈—— addr16
AJMP addr11 ; PC〈—— PC+2 , PC10-0〈—— addr11
SJMP rel ; PC〈—— PC+2 , PC 〈—— PC+rel
JMP @A+DPTR ; PC〈—— A+DPTR

第一条指令称为长转移指令(Long Jump);
第二条指令叫作绝对转移指令(Absolute Jump);
第三条指令称作短转移指令(Short Jump);
第四条指令是变址寻址转移指令(散转指令)。

显然,每条指令均以改变程序计数器PC(Program Counter)中的内容为宗旨。

(1)长转移指令(64KB范围内转移指令)
长转移指令为三字节,双周期指令。
长转移指令的功能是:把指令码中的目标地址addr16装入程序计数器PC,使机器执行下一条指令时无条件转移到addr16处执行程序,不影响任何标志。由于addr16是一个16位二进制地址(地址范围为0000H—FFFFH),因此长转移指令一条可以在64KB范围内转移的指令。

(2)绝对转移指令(2KB范围内的转移指令)
绝对转移指令是一条双字节,双周期指令。
11位地址addr11(a10—a0)在指令中的分布是:
a10 a9 a8 0 0 0 0 1|a7 a6 a5 a4 a3 a2 a1 a0,其中,00001B是操作码。
绝对转移指令执行时分为两步:
第一步是取指令操作,程序计数器PC中内容被加1两次;
第二步是把PC加2后的高5为地址PC15—PC11和指令代码中低11位构成目标转移地址:PC15—PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0

其中,a10—a0的地址范围是全“0”——全“1”。因此,绝对转移指令可以在2KB范围内向前或向后跳转。
如果把单片机64KB寻址区分成32页(每页2KB),则PC15—PC11(00000B—11111B)称为页面地址(即:0页—31页),a10—a0称为页内地址,但应注意:AJMP指令的目标转移地址不是和AJMP指令地址在同一个2KB区域,而是应和AJMP指令取出后的PC地址(即:PC+2)在同一个2KB区域。
例如:若AJMP指令地址为2FFEH,则PC+2=3000H,故目标转移地址必在3000H—37FFH这2KB区域中,切记!

(3)短转移指令(-126—+129范围内的转移指令)
短转移指令是一条双字节,双周期指令。
短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,指令码格式为:80H rel(操作码 地址偏移量),这里,80H是SJMP指令的操作码;rel是地址偏移量。

(4)变址寻址转移指令(常用于实现分支程序转移)
变址寻址转移指令是一条单字节,双周期指令。
在指令执行之前,用户应预先把目标转移地址的基地址送入DPTR,目标转移地址对基地址的偏移量放在累加器A中。在指令执行时,MCS-51单片机把DPTR中基地址和累加器A中地址偏移量相加,以形成目标转移地址送入程序计数器PC中。
通常,DPTR中基地址是一个确定的值,常常是一张转移指令表的起始地址,累加器A中之值为表的偏移量地址,机器通过变址寻址转移指令便可实现程序的分支转移。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yangyi1818
2009-03-23 · TA获得超过171个赞
知道答主
回答量:167
采纳率:0%
帮助的人:82.4万
展开全部
哇,一楼真的细心,加个好有
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
有嘢电子电工
2021-04-30 · TA获得超过112个赞
知道答主
回答量:198
采纳率:50%
帮助的人:52.5万
展开全部

动画效仿定时器原理,生动有趣

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式