当前位置:文档之家› 单片机课定时器

单片机课定时器

单片机课定时器
单片机课定时器

燕山大学

课程设计说明书题目:定时器实验

学院(系):电气工程学院

年级专业: 09级仪表(2)班

学号: 0901******** 学生姓名:吴季哲

指导教师:张淑清

教师职称:教授

摘要

单片机,一个集成在一块芯片上的完整计算机系统。尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。单片机8031中有两个16位定时器/计数器,分别为定时器/计数器0和定时器/计数器1,简称为定时器0(T0)和定时器1(T1)。定时器/计数器具有计数和定时功能,拥有4种工作方式,即工作方式0~3。本次课程设计采用的是定时器0的工作方式2来实现定时功能。利用工作方式2的区别于定时工作方式0和1的自动重新加载功能,循环定时,通过软件和硬件的结合达到定时的目的。在单片机外部接连适当的电路,通过开关按键启停定时功能,通过二极管灯亮与否判断定时时间到否。

关键词单片机8031 定时器0 工作方式2 二极管

目录

摘要 (1)

第一章.绪论 (3)

1.1 引言 (3)

1.2本人所做工作 (3)

1.3课题概述 (3)

第二章课程设计报告内容 (5)

2.1 双音多频(DTMF)信号简介 (5)

2.1.1相关控制寄存器 (5)

2.1.2定时器工作方式2 (7)

2.1.3 总体设计 (9)

2.2 详细设计 (9)

2.2.1 硬件设计 (9)

2.2.2软件设计 (11)

第三章程序代码及其分析 (13)

3.1 定时器程序代码 (13)

3.1.1定时器的原程序代码如下所示 (13)

3.1.2修改后定时器的原程序代码如下所示 (14)

3.2结果分析 (18)

3.2.1在原程序中结果分析 (18)

3.2.1在扩展程序中结果分析 (19)

第4章总结 (20)

参考文献

第一章绪论

1.1 引言

在我们平时的生活中,有许多地方可以看到定时的影子,如手表定时、电脑电视定时、工厂车间零件制作定时等等。定时不仅让我们的生活变得时间化和规律化,也从一定程度上提高了生产力,提高了人民的生活水平。基于单片机的定时,轻巧简便,利于携带和操作,在当今物质文化飞速发展的今天更是必不可少的。所以研究基于单片机的定时器设计很有意义。

1.2 本人所做工作

在这次的单片机课程设计中,我和同组同学被派发“定时器”这一课题。作为一名普通的组员,我和其他组员都各尽其职,为顺利完成此次课题一起努力着。课程设计期间,我和同组人员讨论并完善程序代码。这个过程让我受益匪浅,不仅提高了自己的代码分析能力,也从一定程度上锻炼了动手能力。

1.3课题概述

在单片机控制应用的定时和计数的需求很多,为此在单片机中都有定时器/计数器。8031的两个定时器/计数器都是16位加法计数结构。由于在8031中只能使用8为字节寄存器,所以把两个16位定时器分解为4个8位定时器,依次为TL0、TL1、TH0和TH1。它们均属于专用寄存器之列。

单片机的定时功能是通过计数器的计数来实现的,不过此时的计数脉冲来自单片机芯片内部,每个机器周期有一个计数脉冲,即每个机器周期计数器加1。由于一个机器周期等于12个振荡脉冲周期,因此,计数频率为振荡频率的1/12。如果单片机采用12MHz晶振,则计数频率为1MHz,

即每微妙计数器加1。这样,在使用定时器是既可以根据计数值计算出定时时间,也可以通过定时时间的要求算出计数器的预置值。

要实现定时器的功能,需要用到与定时器/计数器应用有关的控制寄存器,它们分别是:定时器控制寄存器(TCON)、定时器方式选择寄存器(TMOD)、中断允许控制寄存器(IE)。

此次课题所要设计的系统比较简易,其主要功能是:利用定时器/计数器定时,去实现二极管不同顺序发光。

第二章课程设计报告内容

2.1 背景知识

2.1.1相关控制寄存器

在8031中,与定时器/计数器应用有关的控制寄存器共有3个,分别是定时控制寄存器、工作方式控制寄存器和中断允许控制寄存器。本次课程设计将会涉及这三个控制寄存器,现对它们说明如下。

(1)定时器控制寄存器(TCON)

TCON寄存器地址为88H,位地址为8FH~88H。该寄存器位定义及位地址表示如表3-1所示。

表3-1 TCON寄存器表示

定时器控制寄存器中,与定时器/计数器有关的控制位共4位,即TF1、TR1、TF0和TR0,它们的作用分别为:

TR0和TR1——运行控制位。TR0(TR1)=0,停止定时器/计数器工作;TR0(TR1)=1,启动定时器/计数器工作。控制计数启停只需用软件方法使其置1或清0即可。

TF0和TF1——计数溢出标志位。当计数器产生计数溢出时,相应溢出标志位由硬件置1。计数溢出标志用于表示定时/计数是否完成,因此,它

是供查询的状态位。当采用查询方法是,溢出标志位被查询,并在后续处理程序中应以软件方法及时将其清0。而当采用中断方法是,溢出标志位不但能自动产生中断请求,而且连清0操作也能在转向中断服务程序时由硬件自动进行。

(2)定时器方式选择寄存器(TMOD)

TMOD寄存器用于设定定时器/计数器的工作方式。寄存器地址为89H,但它没有位地址,不能进行位寻址,只能用字节传送指令设置其内容。该寄存器的位定义如表3-2所示。

表3-2 TMOD寄存器表示

它的低半字节对应定时器/计数器0,高半字节对应定时器/计数器1,前后半字节的位格式完全对应。位定义如下:

GATE——门控位。GA TE=0,以运行控制位TR启动定时器;GATE=1,以外中断请求信号(0

INT)启动定时器,这可以用于外部脉冲宽度

INT或1

测量。

C/——定时方式或计数方式选择为。

T

T

C/=1,计数工作方式。

C/=0,定时工作方式;T

M1M0——工作方式选择位。

M1M0=00,工作方式0;M1M0=01,工作方式1;

M1M0=10,工作方式2;M1M0=11,工作方式3。

(3)中断允许控制寄存器(IE)

该寄存器地址为A8H,位地址为AFH~A8H。寄存器位定义及位地址如表3-3所示。

表3-3 IE寄存器表示

其中与定时器/计数器有关的是定时器/计数器中断允许控制位ET0和

ET1。

ET0(ET1)=0,禁止定时器中断;

ET0(ET1)=1,允许定时器中断。

2.1.2 定时器工作方式2

8031的两个定时器/计数器都有4种工作方式是,即工作方式0~3。由于本次课程设计主要涉及定时器/计数器0的工作方式2,所以以下将重点介绍定时器/计数器0的工作方式2。

本次课程设计使用定时器工作方式2,是由于其相对定时器工作方式0和工作方式1有一定的长处。工作方式0和工作方式1有一个共同点,就是计数溢出后计数器全为0,因此循环定时应用时就需要反复设置计数初值。这不但影响定时精度,而且也给程序设计带来麻烦。工作方式2就是针对此问题而设置的,它具有自动重新加载计数初值的功能,免去了反复设置计数初值的麻烦。

定时器/计数器0的工作方式0和工作方式2所对应的电路逻辑结构图分别如图3-1和图3-2所示。

图3-1定时器/计数器0的工作方式0逻辑结构

图3-2 定时器/计数器0的工作方式2逻辑结构

对比上述两图,我们可以发现工作方式0和工作方式2对应的逻辑结构还是有许多部分相同的,如两图的右半部分,而两图左半部分则有所差异。下面将对其相同点和不同点作简要分析,这也是为什么这次课程设计选择工作方式2的原因。

相同点:两种工作方式,计数脉冲既可以来自芯片内部,也可以来自外部。来自内部的是机器周期脉冲,图中OSC是英文Oscillator(振荡器)的缩写,表示芯片的晶振脉冲,经12分频后,即为单片机的机器周期脉冲。来自外部的计数脉冲由T0(P3.4)引脚输入,计数脉冲由控制寄存器TMOD

的T

C/位进行控制。当T

C/=0时,接通机器周期脉冲,计数器每个机器周期

进行一次加1,这就是定时器工作方式;当T

C/=1时,接通外部计数引脚T0(P3.4),从T0引入计数脉冲输入,这就是计数工作方式。

不同点:如图3-1所示的左半部分,工作方式0条件下,TL0使用了5位,当TL0的低5位计数溢出时,向TH0进位;而全部13位计数溢出时,

向计数溢出标志位TF0进位,将其置1。如图3-2所示的左半部分,工作方

式2条件下,16位计数器被分成两部分,TL作为计数器使用,TH作为预置寄存器使用,初始化时把计数初值分别装入TL和TH中。当计数溢出后,由预置寄存器TH以硬件方法自动给计数器TL重新加载。变软件加载为硬件加载。更详细点,初始化时,8位计数初值同时装入TL0和TH0。当TL0计数溢出时,置位TF0,并用保存在预置寄存器TH0中的计数初值自动加载TL0,然后开始重新计数。如此重复,这样不但省去了用户程序中的重装指令,而且也有利于提高定时精度。

2.1.3 总体设计

如图3-3所示是此次课题设计的总体框架图。

图3-3 定时器总体框架图

2.2 详细设计

2.2.1 硬件设计

(1)定时器设计电路图

本次课程设计设计的电路图如图3-4所示。图中单片机采用8031,由图可见,P1.0~P1.7依次控制八个LED灯。

图3-4 定时器电路图

2.2.2软件设计

(1)计数初值计算

根据定时器/ 计数器0的工作方式2逻辑结构图可知,使用工作方式2的计数范围是1~255,定时时间的计算公式为:

(28-计数初值)*晶振周期*12

或(28-计数初值)*机器周期

本次课题设计的晶振频率为12MHz,所以机器周期为1微秒。由于工作方式2计数最高限值为255,所以这里选定定时时间为100微秒,这样可计算出计数初值。设计数初值为x,则

(28- x)*1*10-6s=100*10-6s

计算得x=(256-50)=(256-50)。所以寄存器TL0和TH0都设置初值为CEH。

每一次定时时间要求是100U秒,所以可利用软件方法实现10000次1

秒的定时,这就是循环定时。

(2)详细流程图

定时器设计的详细流程图如图3-5所示。

图3-5 定时器设计详细流程图

第三章程序代码及其分析3.1 定时器程序代码

3.1.1定时器的原程序代码如下所示。

#include

#define Tick 10000 // 10000 x 100us = 1s

#define T100us (256-50) // 100us时间常数(6M)

unsigned int C100us; // 100us记数单元

bit LEDBuf;

sbit LED = P1^0;

void T0Int() interrupt 1

{

C100us--;

if (C100us == 0) {

C100us = Tick; // 100us 记数器为0, 重置记数器

LEDBuf = !LEDBuf; // 取反LED

}

}

void main()

{

TMOD = 0x02; // 方式2, 定时器

TH0 = T100us;

TL0 = T100us;

IE = 0x82; // EA=1, IT0 = 1

LEDBuf = 0;

LED = 0;

C100us = Tick;

TR0 = 1; // 开始定时

while (1) {

LED = LEDBuf;

}

}

3.1.2修改后定时器的原程序代码如下所示。#include

#define Tick 8000 // 10000 x 100us = 1s

#define T100us (256-50) // 100us时间常数(6M)

unsigned int C100us; // 100us记数单元

bit LEDBuf0;

sbit LED0 = P1^0;

bit LEDBuf1;

sbit LED1 = P1^1;

bit LEDBuf2;

sbit LED2 = P1^2;

bit LEDBuf3;

sbit LED3 = P1^3;

bit LEDBuf4;

sbit LED4 = P1^4;

bit LEDBuf5;

sbit LED5 = P1^5;

bit LEDBuf6;

sbit LED6= P1^6;

bit LEDBuf7;

sbit LED7 = P1^7;

void T0Int() interrupt 1

{

C100us--;

if (C100us == 7900) {

LEDBuf0 = !LEDBuf0;// 取反LED

if (C100us == 7500) {

LEDBuf0 = !LEDBuf0;// 取反LED }

if (C100us == 7000) {

LEDBuf1 = !LEDBuf1; // 取反LED }

if (C100us == 6500) {

LEDBuf1 = !LEDBuf1; // 取反LED }

if (C100us == 6000) {

LEDBuf2 = !LEDBuf2;

// 取反LED

}

if (C100us == 5500) {

LEDBuf2 = !LEDBuf2;

// 取反LED

}

if (C100us == 5000) {

LEDBuf3= !LEDBuf3;// 取反LED }

if (C100us == 4500) {

LEDBuf3= !LEDBuf3;// 取反LED }

if (C100us == 3500) {

LEDBuf4 = !LEDBuf4;

// 取反LED

}

if (C100us == 3000) {

LEDBuf4 = !LEDBuf4;

// 取反LED

}

if (C100us == 2500) {

LEDBuf5 = !LEDBuf5;

// 取反LED

}

if (C100us == 2000) {

LEDBuf5 = !LEDBuf5;

// 取反LED

}

if (C100us == 1500) {

LEDBuf6= !LEDBuf6;

// 取反LED

}

if (C100us == 1000) {

LEDBuf6= !LEDBuf6;

// 取反LED

}

if (C100us == 500) {

LEDBuf0 = !LEDBuf0;

// 取反LED

}

if (C100us == 0) {

C100us = Tick; // 100us 记数器为0, 重置记数器LEDBuf0 = !LEDBuf0;

// 取反LED

}

}

void main()

{

TMOD = 0x02; // 方式2, 定时器TH0 = T100us;

TL0 = T100us;

IE = 0x82; //EA=1;IT0 = 1 ;

LEDBuf0 = 0;

LED0 = 0;

LEDBuf1 = 0;

LED1 = 0;

LEDBuf2 = 0;

LED2 = 0;

LEDBuf3 = 0;

LED3 = 0;

LEDBuf4 = 0;

LED4 = 0;

LEDBuf5 = 0;

LED5 = 0;

LEDBuf6 = 0;

LED6 = 0;

LEDBuf7 = 0;

LED7 = 0;

C100us = Tick;

TR0 = 1;

TR1 = 1; // 开始定时

while (1) {

LED0 = LEDBuf0;

LED1 = LEDBuf1;

LED2 = LEDBuf2;

LED3 = LEDBuf3;

LED4 = LEDBuf4;

LED5 = LEDBuf5;

LED6 = LEDBuf6;

LED7 = LEDBuf7;

}

}

3.2结果分析

3.2.1在原程序中

于本次课程设计主要涉及定时器/计数器0的工作方式2,所以以下将重点介绍定时器/计数器0的工作方式2。

本次课程设计使用定时器工作方式2,是由于其相对定时器工作方式0和工作方式1有一定的长处。工作方式0和工作方式1有一个共同点,就是计数溢出后计数器全为0,因此循环定时应用时就需要反复设置计数初值。这不但影响定时精度,而且也给程序设计带来麻烦。工作方式2就是针对此问题而设置的,它具有自动重新加载计数初值的功能,免去了反复设置计数初值的麻烦。

程序中给TMOD 赋值0x02,使定时器0工作在方式二。

根据定时时间,及公式(28-计数初值)*晶振周期*12计算出TH0和Tl0所需装的初值。

程序开始,TMOD,TH0和Tl0首先赋值,EA=1,IT0 = 1 ;将Tick 的值赋给C100us ;Tick的值已经宏定义为定值。

TR1 = 1表示已经开始定时,此时进入子函数void T0Int() interrupt 1;同时,主函数中while (1){}函数的内容一直循环执行,将LEDBuf 的内容赋值给LED,时实控制二极管的亮灭。

void T0Int() interrupt 1函数中,执行C100us--,直到C100us减为0,LEDBuf取反,

LEDBuf为全局变量,因此LED即P1.0输出取反,实现灯的亮灭转换。

3.2.1在扩展程序中

将一个LED扩展到LED0~LED7,同时添加LEDBuf0~ LEDBuf7,同时用到P1.0~P1.7口,初始程序不做改变,仍用到定时器0的方式2功能。while (1){}函数中LEDBuf0~ LEDBuf7依次赋值给LED0~LED7分别控制八个发光二极管的亮灭。

程序运行,进入子函数void T0Int() interrupt 1后,执行C100us--,减够500次,首先将LEDBuf0进行取反,的内容赋值给LED0,再进行C100us--,减够500次,LEDBuf0再进行取反,的内容赋值给LED0实现LED0二极管的亮灭一次。以此类推,其他7个发光二级管依次亮灭,如此循环管,实现八个二极管循环流动式亮灭。

STC89C52单片机定时器2的使用

STC89C52单片机定时器2的使用 实现定时和计数的方法一般有:软件定时、专用电路和可编程定时器/计数器三种方法。软件定时:执行一个循环程序进行时间延迟。定时准确,不需要外加硬件电路,但会增加CPU 开销。专用硬件电路定时:可以实现请精确 的定时和计数,但参数调节不方波。可编程定时器/计数器:不占用CPU 时间,能与CPU 并行工作,实现精确的定时和计数,又可以通过变成设置其工作方 式和其他参数,使用方便。以下说明仅试用宏晶的STC89C52!!定时器 2:T2MOD,T2CON,TH2,TL2,RC2H,RC2L.T2MOD:0C9H(不可位寻址) 000000T2OEDCENT2OE:定时器输出使能位DECN:向上/向下计数使能位。定时器2 可配制成向上/向下计数器。0:向上计数(模式状态) 1:向下计数(尽量不使用)T2CON:0XC8H(可位寻址) TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2TF2:7 上/下溢出标志位,定时器2 溢出时置位,必须有用软件清零!当RCLK 或TCLK=1 时,TF2 将不会 置位。EXF2:6 定时器2 外部标志,当EXEN2=1 且T2EX 的负跳变产生捕获或重装时,EXF2 置位。定时器2 中断使能时,EXF2=1 将使CPU 从中断向量处执行定时器2 中断子程序。EXF2 位必须用软件清零。在递增/递减计数器 模式(DCEN=1)中,EXF2 位不会引起中断。RCLK:5 接收时钟标志。RCLK 置位时,定时器2 的溢出脉冲作为串口模式1 和模式3 的接收时钟。RCLK=0 时,将定时器1 的溢出脉冲作为串口模式1 和模式3 的接收时钟。TCLK:4 发送时钟标志位。TCLK 置位时,定时器2 的溢出脉冲作为串口模式1 和模式3 的发送时钟。TCLK=0 时,将定时器1 的溢出脉冲作为串口模 式1 和模式3 发送时钟。EXEN2:3 定时器2 外部使能标志。当其置位且定时器2 未作为串口时钟时,允许T2EX 的负跳变产生捕获或重装。

实验三单片机定时计数器实验

实验三单片机定时/计数器实验 1、实验目的 1、学习计数器的使用方法。 2、学习计数器程序的编写。 3、学习定时器的使用方法。 4、学习定时器程序的编写。 5、熟悉汇编语言 2、实验说明 1、8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。 2、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转 3、实验仪器和条件 计算机 伟福实验箱(lab2000P) 4、实验内容 1、8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。 2、外部事件计数脉冲由P3.4引入定时器T0。单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变。这就要求被采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样。同时这就决定了输入波形的频率不能超过机器周期频率。 3、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转 4、定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。TMOD

用于设置定时器/计数器的工作方式0-3,并确定用于定时还是用于计数。TCON 主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。 5、在例程的中断服务程序中,因为中断定时常数的设置对中断程序的运行起到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。 五、思考题 1、使用其他方式实现本实验功能; 2、改为门控方式外部启动计数; 3、如果改为定时间隔为200us,如何改动程序; 4、使用其他方式实现本实验功能,例如使用方式1,定时间隔为10ms,如何改动程序。 六、源程序修改原理及其仿真结果 思考题一:使用其他方式实现本实验功能 方法一: movTMOD, #00000100b;方式0,记数器 movTH0, #0 movTL0, #0 setbTR0;开始记数;由于方式0的特点是计数时使用TL0的低五位和八位 TH0,故用加法器a用“与”(ANL)取TL0的低五位,再用yiwei子程序实现TH0的低三位变为高三位与TL0相加,这样赋给P1时就是八位计数的结果。 Loop: mova,TL0 anla,#1fh

基于51单片机的多功能定时器

摘要 本设计要求以单片机为核心主体,完成最小系统板的设计与制作(通过Protel 软件,对电路进行设计,调试。生成PCB板,再对元器件进行排布,焊接。)之后要进行初调试,证实电路板无误后才能进行下面的内容。电路板完成后,在总程序基础上通过编程设计家用多路定时控制器。本课程设计目标:具有正常数字钟功能,包括时间校正,具有至少三路定时开关控制功能,每路定时时间可以任意设置。但重要的是要有一定的创新,因为此系统还有很多值得开发的功能,单纯的三路定时只是设计内容的基本要求。 关键词:Protel,单片机,MCS-51

目录 摘要........................................................................................................ - 1 - 引言........................................................................................................ - 2 - 1 绪论.................................................................................................... - 2 - 1.1系统背景 (1) 1.1.1单片机技术及其发展特点 (1) 1.1.2单片机在电子技术中的应用 (3) 1.1.3课程设计的内容与任务 (4) 2 系统电路设计 (5) 2.1 系统总体设计框架结构 (5) 2.2 系统硬件单元电路设计 (6) 2.2.1 时钟电路设计 (6) 2.2.2 复位电路设计 (6) 2. 2.3 按键电路设计 (7) 2.3数码管电路设计 (8) 2.3.1、数码管的分类 (8) 2.3.2、数码管的驱动方式 (8) 2.3 系统硬件总电路 (14) 3 系统软件设计 (10) 3.1 系统软件流程图 (10) 4 实验结果和分析 (11) 4.1 实验使用的仪器设备 (11) 4.2 测试结果分析 (11) 结论 (12) 参考文献 (13) 附录 (13) 系统程序设计 (15) Abstract (25) 致谢 (25)

4实验四 单片机定时器的使用

姓名:学号:日期: 实验四单片机定时器的使用 一、实验名称:单片机定时器的使用 二、实验目的 1.掌握在Keil环境下建立项目、添加、保存源文件文件、编译源程序的方法; 2.掌握运行、步进、步越、运行到光标处等几种调试程序的方法; 3.掌握在Proteus环境下建立文件原理图的方法; 4.实现Proteus与Keil联调软件仿真。 三、使用仪器设备编号、部件及备件 1.实验室电脑; 2.单片机实验箱。 四、实验过程及数据、现象记录 1.在Proteus环境下建立如下仿真原理图,并保存为文件; 原理图中常用库元件的名称: 无极性电容:CAP 极性电容:CAP-ELEC 单片机:AT89C51 晶体振荡器:CRYSTAL 电阻:RES 按键:BUTTON 发光二极管:红色LED-RED 绿色LED-GREEN 蓝色LED-BLUE 黄色LED-YELLOW 2.在Keil环境下建立源程序并保存为.ASM文件,生成.HEX文件; 参考程序如下: ORG 0000H LJMP MAIN ORG H ;定时器T0的入口地址 LJMP TIMER0 MAIN: MOV TMOD,#01H

MOV R0,#05H MOV TH0,# H ;定时器的初值 MOV TL0,# H SETB ;开定时器T0的中断 SETB ;开CPU的中断 SETB ;启动定时器T0 MOV A,#01H LOOP: MOV P1,A RL A CJNE R0,#0,$ MOV R0,#05H SJMP LOOP TIMER0: DEC R0 MOV TH0,# H ;重装初值 MOV TL0,# H ;重装初值 RETI END 将以上程序补充完整,流水时间间隔为250ms。 3.将.HEX文件导入仿真图,运行并观察结果; 4.利用Keil软件将程序下载至实验箱,进行硬件仿真,观察实验结果。 五、实验数据分析、误差分析、现象分析 现象:实现流水灯,时间间隔250ms,由定时器实现定时250ms。 六、回答思考题 1.定时器由几种工作模式,各种模式的最大定时时间是多少? 2.各种模式下初值怎么计算?

单片机定时器详解

一、MCS-51单片机的定时器/计数器概念 单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单片机外接的是12MHZ的晶振(实际上是,所以,MCS-51单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令; 注:个人PC机上的CPU主频是晶振经过倍频之后的频率,这一点恰好与MCS-51单片机的相反,MCS-51单片机的主频是晶振经过分频之后的频率; 总之:MCS-51单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1个脉冲=1微秒=1条指令=1个机器周期; MCS-51单片机定时器/计数器的简单结构图: 8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合; 二、定时器/计数器的结构

单片机定时器实验程序

ORG 0000H LJMP START ORG 001BH ;定时器/计数器1中断程序入口地址 LJMP INT ORG 0100H START: MOV TMOD,#10H ;计数器置为方式1 MOV TL1,#0B0H ;装入时间常数 MOV TH1,#03CH SETB ET1 ;允许定时器T1中断 SETB EA ;允许总中断 SETB TR1 ;开始计数 MOV R0,#05H ;05是进入中断的次数LOOP: MOV R1,#00H MOV R2,#26H ;灯的状态循环次数LOOP1: MOV A,R1 ACALL TABLE MOV P1,A INC R1 LOOP2: CJNE R0,#00H,LOOP2 MOV R0,#05H DJNZ R2,LOOP1 LJMP LOOP TABLE: INC A ;从表中取显示码入累加器 MOVC A,@A+PC RET DB 0FFH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,0H DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,00H,0FFH,0FEH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH DB 0EFH,0F7H,0FBH,0FDH,0FEH,0FFH,00H,0FFH,00H INT: CLR TR1 ;停止计数 DEC R0 ;计数值减一 MOV TL1,#0B0H ;重置时间常数初值 MOV TH1,#03CH SETB TR1 ;开始计数 RETI ;中断返回 END

将T1改为T0,并且溢出间隔为0.05s ORG 0000H LJMP START ORG 001BH ;定时器/计数器1中断程序入口地址 LJMP INT ORG 0100H START: MOV TMOD,#01H ;计数器置为方式1 MOV TL1,#78H ;装入时间常数 MOV TH1,#0CH SETB ET0 ;允许定时器T1中断 SETB EA ;允许总中断 SETB TR0 ;开始计数 MOV R0,#05H ;05是进入中断的次数 LOOP: MOV R1,#00H MOV R2,#25H ;灯的状态循环次数 LOOP1: MOV A,R1 ACALL TABLE MOV P1,A INC R1 LOOP2: CJNE R0,#00H,LOOP2 MOV R0,#05H DJNZ R2,LOOP1 LJMP LOOP TABLE: INC A ;从表中取显示码入累加器 MOVC A,@A+PC RET DB 0FFH,07FH,3FH,1FH,0FH,07H,03H,01H,00H DB 80H,81H,0C1H,0C3H,0E3H,0E7H,0F7H,0FFH DB 00H,0FFH,00H,0FFH,0EFH,0E7H,0C7H,0C3H,83H,81H,01H,00H DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH INT: CLR TR1 ;停止计数 DEC R0 ;计数值减一 MOV TL1,#78H ;重置时间常数初值 MOV TH1,#0CH SETB TR1 ;开始计数 RETI ;中断返回 END

51单片机定时器秒表设计程序

51单片机定时器秒表设计程序 #include typedef unsigned char UINT8; typedef unsigned int UINT16; code UINT8 SEGMENT[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; code UINT8 SHU[10] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; code UINT8 SELECT[8] ={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; #define S1 0x0e #define S2 0x0d #define S3 0x0b #define S4 0x07 sbit SPEAK=P3^5; sbit P3_3=P3^3; UINT8 mSecond,Second; void Delay(UINT16 t) { UINT16 i,j; for(i=0;i

单片机试验之定时器计数器应用试验二

一、实验目的 1、掌握定时器/计数器计数功能的使用方法。 2、掌握定时器/计数器的中断、查询使用方法。 3、掌握Proteus软件与Keil软件的使用方法。 4、掌握单片机系统的硬件和软件设计方法。 二、设计要求 1、用Proteus软件画出电路原理图,单片机的定时器/计数器以查询方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满100个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 2、用Proteus软件画出电路原理图,单片机的定时器/计数器以中断方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满200个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 三、电路原理图 六、实验总结 通过本实验弄清楚了定时/计数器计数功能的初始化设定(TMOD,初值的计算,被计数信号的输入点等等),掌握了查询和中断工作方式的应用。 七、思考题 1、利用定时器0,在P1.0口线上产生周期为200微秒的连续方波,利用定时器1,对 P1.0口线上波形进行计数,满50个,则取反P1.1口线状态,在P 1.1口线上接示波器观察波形。 答:程序见程序清单。 . . . . 四、实验程序流程框图和程序清单。 1、定时器/计数器以查询方式工作,对外部连续周期性脉冲信号进行计数,每计

满100个脉冲,则取反P1.0口线状态。 开始汇编程序开始 ORG 0000H START: LJMP MAIN TMO初始化 ORG 0100H 初始TMOD MAIN: MOV IE, #00H MOV TMOD, #60H计数初值初始计数初值初始化MOV TH1, #9CH MOV TL1, #9CH SETB TR1 中断初始中断初始化LOOP: JNB TF1, LOOP CLR TF1 CPL P1.0 启动定时器 AJMP LOOP 启动计数器 END

单片机定时器的使用

哈尔滨理工大学荣成学院 单片机原理及应用Protues 仿真实验 班级:电气18 学号: 姓名:

日期: 2020.06.03 实验五单片机定时器的使用 一、实验名称:单片机定时器的使用 二、实验目的 1.掌握在Keil环境下建立项目、添加、保存源文件文件、编译源程序的方法; 2.掌握运行、步进、步越、运行到光标处等几种调试程序的方法; 3.掌握在Proteus环境下建立文件原理图的方法; 4.实现Proteus与Keil联调软件仿真。 三、使用仪器设备编号、部件及备件 1.实验室电脑; 2.单片机实验箱。 四、实验过程及数据、现象记录 在Proteus 环境下建立如下仿真原理图,并保存为文件;

原理图中常用库元件的名称: 无极性电容:CAP 极性电容:CAP-ELEC 单片机:AT89C51 晶体振荡器:CRYSTAL 电阻:RES 按键:BUTTON 发光二极管:红色LED-RED 绿色LED-GREEN 蓝色LED-BLUE 黄色LED-YELLOW

在Keil环境下建立源程序并保存为.ASM文件,生成.HEX文件;汇编语言参考程序如下: ORG 0000H LJMP MAIN ORG H ;定时器T0的入口地址LJMP TIMER0 MAIN: MOV TMOD,#01H MOV R0,#05H MOV TH0,# H ;定时器的初值MOV TL0,# H SETB ;开定时器T0的中断SETB ;开CPU的中断SETB ;启动定时器T0 MOV A,#01H LOOP: MOV P1,A RL A CJNE R0,#0,$ MOV R0,#05H SJMP LOOP TIMER0: DEC R0 MOV TH0,# H ; MOV TL0,# H ; RETI END 将以上程序补充完整,流水时间间隔为250ms。#include #include #define uchar unsigned char #define uint unsigned int uchar i=0; void int_timer0()interrupt 1 { i++; if(i==5) { i=0; P1=_crol_(P1,1); } TH0=0x3c; TL0=0xb0; } void main() { TMOD=0x01; TH0=0x3c; TL0=0xb0; ET0=1; EA=1; TR0=1; P1=0xfe; while(1); } 将.HEX文件导入仿真图,运行并观察结果;

单片机定时器2的使用

/*----------------------------------------------- 名称:定时器2 内容:通过定时让LED灯闪烁,数据口为:P0口 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sfr T2MOD=0xC9; //定时器2模式控制寄存器地址;可以在头文件中定义 /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void T2_init(void) { T2CON=0; //配置定时器2控制寄存器,这里其实不用配置,T2CON上电默认就是0,这里赋值只是为了演示这个寄存器的配置 T2MOD=0; //配置定时器2工作模式寄存器,这里其实不用配置,T2MOD 上电默认就是0,这里赋值只是为了演示这个寄存器的配置 RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自动重载 RCAP2L = (65536-6000)%256; ET2=1; //打开定时器中断 EA=1; //打开总中断 TR2=1; //打开定时器开关 } /*------------------------------------------------ 主程序 ------------------------------------------------*/ main() { T2_init(); while(1); } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void T2_ISR(void) interrupt 5 using 1//定时器2中断 { //自动重装,无需再次赋初值! TF2=0;//!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!! P0=~P0; }

STC89C52单片机定时器2的使用

52单片机有3个定时器,T2是一个16位自动重载的,像T0和T1的方式2一样,只不过它是16位重载,如果作为计数器或定时用,中断用的是5,就是interrupt 5,T2的引脚是P1.0口。P1.0作为I/O 口用了以后T2计数是不行了,不过定时或是作为串口时钟还是可以的。 T2CON(T2的控制寄存器),字节地址0C8H: 0CFH 0CEH 0CDH 0CCH 0CBH 0CAH 0C9H 0C8H TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RT2 各位的定义如下: TF2:定时/计数器2溢出标志,T2溢出时置位,并申请中断。只能用软件清除,但T2作为波特率发生器使用的时候,(即RCLK=1或TCLK=1),T2溢出时不对TF2置位。 EXF2:当EXEN2=1时,且T2EX引脚(P1.0)出现负跳变而造成T2的捕获或重装的时候,EXF2置位并申请中断。EXF2也是只能通过软件来清除的。RCLK:串行接收时钟标志,只能通过软件的置位或清除;用来选择T1(RCLK=0)还是T2(RCLK=1)来作为串行接收的波特率产生器 TCLK:串行发送时钟标志,只能通过软件的置位或清除;用来选择T1(TCLK=0)还是T2(TCLK=1)来作为串行发送的波特率产生器 EXEN2:T2的外部允许标志,只能通过软件的置位或清除;EXEN2=0:禁止外部时钟触发T2;EXEN2=1:当T2未用作串行波特率发生器时,允许外部 时钟触发T2,当T2EX引脚输入一个负跳变的时候,将引起T2的捕获 或重装,并置位EXF2,申请中断。 TR2:T2的启动控制标志;TR2=0:停止T2;TR2=1:启动T2 C/T2:T2的定时方式或计数方式选择位。只能通过软件的置位或清除;C/T2=0:选择T2为定时器方式;C/T2=1:选择T2为计数器方式,下降沿触发。CP/RT2:捕获/重装载标志,只能通过软件的置位或清除。CP/RT2=0时,选择重装载方式,这时若T2溢出(EXEN2=0时)或者T2EX引脚(P1.0)出现负跳变

单片机定时器实验

实验三单片机内部定时器应用 实验目的 1、理解单片机内部定时器的工作原理及使用方法 2、了解单片机定时中断程序的编写和调试方法 3、掌握定时器的基本使用方法 实验仪器 单片机开发板、万利仿真机、稳压电源、计算机 实验原理 1、单片机定时器的工原理 MCS-51 单片机内部有两个16 位可编程的定时器/计数器T0 和T1。它们即可用作定时器方式,又可用作计数器方式。其中T0 由TH0 和TL0 计数器构成;T1 由TH1 和TL1 计数器构成。 | 工作于定时器方式时,通过对机器周期(新型51单片机可以对振荡周期计数)的计数,即每一个机器周期定时器加1,来实现定时。故系统晶振频率直接影响定时时间。如果晶振频率为12MHZ,则定时器每隔(1/12MHZ)×12=1us 加1。 工作于计数器方式时,对或管脚的负跳变(1→0)计数。它在每个机器周期的S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,计数器加1。因此需要两个机器周期来识别一个有效跳变,故最高计数频率为晶振频率的1/24。 特殊功能寄存器TMOD 用于定时器/计数器的方式控制。高4 位用于设置T1,低4 位用于设置T0。如图4-7所示。 图4-7 定时器模式控制字格式 { TCON 寄存器用于定时器的计数控制和中断标志。如图4-8所示。 图4-8 定时控制寄存器数据格式 编写程序控制这两个寄存器就可以控制定时器的运行方式。 单片机内部定时器/计数器的使用,简而概之:(1)如需用中断,则将EA和相关中断控制位置1;(2)根据需要设置工作方式,即对TMOD设置;(3)然后启动计数,即对TR0或TR1

单片机定时器实验报告

( 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

单片机定时器实验报告

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.将P2口和四个数码管的数据口相连,P1口和位选线相连接,电路用共阳极; 2.数码管显示4位从前两位分钟、后两位为秒;分钟和秒的值从00到59增加; 3.实现定时器1S的定时,每1S时间到时,使秒钟加一,当秒钟为60时,显示为00 秒,分钟加一;当分钟为60时,显示为00分,从新开始一个小时的计时。 #include //定义8051寄存器头文件 #define SEG7P P2 //定义数码管就接口在P2口 #define SCANP P1 //定义P3口为数码管位选口unsigned char TAB[]={ 0xc0,0xf9,0xa4,0xb0,0x99, //数字0~4的码值 0x92,0x83,0xf8,0x80,0x98 }; //数字5~9的码值unsigned int show_s,show_m; //定义变量show_s,show_m void Get_disp(char show_s1,char show_m1); //声明赋值函数 void Display(); //声明显示函数 void delay_ms(int x); //声明延时函数 char disp[4]; //定义显示数字数组 char scan[4]={0xfe,0xfd,0xfb,0xf7}; //定义位选扫描数组 main() //主程序的开始 { SEG7P=0xff; //赋初值关闭数码管 IE=0x82; //开启中断总开关和定时器0开关 TMOD=0x01; //设置模式为1 TR0=1; //开启定时器0 TH0=(65535-50000)/256; //设置定时器初值,计数高八位 TL0=(65535-50000)%256; //计数低八位 while(1) //无穷循环 { Get_disp(show_s,show_m); //调用赋值函数 Display(); //调用显示函数} } /*****定时器0中断子函数*****/ void TF_0(void) interrupt 1 { int T; TH0=(65535-50000)/256; //重新转载定时器的初值 TL0=(65535-50000)%256; T++; //计数自增 if(T==20) //判断T { T=0; //T回到初值 show_s++; //秒自增

单片机定时器详解教程文件

单片机定时器详解

一、MCS-51单片机的定时器/计数器概念 单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所以,MCS-51单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒 =1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令; 注:个人PC机上的CPU主频是晶振经过倍频之后的频率,这一点恰好与MCS-51单片机的相反,MCS-51单片机的主频是晶振经过分频之后的频率; 总之:MCS-51单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1个脉冲=1微秒=1条指令=1个机器周期; MCS-51单片机定时器/计数器的简单结构图:

8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合; 二、定时器/计数器的结构 8051单片机的两个定时器T0和T1分别都由两个特殊功能寄存器组成;T0由特殊功能寄存器TH0和TL0构成,而T1则是由TH1和TL1构成; 作为定时器使用时,定时器计数8051单片机片内振荡器输出经过12分频后的脉冲个数,即:每个机器周期使定时器T0/T1的寄存器值自动累加1,直到溢出,溢出后继续从0开始循环计数;所以,定时器的分辨率是时钟振荡频率的1/12; 作为计数器使用时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号进行计数,当输入的外部脉冲信号发生从1到0的负跳变时,计数器的值就自动加1;计数器的最高频率一般是时钟振荡频率的1/24; 由此可知,不论是定时器还是计数器工作方式,定时器T0和T1均不占用CPU的时间,除非定时器/计数器T0和T1溢出,才可能引起CPU中断,转而去执行中断处理程序;所以说,定时器/计数器是单片机中效率高而工作灵活的部件; 三、定时器/计数器的工作模式 除了可选择定时器和计数器的这两种工作方式外,每个定时器/计数器都有4种工作模式; 在模式0、1和2时,T0和T1的工作模式相同;在模式3时,两个定时器/计数器的工作模式不同; 工作模式0: 由TL0的低5位和TH0的全部8位共同构成一个13位的定时器/计数器;定时器/计数器启动后,定时或计数脉冲个数加到TL0上,从预先设置的初值(时间常数)开始累加,不断递增1;当

单片机60s定时器程序c语言

单片机60s定时器程序c语言 #include /////变量定义 sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; int tion=0; int tey[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; int cx=0; int kx=0; ///子函数 void time(int x); //延时函数定义 void LED(); //显示函数定义 ///////////// ////////主函数/// ///////// void main() {TMOD=0X1; TH0=0X3C; TL0=0XB0; IE=0X82; TR0=1; while(1) {LED();}} //延时子函数// void time(int x) {for(x=0;x<200;x++);} //显示子函数// void LED() {led0=0; led1=1; led2=1; led3=1; P0=0XBF; time(1); led1=0; led2=1; led0=1;

led3=1; P0=tey[kx]; time(1); led2=0; led1=1; led0=1; led3=1; P0=tey[cx]; time(1); led3=0; led0=1; led1=1; led2=1; P0=0xBF; time(1); } //中断函数// void teyond()interrupt 1 {TH0=0X3C; TL0=0XB0; tion++; if(tion==20) {tion=0; cx++; P0=tey[cx]; if(cx==10) {cx=0; kx++; P0=tey[kx]; if(kx==6) {cx=0; kx=0; TR0=0;}}}}

51单片机定时器使用

51单片机定时器使用——小灯闪烁一、定时器工作方式设置TMOD=0x01 GATE =0 由TR=1控制开始计时; C/ T=0 作为定时时器使用; M1=0\M0=1 用作16位定时器 二、计数寄存器TH0\TL0初始值计算如定时0.02秒 普通51单片机12T模式: (一)手工计算例如晶振为10.6850MHZ 定时20毫秒 X/10.6850*1000000*12=20毫秒 X=17808 原始值T0=Y Y+17808=65536 Y=47728 利用科学计算器进行16进制转换为0Xb800 TH0=0x80 TL0=0x00 (二)单片机公式计算 TL0=T1MS;//初始化定时的计数初值(第8位),高8位丢失 (三)启动定时器(TR0=1),判断是否溢出(If(TF0==1){//}),时间到。 (四)闪烁的小灯代码 #include //P1 0脚接LED小灯 sbit led=P1^0;

//定义延时函数,循环cs次,时间长为20*cs毫秒 void delay20(unsigned int cs) { unsigned int shuL=0; TMOD=0x01; //初始值根据单片机时钟频率计算 TH0=0xB8; TL0=0x00; //启动定时器 TR0=1; while(shuL<=cs) { if(TF0==1) //查询是否溢出,溢出后复位溢出标志,赋初始值,循环计数加。{TF0=0; TH0=0xBA; TL0=0x70; shuL=shuL+1; } } } void main()

{ delay20(500); //小灯取反,亮500*20毫秒,即10秒; led=~led; delay20(500); }

单片机定时器中断时间误差的解决方案

单片机定时器中断时间误差的解决方案 时间:2012-06-12 14:04:04 来源:作者: 1 前言 单片机内部一般有若干个定时器。如8051单片机内部有定时器0和定时器1。在定时器计数溢出时,便向CPU发出中断请求。当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。 2 误差原因、大小及特点 产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。 2.1. CPU正在执行某指令时的误差及大小 由于CPU正在执行某指令,因此它不能及时响应定时器的溢出中断。当CPU执行此指令后再响应中断所延迟的最长时间为该指令的指令周期,即误差的最大值为执行该指令所需的时间。由于各指令都有对应的指令周期,因此这种误差将因CPU正在执行指令的不同而不同。如定时器溢出中断时,CPU正在执行指令MOV A, Rn,其最大误差为1个机器周期。而执行指令MOV Rn, direct时,其最大误差为2个机器周期。当CPU正在执行乘法或除法指令时,最大时间误差可达4个机器周期。在8051单片机指令系统中,多数指令的指令周期为1~2个机器周期,因此最大时间误差一般为1~2个机器周期。若振荡器振荡频率为fosc,CPU正在执行指令的机器周期数为Ci,则最大时间误差为Δtmax1=12/fosc× Ci(us)。例如fosc=12MHZ,CPU正在执行乘法指令(Ci=4),此时的最大时间误差为: Δtmax1=12/fosc×Ci=12/(12×106)×4=4×10-6(s)=4(μs)

相关主题
文本预览
相关文档 最新文档