单片机定时器计数器实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机定时器计数器实验报告

篇一:单片机计数器实验报告

计数器实验报告

㈠实验目的

1. 学习单片机内部定时/计数器的使用和编程方法;

2. 进一步掌握中断处理程序的编程方法。

㈡实验器材

1. 2. 3. 4. 5.

G6W仿真器一台 MCS—51实验板一台 PC机一台电源一台信号发生器一台

㈢实验内容及要求

8051内部定时计数器,按计数器模式和方式1工作,对

P3.4(T0)引脚进行计数,使用8051的T1作定时器,50ms 中断一次,看T0内每50ms来了多少脉冲,将计数值送显(通过LED发光二极管8421码来表示),1秒后再次测试。

㈣实验说明

1. 本实验中内部计数器其计数器的作用,外部事件计数器脉冲由P3.4引入

定时器T0。单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变,这就要求被采样电平至少维持一个完整的机器周期,以保证电

平在变化之前即被采样,同时这就决定了输入波形的频率不能超过机器周期频率。 2. 计数脉冲由信号发生器输入(从T0端接入)。

3. 计数值通过发光二极管显示,要求:显示两位,十位用L4~L1的8421

码表示,个位用L8~L5的8421码表示

4. 将脉搏检查模块接入电路中,对脉搏进行计数,计算出每分钟脉搏跳动

次数并显示

㈤实验框图(见下页)

程序源代码 ORG 00000H LJMP MAIN

ORG 001BH AJMP MAIN1 MAIN:

MOV SP,#60H

MOV TMOD,#15H MOV 20H,#14H MOV TL1,#0B0H MOV TH1,#3CHMOV TL0,#00H

;T0的中断入口地址 ;设置T1做定时器,T0做计数器,都于方式1工作 ;装入中断次数 ;装入计数值低8位 ;装入计数值高8位

MOV TH0,#00H

SETB TR1 ;启动定时器T1 SETB TR0 ;启动计数器T0 SETB ET1 ;允许T1中断 SETB EA ;允许CPU中断 SJMP $;

等待中断

MAIN1: PUSH PSW PUSH ACC CLR TR0

CLR TR1 MOV TL1,#0B0H MOV TH1,#3CH

DJNZ 20H,RETUNT MOV 20H ,#14H

SHOW: MOV R0,TH0 MOV R1,TL0

MOV A,R1 MOV B,#0AH DIV AB

MOV C,ACC.3MOV P1.0,C MOV C,ACC.2 MOV P1.1,C MOV C,ACC.1 MOV P1.2,C MOV C,ACC.0 MOV P1.3,C

MOV A,B MOV C,ACC.3MOV P1.4,C MOV C,ACC.2 MOV P1.5,C MOV C,ACC.1 MOV P1.6,C MOV C,ACC.0 MOV P1.7,C ;保护现场

;装入计数值低8位

;装入计数值高8位,50ms;允许T1中断

;未到1s,继续计时 ;1s到重新开始

;显示计数器T0的值;读计数器当前值 ;将计数值转为十进制

;显示部分,将A中保存的十位赋给L0~L3 将B中保存的各位转移到A中 ;将个位的数字显示在L4~L7上;

RETUNT:

MOV TL0,#00H;将计数器T0清零 MOV TH0,#00H

SETB TR0SETB TR1POP ACCPOP PSW

RETI ;中断返回

在频率为1000HZ时,L0~L7显示为50;频率为300HZ 时,L0~L7显示为15,结果正确,程序可以正确运行。思考与小结:

有了前面的定时器实验做基础,定时器计数器的选择以及初始化已经不再是难点,本次试验的重点是写入两个中断判断程序和十六进制到十进制的转化和显示。MOV TL1,#0B0H ;装入计数值低8位

MOV TH1,#3CH;装入计数值高8位,50ms

MOV 20H,#14H ;未到1s,继续计时 DJNZ 20H,RETUNT;1s 到重新开始 RETUNT:

MOV TL0,#00H;将计数器T0清零 MOV TH0,#00H

由于书上详细解释了设置中断时间的问题,所以中断程序并没有什么太大的难点,主要是要思考一下程序的执行顺序问题。

十六进制到十进制的转化和显示使我们这次实验遇到的比较大的困难,刚开始采用的是DA指令,由于没有搞清楚它的实质错误的使用了DA。DA用于十六进制到BCD的转换,不能用于十六进制到8421的转换,于是我们思考了很久。后来终于找到了比较简单的方法用除数,十位放在A中,

个位也就是余数放在B中。

MOV R0,TH0 ;读计数器当前值 MOV R1,TL0

MOV A,R1 MOV B,#0AH

DIV AB;将计数值转为十进制

由于这次的数字比较小而且要显示在L0~L7上,所以可以用这种方法,如果是数字比较大的话这种方法也不奏效,需要写一段通用代码来实现。

后面的问题可谓是一只强大的拦路虎,可能是基础只是不过关的缘故,我们一直在数字的显示顺序上纠结万分,用了左循环但是没有达到预期目的,在老师的指导之下才知道原来可以直接位赋值。以后一些使用的知识和技巧一定要掌握。

MOV C,ACC.3 ;显示部分,将A中保存的十位赋给L0~L3 MOV P1.0,C MOV C,ACC.2 MOV P1.1,C

MOV C,ACC.1 MOV P1.2,C MOV C,ACC.0 MOV P1.3,C

MOV A,B;将B中保存的各位转移到A中 MOV C,ACC.3 ;将个位的数字显示在L4~L7上 MOV P1.4,C MOV C,ACC.2 MOV P1.5,C MOV C,ACC.1 MOV P1.6,C MOV C,ACC.0 MOV P1.7,C

篇二:51单片机定时器实验

电子信息工程学系实验报告

相关文档
最新文档