打印
[51单片机]

定时计数器T0 作定时应用,编程出现不明错误

[复制链接]
1715|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刘永涛|  楼主 | 2014-6-6 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验任务:
用AT89S51 的定时/计数器T0 产生2 秒钟的定时,每当2 秒定时到来时,更换指
示灯闪烁,每个指示闪烁的频率为0.2 秒,也就是说,开始L1 指示灯以0.2 秒
的速率闪烁,当2 秒定时到来之后,L2 开始以0.2 秒的速率闪烁,如此循环下
去。0.2 秒的闪烁速率也由定时/计数器T0 来完成。

我写的程序

ORG 00H
LJMP START

ORG 0BH
LCALL NEXT
LJMP WAIT

ORG 30H
START:
  MOV R0,#10
  MOV R1,#11111110B
  MOV R2,#4
  MOV R3,#0  
  MAIN:
    MOV TMOD,#01H
    MOV TH0,#60
    MOV TL0,#156
    SETB EA
    SETB ET0
    SETB TR0
  WAIT:
    LJMP $

NEXT:
  MOV TH0,#60
  MOV TL0,#156
  DJNZ R2,RETI1
  MOV R2,#4
  LCALL OUTPUT
  DJNZ R0,RETI1
  MOV R0,#10
  MOV A,R1
  RL A
  CJNE A,#11101111B,JIXU
  MOV  A,#11111110B
  JIXU:
    MOV R1,A
  RETI1:
    RETI

OUTPUT:
  CJNE R3,#1,OUTPUTN
  MOV R3,#0
  MOV P1,R1
  LJMP RET1
  OUTPUTN:
    MOV R3,#1
    MOV A,#0FFH
    MOV P1,A
  RET1:
    RET

END
  

额,不知道什么原因,前三盏灯运行正常,到第四盏灯是,R0在运行的过程中,进入中断程序后,从0A变成了0E!不知道哪位大侠指点一二

相关帖子

沙发
受不了了| | 2014-6-6 22:11 | 只看该作者
好生涩,大家都是这样过来的,帮你顶一下

使用特权

评论回复
板凳
受不了了| | 2014-6-6 22:13 | 只看该作者
咦,今晚22点后又能回帖了,昨晚不能,每年一次

使用特权

评论回复
地板
cjseng| | 2014-6-7 01:37 | 只看该作者
ORG 0BH
LCALL NEXT
LJMP WAIT

这里有点问题吧?下面两条指令超过3个字节了。

使用特权

评论回复
5
four_zhg| | 2014-6-7 09:17 | 只看该作者
汇编好久没碰了,改C吧

使用特权

评论回复
6
ayb_ice| | 2014-6-7 10:08 | 只看该作者
只能跳转到中断程序,不能调用

ORG 0BH
LJMP NEXT

NEXT:
...
LCALL WAIT
...
RETI

使用特权

评论回复
7
刘永涛|  楼主 | 2014-6-9 12:52 | 只看该作者
cjseng 发表于 2014-6-7 01:37
ORG 0BH
LCALL NEXT
LJMP WAIT

不太明白呀,为什么不能超过三个字节呀?

使用特权

评论回复
8
刘永涛|  楼主 | 2014-6-9 12:53 | 只看该作者
four_zhg 发表于 2014-6-7 09:17
汇编好久没碰了,改C吧

额,是这样子的,现在在学汇编,所以用汇编写的。感觉汇编的一些指令调来调去,容易出错

使用特权

评论回复
9
刘永涛|  楼主 | 2014-6-9 12:54 | 只看该作者
受不了了 发表于 2014-6-6 22:13
咦,今晚22点后又能回帖了,昨晚不能,每年一次

多谢帮忙顶贴

使用特权

评论回复
10
刘永涛|  楼主 | 2014-6-9 13:00 | 只看该作者
ayb_ice 发表于 2014-6-7 10:08
只能跳转到中断程序,不能调用

ORG 0BH

嗯,大侠,请受我一拜,经您的指点,问题解决了。只是不知道为什么只能跳转不能调用呢?而且,前三盏灯是可以正常运行的呀

使用特权

评论回复
11
望断云山| | 2014-6-9 13:12 | 只看该作者
参看堆栈

使用特权

评论回复
12
ayb_ice| | 2014-6-9 13:36 | 只看该作者
刘永涛 发表于 2014-6-9 13:00
嗯,大侠,请受我一拜,经您的指点,问题解决了。只是不知道为什么只能跳转不能调用呢?而且,前三盏灯是 ...

因为硬件已经将断点保存起来了,

如果再调用的话堆栈最终会耗尽

前面几个看似正常,其实整个程序都是带病工作,只是现像不一定可见而已

使用特权

评论回复
13
刘永涛|  楼主 | 2014-6-9 21:08 | 只看该作者
ayb_ice 发表于 2014-6-9 13:36
因为硬件已经将断点保存起来了,

如果再调用的话堆栈最终会耗尽

奥!这样子呀,就是说遇到中中断的时候,系统已将保存断点了,调用lcall时又一次保存了,是这样吗?一个ret就不够了,是这样吗?

使用特权

评论回复
14
ningling_21| | 2014-6-9 21:49 | 只看该作者
刘永涛 发表于 2014-6-9 21:08
奥!这样子呀,就是说遇到中中断的时候,系统已将保存断点了,调用lcall时又一次保存了,是这样吗?一个r ...

搞汇编,就是什么都要自己动手,保存断点也不例外...

系统不会自动保存断点,全部都要自己写程序代码实现...


使用特权

评论回复
15
ayb_ice| | 2014-6-10 08:01 | 只看该作者
本帖最后由 ayb_ice 于 2014-6-10 08:03 编辑
ningling_21 发表于 2014-6-9 21:49
搞汇编,就是什么都要自己动手,保存断点也不例外...

系统不会自动保存断点,全部都要自己写程序代码实现 ...

不知道说什么好
请问你搞过汇编吗

使用特权

评论回复
16
ningling_21| | 2014-6-10 08:15 | 只看该作者
ayb_ice 发表于 2014-6-10 08:01
不知道说什么好
请问你搞过汇编吗

别误会,我说的是ACC,PSW,DPTR这些内容,在中断时,系统不会自动保存

使用特权

评论回复
17
ayb_ice| | 2014-6-10 08:36 | 只看该作者
ningling_21 发表于 2014-6-10 08:15
别误会,我说的是ACC,PSW,DPTR这些内容,在中断时,系统不会自动保存

就算寄存器这些也有好些芯片是自动保存的,
有部分自动,也有全部自动的

使用特权

评论回复
18
天命风流| | 2014-6-10 09:59 | 只看该作者
汇编啊!!!

使用特权

评论回复
19
刘永涛|  楼主 | 2014-6-11 07:28 | 只看该作者
ningling_21 发表于 2014-6-9 21:49
搞汇编,就是什么都要自己动手,保存断点也不例外...

系统不会自动保存断点,全部都要自己写程序代码实现 ...

奥,多谢!我是初学者,很多不懂的,多谢给位大侠指点

使用特权

评论回复
20
刘永涛|  楼主 | 2014-6-11 07:29 | 只看该作者
ayb_ice 发表于 2014-6-10 08:36
就算寄存器这些也有好些芯片是自动保存的,
有部分自动,也有全部自动的

多谢指点,我回头自己再查查这方面的内容,已经基本明确了,多谢多谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

18

帖子

0

粉丝