- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验三定时计数器
实验报告三
实验名称:定时计数器
一、?实验现象:
开机后程序作如下的灯光变换:第一次led0、led2亮;第二次led1、led3亮;第三次led4、led6亮;第四次led5、led7亮;第五次led0、led2、led4、led6亮;第六次led1、led3、led5、led7亮;第七次8个二极管全亮;第八次8个二极管全灭。然后重头开始循环。每次状态转换间隔时间是50ms。
二、?实验目的
掌握内部定时/计数器的作定时功能(模式1)的应用三、?实验任务分析:
1、定时器的结构:
定时/计数器的核心是一个加1计数器(注:16位,计数范围从0000h~ffffh),根据K0开关的不同方向,这个计数器可以对两个脉冲来源计数,一个是系统的时钟振荡器,另外一个是外部的脉冲源。
2、定时器的工作方式
当计数器对系统时钟脉冲计数的时候,由于系统时钟是一个时间基准,所以脉冲数×脉冲周期就是一段固定时间,因此工作于定时方式;当计数器对外部的脉冲进行计数的时候(也就是对TX端计数,TX端我们用到的时候再解释吧),就可用于对外部事件计数,工作于计数方式。我们这个试验要产生50ms的定时,用的是定时功能3、定时时间的计算
要计算定时时间,我们就要知道计数器的输入脉冲周期是多少。实际上,计数器是对机器周期计数的,而我们也知道,1个机器周期=12×振荡周期,所以,计数器的输入脉冲周期是:12×(1/12MHZ)=1us。
可见,要产生50ms的定时,只要计数器记50000个脉冲就可以啦。那么,怎样让计数器在记入了50000个脉冲后,向单片机发出一个消息,表示定时时间到呢?这个试验我们要用到T0的溢出中断。
16位的计数器从0开始,记入216=65536个脉冲的时候,会向外面产生溢出,这个溢出把TFX置一,(注:TF0是T0的溢出中断标志,TF1是T1的溢出中断标志),从而向CPU申请中断,在进入中断处理程序后,由硬件对TFX清0,不需要我们操作。4、计数初值的计算
16位的计数器要记入65536个脉冲才会产生溢出中断,让它在记入50000个脉冲后产生中断我们可以给计数器置一个初值65536-50000=15536,这样计数器在记入50000个脉冲之后就会产生溢出中断了。
四、?程序流程图:
五、实验程序(注意:在作这个试验的时候,不要忘了把JMP0跳线置于1、2的位置,选择二极管显示单元)org 0000hajmp main org 000bh????? ;T0溢出中断入口地址ajmp time0org 0020hmain: clr p1.5? mov r1,#0ffh mov sp,#70h???? ;设置堆栈mov tmod,#01h?? ;T0初始化,工作于定时方式,详细解释见注释mov th0,#3ch??? ;T0置计数初值mov tl0,#0b0hsetb et0???????? ;允许T0溢出中断setb ea????????? ;cpu开中断setb tr0???????? ;启动T0计数ajmp $???????? ;等待
time0:inc r1???????? ;查表求灯光,输出到p0口, mov a,r1????? mov dptr,#tabmovc a,@a+dptrmov p0,acjne a,#0ffh,nextmov r1,#0ffhnext: mov th0,#3ch????? ;由于计数器已经溢出,所以需要重设计数初值 mov tl0,#0b0hreti
tab:? db 0fah,0f5h,0afh,05fh?? ;按顺序存储灯光的表格db 0aah,55h,00h,0ffh? end
六、几点说明把这个程序下载到学习板上,看看效果吧。我们发现,灯光变换的速度太快啦,几乎没有办法看清楚,原因很简单,因为50ms的定时太短了。16位的计数器定时最多能够达到65.536ms,那么如果我们需要更长时间的定时,比如仍然是刚才的试验,但是时间要求是1s,该怎么办呢?
我们设一个计数器,初值是0,每次T0溢出中断的时候,给这个计数器加一。在主程序里,我们反复检测这个计数器的值,达到20的时候调用灯光子程序就可以啦。下面就是这个定时1s的程序,其中,我们用r2作这个计数器。org 0000h????? ajmp main????? org 000bh????? ;T0溢出中断入口地址·????? ajmp time0????? org 0020hmain:? clr p1.5? ????? mov r1,#0ffh ????? mov r2,#00h???? ;给计数器r2赋初值0? mov sp,#70h???? ;设置堆栈????? mov tm
文档评论(0)