单片机定时器实验报告

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

XXXX大学信息工程与自动化学院学生实验报告

(2009 —2010 学年第二学期)

课程名称:单片机开课实验室: 2010年 5月14日

一.实验目的:

掌握定时器T0、T1的方式选择和编程方法,了解中断服务程序的设计方法,学会实时程序的调试技巧。

二.实验原理:

MCS-51单片机内设置了两个可编程的16位定时器T0和T1,通过编程,可以设定为定时器和外部计数方式。T1还可以作为其串行口的波特率发生器。

定时器T0由特殊功能寄存器TL0和TH0构成,定时器T1由TH1和TL1构成,特殊功能寄存器TMOD控制定时器的工作方式,TCON控制其运行。定时器的中断由中断允许寄存器IE,中断优先权寄存器IP中的相应位进行控制。定时器T0的中断入口地址为000BH,T1的中断入口地址为001BH。

定时器的编程包括:

1)置工作方式。

2)置计数初值。

3)中断设置。

4)启动定时器。

定时器/计数器由四种工作方式,所用的计数位数不同,因此,定时计数常数也就不同。

在编写中断服务程序时,应该清楚中断响应过程:CPU执行中断服务程序之前,自动将程序计数器PC内容(即断点地址)压入堆栈保护(但不保护状态寄存器PSW,更不保护累加器A和其它寄存器内容),然后将对应的中断矢量装入程序计数器PC使程序转向该中断矢量地址单元中以执行中断服务程序。定时器T0和T1对应的中断矢量地址分别为000BH 和001BH。

中断服务程序从矢量地址开始执行,一直到返回指令“RETI”为止。“RETI”指令的操作一方面告诉中断系统该中断服务程序已经执行完毕,另一方面把原来压入堆栈保护的断点地址从栈顶弹出,装入到程序计数器PC,使程序返回到被到中断的程序断点处,以便继续执行。

因此,我们在编写中断服务程序时注意。

1.在中断矢量地址单元放一条无条件转移指令,使中断服务程序可以灵活地安排在64K 字节程序存储器的任何空间。

2.在中断服务程序中应特别注意用软件保护现场,以免中断返回后,丢失原寄存器、累加器的信息。

3.若要使执行的当前中断程序禁止更高优先级中断,可以先用软件关闭CPU中断,或禁止某中断源中断,在返回前再开放中断。

三.实验内容:

编写并调试一个程序,用AT89C51的T0工作方式1产生1s的定时时间,作为秒计数时间,当1s产生时,秒计数加1;秒计数到60时,自动从0开始。实验电路原理如图1所示。

计算初值公式

定时模式1 th0=(216-定时时间) /256

tl0=(216-定时时间) mod 256

图1 定时器实验电路原理图

四.实验步骤:

1.打开Proteus ISIS编辑环境,按下表所列的元件清单添加元件。

元件名称所属类所属子类

AT89C51 Microprocessor ICs 8051 Family

CAP Capacitors Generic CAP-ELEC Capacitors Generic

CRYSTAL Miscellaneous -

RES Resistors Generic 7SEG-COM-CA T-GRN Optoelectronics 7-Segment Displays PULLUP Modelling Primitives Digital[Miscellaneous] AT889C51元件,界面如图所示:

元件全部添加时,点击所添加的文件,并点击右键,选择“编辑属性”;

元件全部添加后,在Proteus ISIS的编辑区域中按实验原理图连接硬件电路,连接结果如下图所示;

2.按实验要求在KeilC中创建项目,编辑、编译程序,程序如下图所示;

由编译结果可见,程序无误,可进行导入。

3.将编译生成的目标码文件(后缀为.Hex)传入Proteus的实验电路中。

在proteus软件已经完成实验电路图中选中元件“A T89C51”,单击元件,添加已生成的.hex 文件,点击“确定”,即可导入,如下图所示;

4.在Proteus ISIS仿真环境中运行程序,观察实验运行结果并记录。

点击左下角的运行按钮,即可看到运行结果,从00开始循环计数,秒计数到60时,自动从0开始,点击暂停按钮,记录实验结果如下图所示:

当计数器到59后,自动从00开始,如下图所示;

由此可见,电路连接正确,源代码正确,实现了实验的相应要求。

五.参考程序:

second equ 30h

count equ 31h

org 00h

ljmp start

org 0bh

ljmp int_t0

start: mov second,#00h

mov count,#00h

mov dptr,#table ;段码表首址

mov p0,#3fh

mov p2,#3fh

mov tmod,#01h

mov th0,#(65536-50000)/256

mov tl0,#(65536-50000) mod 256 ;定时50ms

setb tr0

mov ie,#82h

sjmp $

int_t0: mov th0,#(65536-50000)/256

mov tl0,#(65536-50000) mod 256

inc count

mov a,count

cjne a,#20,i2 ;是否到1s

mov count,#00h

inc second

mov a,second

cjne a,#60,i1 ;是否到60s

mov second,#00h

i1: mov a,second

mov b,#10

div ab

movc a,@a+dptr

mov p0,a

mov a,b

movc a,@a+dptr

mov p2,a

i2: reti

table: db 3fh,06h,5bh,4fh,66h

db 6dh,7dh,07h,7fh,6fh

end

六.思考题:

若用定时器1方式2,程序如何修改?

答:程序修改如下:

SECOND EQU 30H

COUNT EQU 31H

ORG 00H

LJMP START

ORG 1BH ;T1中断入口地址

相关文档
最新文档