重庆科创学院单片机精品课子项目定时器1秒准确定时方法2
- 格式:doc
- 大小:958.00 KB
- 文档页数:3
定时器用工作方式2实现准确定时
电路如图所示:
定时器的几种工作方式中,除0和前面的1类似都需要初始化计数值,然后开始计数,计数溢出后,需要再次控制计数的初值,但工作模式2不同于此,工作方式2 将THx和TLx分开处理,将初值存放在THx中,计数时只处理TLx的8位,所以计数最大值为2^8=256,方式2的另一个特点是,当计数溢出后,不需要控制初值,是自动重新装初值的,故定时较为准确,他是会自动将THx中的值做为计数初值重新开始计数。
用工作方式2,实现1ms 延时程序如下:
用示波器观测如图:
程序如下,用C语言写的:#include "reg51.h"
sbit LED=P1^0;
#define uint unsigned int uint count=0;
void main()
{
TMOD=0X02;
EA=1;
ET0=1;
TH0=0X06;
TL0=0X06;
TR0=1;
while(1);
}
void timer0() interrupt 1 {
//TH0=0X06;
//TL0=0X06;
LED=~LED;
}。
单⽚机学习(六)定时器的使⽤⽬录⼀、定时器简介定时器介绍:51单⽚机的定时器属于单⽚机的内部资源,其电路的连接和运转均在单⽚机内部完成定时器作⽤:(1) ⽤于计时系统,可实现软件计时,或者使程序每隔⼀固定时间完成⼀项操作(2)替代长时间的Delay, 提⾼CPU的运⾏效率和处理速度...⼆、STC89C52定时器资源定时器个数: 3个 (T0、 T1、T2),T0和T1与传统的51单⽚机兼容,T2是此型号单⽚机增加的资源注意:定时器的资源和单⽚机的型号是关联在⼀起的,不同的型号可能会有不同的定时器个数和操作⽅式,但⼀般来说,T0和T1的操作⽅式是所有51单⽚机所共有的三、定时器⼯作原理定时器在单⽚机内部就像⼀个⼩闹钟⼀样,根据时钟的输出信号,每隔“⼀秒"(⼀个单位时间),计数单元的数值就增加⼀,当计数单元数值增加到“设定的闹钟提醒时间"时,计数单元就会向中断系统发出中断申请,产⽣"响铃提醒",使程序跳转到中断服务函数中执⾏。
在实现细节上:时钟部分每隔单位时间就会传递⼀个脉冲信号到计数部分,⽽计数部分会对脉冲个数进⾏计数,当脉冲个数达到TH0,TL0能存储的最⼤数量后(即发⽣溢出,这⾥⼀共有16位,即只能表⽰0~65535这些数字,继续接收信号即溢出),TF0将会被置⼀,此时就会发出中断申请,然后程序跳转到中断服务程序中执⾏。
1. 时钟信号的提供可以看到,在时钟部分有两个输⼊来源:系统时钟T0引脚当我们使⽤T0引脚时往往是将这个模块作为计数器记录脉冲的个数的,⽽不是⽤作定时器,故这⾥我们⼀般只考虑系统时钟的信号输⼊。
SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz当 C/T=0 时选择的是系统时钟作为输⼊,⽽ C/T=1 时选择的是T0引脚作为输⼊,故我们需要选择第⼀种。
2. 中断系统简介中断系统是为使CPU具有对外界紧急事件的实时处理能⼒⽽设置的。
51单片机——定时1秒Tick equ 10000 ; 10000 x 100us = 1sT100us equ 256-50 ; 100us时间常数(6M) C100us equ 30h ; 100us记数单元LEDBuf equ 0LED equ P1.0ljmp Startorg 000bh ;定时器0中断T0Int:push PSWmov a, C100us+1jnz Goondec C100usGoon:dec C100us+1mov a, C100usorl a, C100us+1jnz Exit ; 100us 记数器不为0, 返回mov C100us, #high(Tick)mov C100us+1, #low(Tick)cpl LEDBuf ; 100us 记数器为0, 重置记数器; 取反LEDExit:pop PSWretiStart:mov TMOD, #02h ; 方式2, 定时器mov TH0, #t100us ;equ 256-50 , 100us时间常数(6M)mov TL0, #t100usmov IE, #10000010b ; EA=1, IT0 = 1setb TR0 ; 开始定时clr LEDBufclr LEDmov C100us, #high(Tick)mov C100us+1, #low(Tick)Loop:mov c, LEDBufmov LED, cljmp Loopend1、关于内部计数器的编程主要是定时常数的设置和有关控制寄存器的设置。
内部计数器在单片机中主要有定时器和计数器两个功能。
本实验使用的是定时器。
2、定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。
TMOD用于设置定时器/计数器的工作方式0-3,并确定用于定时还是用于计数。
TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。
3、内部计数器用作定时器时,是对机器周期计数。
几种精确定时方法Keil C51程序设计中几种精确延时方法摘要实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。
本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。
关键词Keil C51 精确延时程序执行时间引言单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。
单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。
有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。
用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。
因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1 使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。
第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MHz的晶振。
最长的延时时间可达216=65 536 μs。
若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。
使⽤定时器1实现1秒定时,控制流⽔灯流⽔点亮。
中断⽅式(PR=9)/***************************************************************************** ⽂件名:main.c* 功能:使⽤定时器0实现1秒定时,控制蜂鸣器蜂鸣。
(中断⽅式)* 说明:短接蜂鸣器跳线JP7。
断开CF卡跳线JP13、GPIO接⼝J17。
****************************************************************************/#include "config.h"#define LED1 1<<16 // P1.16#define LED2 1<<17 // P1.17#define LED3 1<<18 // P1.18#define LED4 1<<19 // P1.19#define LED5 1<<20 // P1.20#define LED6 1<<21 // P1.21#define LED7 1<<22 // P1.22#define LED8 1<<23 // P1.23#define LEDCON 0x00ff0000const uint32 DISP_TAB[8] = { 0xff01ffff, 0xff02ffff, 0xff04ffff, 0xff08ffff,0xff10ffff, 0xff20ffff, 0xff40ffff, 0xff80ffff};/***************************************************************************** 名称:IRQ_Time0()* 功能:定时器0中断服务程序,取反BEEPCON控制⼝。
这一课,我们将告诉大家如何精确定时1S。
要精确定时,就需要用到中断方式,并工作在自动重装载方式。
这里我们用到了T2定时器,它具有16位的自动重装载功能。
我们知道,T0,T1的自动重装载功能都是8位的,用它们将会带来很大的误差。
T2定时器,它有一个专门的自动重装载寄存器,当计数满了以后,它将我们预置进去的数自动的载入TH2,TL2这样就都很好的保证精确定时。
我们用的是12MHZ的晶振。
就算是计满也只有几十毫秒。
要定时一秒,就需要一个变量来保存溢出的次数,积累到了多少次之后,才执行一次操作。
这样就可以累加到1秒或者更长的时间才做一次操作了。
T2寄存器还有一个和其他寄存器不一样的地方,就是它的中断标志位TF2要软件清零。
现在我们来计算一下,要精确定时,那么,进去中断的次数是越少越好,这样,数据更精确,还能很好的防止对主函数的影响。
T2定时器预装载值的计算:设晶振为12MHz,每秒钟可以执行1000000(12000000/12)个机器周期。
而T2每次溢出时最多经过了65536个机器周期。
我们应该尽量让T2定时器的溢出中断的次数最少。
选择每秒中断14次,每次溢出1000000/14=71428.57个机器周期,不为整数且超出65536。
选择每秒中断16次,每次溢出1000000/16=62500个机器周期,小于65536,有效。
选择每秒中断20次,每次溢出1000000/20=50000个机器周期,小于65536,有效。
其他的就不再算了,我们通过上面的计算,我们可以发现,我们可以选择的方式有很多,但是最佳的是每秒中断16次,每次溢出62500个机器周期。
下面看程序:#i nclude <reg52.h>#define uchar unsigned char#define uint unsigned intsbit Led=P0^0; //定义LED位void Timer2() interrupt 5 //调用定时器2,自动重装载模式{static uchar i=0; //定义静态变量iTF2=0; //定时器2的中断标志要软件清0i++; //计数标志自加1if(i==16) //判断是否到1s{i=0; //将静态变量清0Led=~Led; //LED位求反}}void main(){RCAP2H=(65536-62500)/256; //重装载计数器赋初值RCAP2L=(65536-62500)%256;ET2=1; //开定时器2中断EA=1; //开总中断TR2=1; //开启定时器,并设置为自动重装载模式while(1);}这里我们看到我们在中断中用到了static uchar i=0;定义i为静态函数。
晶振6MHz ,每机周2 us T0 定时100ms ,计数5次,即可实现500ms 定时。
计数值为50000次。
#include<reg51.h>unsigned char cont; /*声明cont*/main(){while(1) /*无限循环*/{P1=0x01; /*p1^0亮*/TMOD=0x01;TH0=-50000/256; /*设置初值*/TL0=-50000%256;EA=1;ET0=1;TR0=1;}}void int0() interrupt 1{TH0=-50000/256;TL0=-50000%256;cont++;if(cont==5) /*每次100ms 到了5次500msP1左移一位*/P1=P1<<1;}下面一段文字是对8051单片机定时器初值的计算描述,希望对你有所帮助,对于你的提问,根据下面文字的说明,可以得到初值为:FE0CH(65536-500)定时器/计数器可用软件随时随地起动和关闭,起动时它就自动加“1”记数,一直记到满,即全为“1”,若不停止,计数值从全“1”变为全“0”,同时将计数溢出位置“1”并向CPU发出定时器溢出中断申请。
对于各种不同的工作方式最大的定时时间和计数数不同。
这里在使用中就会出现两个问题:一是要产生比定时器最大的定时时间还要小的时间和计数器最大计数次数还要小的计数次数怎么办?二是要产生比定时器最大的定时时间还要大的时间和计数器最大计数次数还要大的计数次数怎么办?解决以上第一个问题只要给定时器/计数器一个非零初值,开定时器/计数器时,定时器/计数器不从0开始,而是从初值开始,这样就可得到比定时器/计数器最大的定时时间和计数次数还要小的时间和计数次数,解决第二个问题就要用到循环程序了,循环几次就相当于乘几。
例如要产生1秒的定时你可先用定时器产生50MS的定时,再循环20次就行了,因为1S=1000MS,也可用其它的组合。
《单片机技术及应用》课程标准1.1课程的性质该课程是自动化以及电类专业的专业必修课,是培养学生单片机基础应用能力和程序设计能力的核心课程,它与以下课程密切相关:(1)计算机组成原理(2)传感器技术基础(3)电子技术基础(4)数字系统设计(5)微机接口技术(6)自动控制原理《单片机原理》是一门理论性、实践性和实用性都很强的课程。
单片机应用技术是典型的嵌入式系统应用技术,而嵌入式系统的应用是目前计算机应用技术的一大热门分支技术。
而这门课程的学习是学生了解和掌握嵌入式应用技术的入门技术。
因此开展这门课程的教学工作,具有重要的现实意义。
这门课程的重点是在培养和培训学生计算机硬件方面的知识与技能,加深学生对计算机硬件系统工作机理的全面理解和认识,因此它对学生的专业发展也具有极其重要的意义。
由于《单片机原理》这门课程对学生的计算机软、硬件方面的知识背景都有很高的要求,入门的门槛较高。
所以教师在教学过程中要注意采用难点分散、循序渐进的原则来组织教学。
1.2课程设计理念1.2.1课程的开发与设计始终以职业能力的培养为目标。
对单片机应用技术的要求和职责进行分析,确定所需的职业能力,再以职业能力培养为导向开发课程教学的学习情境和学习性工作任务。
1.2.2以学生为主体开发学习性工作任务,学习性工作任务贯穿课程始终。
学习性工作任务的开发充分考虑到学生职业能力培养的各个方面,让学生成为学习的主体,充分调动学生的学习积极性,为学生的可持续发展奠定基础。
课堂上完成的工作任务以基本项目为主,鼓励学生开发创新项目,培养学生的职业拓展能力。
1.3课程开发思路本课程由企业技术人员和学校专职教师在充分分析自动化生产设备应用专业岗位职业能力的基础上确定了本学习领域的教学内容,并根据岗位实际应用需要设计了6个学习情景。
学习性工作任务的设计以职业能力培养为目标。
本课程以学生为主体组织教学,将本课程所需掌握的理论知识和应具备的实践技能全部融于所开发的学习性工作任务中,学生在完成工作任务的过程中学习相关理论知识,不强调知识的完整性,而以够用为原则,但要保证达到培养学生职业技能和素养的目标。