【菜鸟求助】51单片机定时器/ 计数器以及中断的综合问题

2020-01-25 15:39发布

今天在书上找到一道比较综合的题目,感觉自己在编程思想和习惯方面有很多不足,最主要的是基本功不扎实,鉴于这道题包含的内容很丰富,想把它拿到坛子里来问问各位大神,
希望能解决一直以来心中的许多困惑,我把参考答案代码以及我自己附加的注释写下来,希望各位不吝赐教。我会认真回复的。

题目:采用定时器/计数器T0对外部脉冲进行计数,每计数100个脉冲后,T0转为定时工作方式。定时1ms后,又转为计数方式,如此循环不止。假定MCS-51单片机的晶体震荡器
的频率为6MHz,请使用方式1实现,要求编写出程序。

参考答案以及我添加的注释:
           ORG      0000H
           AJMP     MAIN
           ORG      000BH
           LJMP     PT0J
           ORG      0100H
  MAIN:   MOV     TMOD,#05H                ;T0设定为计数模式,工作方式1
           MOV     TH0,#0FFH                  ;通过计算置入初值65436,十六进制为FF9CH
           MOV     TL0,#9CH
           CLR       F0
           SETB    TR0                            ;启动T0
           SETB    ET0                            ;允许T0中断
           SETB    EA                              ;CPU开中断
  HERE:   AJMP    HERE
  PT0J:   JB         F0,PT0D
           MOV     TMOD,#01H                 ;T0设定为定时模式,工作方式1
           MOV     TH0,#0FEH                  ;通过计算置入初值65036,十六进制为FE0CH
           MOV     TL0,#0CH
           SETB    F0
           RETI
   PT0D:   CLR       F0
           MOV     TMOD,#05H
           MOV     TH0,#0FFH
           MOV     TL0,#9CH
           RETI
                 END

问题:
1.汇编程序中的F0是不是指的定时器/计数器的计数溢出标志位,用来判断是否完成一次计数/计时的?

2.如果这个程序能够正常运行,运行顺序是否为: MAIN置入初值后进入HERE等待计数100的中断,当计数100完成,触发中断后,进入000BH,然后长跳转进入PT0D,进入1ms的定时中,
  完成定时后进入HERE死循环等待,但是这样就无法进入PT0J中断服务程序了,这个顺序问题搞得我很头痛,希望哪位大神可以给我详细解答一下,非常感谢

3.程序中出现了两次计数模式下的置入初值,在MAIN的置初值操作是必要的吗?还是能通过结构变化仅留下PTOD中的置初值操作
   还有就是MAIN中的置初值操作是不是从始至终只运行了一次,而且只是为了触发第一次中断以引发后面的循环中断,我这样理解是否正确?


暂时就想问这三个问题,希望各位大大可以百忙之中看看我的帖子,给我点提示。我已经尽量把我的问题描述得清晰,详细了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
18814888577
2020-01-25 22:37
sf49ers 发表于 2013-11-17 21:59
1、F0应该是RAM区的bit位,指示当前工作模式
   F0=0,计数模式;F0=1,定时模式

额,您的头像很萌啊!
感谢你的回答,回答地很具体,很有条理。第一个问题中的F0之前没有涉及到,不过现在学习了,其他的都明白了。
不过还是忍不住想问一下,我现在作为新手,在设计程序的时候对程序的结构感到很苦恼,课本上根本没有相关的例程,老师上课分析也不会讲这么多,
对于写一个规范的程序简直有点触不可及的感觉。就是想问问您的意识是怎样培养出来的,好给我这个新手一些提示,方便我成长。
或者有什么书目推荐的,我也愿意自己去图书馆找来看看。总之,非常感谢了

一周热门 更多>