搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

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

题目:采用定时器/计数器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中的置初值操作是不是从始至终只运行了一次,而且只是为了触发第一次中断以引发后面的循环中断,我这样理解是否正确?


暂时就想问这三个问题,希望各位大大可以百忙之中看看我的帖子,给我点提示。我已经尽量把我的问题描述得清晰,详细了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-11-17 21:14:28 | 显示全部楼层
看来1楼要归自己了,这个点可能都已经睡觉了。。。。

出0入0汤圆

发表于 2013-11-17 21:59:06 | 显示全部楼层
1、F0应该是RAM区的bit位,指示当前工作模式
   F0=0,计数模式;F0=1,定时模式

2、MAIN是初始化,仅运行一次。先将T0设为计数模式,计数值10000H-100=FF9CH,F0=0。然后就停在HERE,剩下全靠定时器中断处理。
3、不论计数或定时到后,都会触发中断,进入中断向量000BH,跳至PT0J,根据F0标志决定进入不同分支:
如果F0=0,说明是计数模式引发的中断,顺序执行,改为定时模式,F0=1;
如果F0=1,说明是定时模式引发的中断,跳转至PT0D,改为计数模式,F0=0。
依次循环  

出0入0汤圆

 楼主| 发表于 2013-11-17 22:37:03 | 显示全部楼层
sf49ers 发表于 2013-11-17 21:59
1、F0应该是RAM区的bit位,指示当前工作模式
   F0=0,计数模式;F0=1,定时模式

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

出0入0汤圆

发表于 2013-11-17 22:50:03 | 显示全部楼层
好久不看汇编了

出0入0汤圆

 楼主| 发表于 2013-11-18 08:35:09 | 显示全部楼层
sky_walker 发表于 2013-11-17 22:50
好久不看汇编了

哈哈,学校要从汇编教起,我就干脆从最基本的开始学了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表