竭诚为您提供优质文档/双击可除
单片机定时器实验报告
篇一:单片机定时器实验报告
xxxx大学信息工程与自动化学院学生实验报告 (20XX—20XX学年第二学期)
课程名称:单片机开课实验室:20XX年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 页 共 15 页
定时器的编程包括: 1) 2) 3)
4)置工作方式。置计数初值。中断设置。启动定时器。 定时器/计数器由四种工作方式,所用的计数位数不同,因此,定时计数常数也就不同。
在编写中断服务程序时,应该清楚中断响应过程:cpu执行中断服务程序之前,自动将程序计数器pc内容(即断点地址)压入堆栈保护(但不保护状态寄存器psw,更不保护累加器A和其它寄存器内容),然后将对应的中断矢量装入程序计数器pc使程序转向该中断矢量地址单元中以执行中断服务程序。定时器T0和T1对应的中断矢量地址分别为000bh和001bh。
中断服务程序从矢量地址开始执行,一直到返回指令“ReTI”为止。“ReTI”指令的操作一方面告诉中断系统该中断服务程序已经执行完毕,另一方面把原来压入堆栈保护的断点地址从栈顶弹出,装入到程序计数器pc,使程序返回到被到中断的程序断点处,以便继续执行。 因此,我们在编写中断服务程序时注意。
1.在中断矢量地址单元放一条无条件转移指令,使中断服务程序可以灵活地安排在64K字节程序存储器的任何空
第 2 页 共 15 页
间。
2.在中断服务程序中应特别注意用软件保护现场,以免中断返回后,丢失原寄存器、累加器的信息。 3.若要使执行的当前中断程序禁止更高优先级中断,可以先用软件关闭cpu中断,或禁止某中断源中断,在返回前再开放中断。 三.实验内容:
编写并调试一个程序,用AT89c51的T0工作方式1产生1s的定时时间,作为秒计数时间,当1s产生时,秒计数加1;秒计数到60时,自动从0开始。实验电路原理如图1所示。
计算初值公式
定时模式1th0=(216-定时时间)/256 tl0=(2-定时时间)mod25616 图1定时器实验电路原理图 四.实验步骤:
1.打开proteusIsIs编辑环境,按下表所列的元件清单添加元件。
AT889c51元件,界面如图所示:
元件全部添加时,点击所添加的文件,并点击右键,选择“编辑属性”;
元件全部添加后,在proteusIsIs的编辑区域中按实验
第 3 页 共 15 页
原理图连接硬件电路,连接结果如下图所示;
2.按实验要求在Keilc中创建项目,编辑、编译程序,程序如下图所示;
由编译结果可见,程序无误,可进行导入。
3.将编译生成的目标码文件(后缀为.hex)传入proteus的实验电路中。
在proteus软件已经完成实验电路图中选中元件“AT89c51”,单击元件,添加已生成的.hex文件,点击“确定”,即可导入,如下图所示;
4.在proteusIsIs仿真环境中运行程序,观察实验运行结果并记录。
点击左下角的运行按钮,即可看到运行结果,从00开始循环计数,秒计数到60时,自动从0开始,点击暂停按钮,记录实验结果如下图所示: 篇二:51单片机定时器实验报告 51单片机定时器实验 实验内容: 实验内容:
(1)编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。c语言程序 #include
#defineuintunsignedint
第 4 页 共 15 页
#defineucahrunsignedchar sbitFm=p0^0; voidmain() {
TmoD=0x01;
Th0=(65535-50000)/256; Th0=(65535-50000)%6; eA=1;//开总中断 eT0=1;//开定时器0中断 TR0=1; while(1); }
voidT0_time()interrupt1 { } 汇编程序
oRg0000hJAmpmAInoRg000bhTh0=(65535-50000)/256;Th0=(65535-50000)%6;Fm=~Fm; LJmpInT0_InToRg0100h mIAn:seTbeA seTbeT0AJmp$
第 5 页 共 15 页
InT0_InT:moVR2,#0FAh
moVR3,#0c8hDJnZR3,$DJnZR2,InT0_InTReTI
(2)编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。 #include
#defineuintunsignedint #defineucahrunsignedchar uintnum,num1; sbitFm=p0^7; intshi,ge,a; voiddelay(uint); voidshumaguan();
unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管0-F编码表 voidmain() {
TmoD=0x01;
Th0=(65535-50000)/256;
第 6 页 共 15 页