今天在书上找到一道比较综合的题目,感觉自己在编程思想和习惯方面有很多不足,最主要的是基本功不扎实,鉴于这道题包含的内容很丰富,想把它拿到坛子里来问问各位大神,
希望能解决一直以来心中的许多困惑,我把参考答案代码以及我自己附加的注释写下来,希望各位不吝赐教。我会认真回复的。
题目:采用定时器/计数器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中的置初值操作是不是从始至终只运行了一次,而且只是为了触发第一次中断以引发后面的循环中断,我这样理解是否正确?
暂时就想问这三个问题,希望各位大大可以百忙之中看看我的帖子,给我点提示。我已经尽量把我的问题描述得清晰,详细了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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。
依次循环
额,您的头像很萌啊!
感谢你的回答,回答地很具体,很有条理。第一个问题中的F0之前没有涉及到,不过现在学习了,其他的都明白了。
不过还是忍不住想问一下,我现在作为新手,在设计程序的时候对程序的结构感到很苦恼,课本上根本没有相关的例程,老师上课分析也不会讲这么多,
对于写一个规范的程序简直有点触不可及的感觉。就是想问问您的意识是怎样培养出来的,好给我这个新手一些提示,方便我成长。
或者有什么书目推荐的,我也愿意自己去图书馆找来看看。总之,非常感谢了
一周热门 更多>