完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
定时器/计数器
什么是定时器/计数器? 在51单片机中,定时器/计数器是用来实现定时功能,并且具有计数的功能,来实现对外部信号的计数,其实他们是同一个物理的电子元件。 定时器实际上也是工作在计数方式下,只是计数的是固定周期的脉冲,由于脉冲周期固定,由计数值可以计算时间,有定时功能。 定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。 AT89C51的定时器/计数器 从上图我们可以发现这款51单片机有2个16位的定时/计数器,他们被标识为T0和T1。 定时器/计数器相关的寄存器 TCON T0、T1定时器/计数器控制寄存器,格式如下 TF0、TF1 定时器/计数器T0(T1)溢出标志。当T0(T1)被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件对TF0(TF1)置1,中断完成又由硬件对TF0(TF1)清0TR0、TR1 定时器T0(T1)的运行控制位。该位由软件置位和清零。TMOD TMOD是定时器、计数器模式控制寄存器 使用定时器0就使用第四位,定时器1就用高四位 GATE 门控位。GATE=0,以运行控制位TR启动定时器;GATE=1,以外中断请求信号(INT1或INT0)启动定时器,这可以用于外部脉冲宽度测量。在TMOD中GATE一般情况下都等于0。C/T 控制其用作定时器还是计数器M1、M0 定时器/计数器模式选择TH、TL 定时器值的存储寄存器 [tr]名称描述[/tr]
利用AT89C51的定时器0来实现精确延时 实验环境
注意,这里我们使用12M的时钟频率 Keil工程 项目结构 代码 #include //时钟频率 #define FOSC 12000000L //计算器初值计算 #define Times (65536 - FOSC / 12 / 1000) //LED1控制引脚 ***it led1 = P1 ^ 0; //计数器中断次数 volatile unsigned int count; //定时器溢出中断(1ms中断一次) void Timer0_Rountine(void) interrupt 1 { //重新装载初值 TL0 = Times; TH0 = Times >> 8; //总延时减1 count--; } //毫秒级延时 void delay_ms(unsigned int ms) { //给T0低字节装载初始值 TL0 = Times; //给T0高字节装载初始值 TH0 = Times >> 8; //初始化T0模式寄存器,也就是TMOD的第四位 TMOD &= 0xF0; //取值为0001 //即GATE=0 //C/T=0 我们用作定时器 //M1=0 M2=1 模式选择为16位的定时器 TMOD |= 0x01; //xxxx 0001 //让计数器开始计数 TR0 = 1; //打开定时器0的中断开关 ET0 = 1; //打开中断总开关 EA = 1; //延时count毫秒 count = ms; //当cout等于0是,关闭计数,关闭T0的中断 while (count > 0) ; { TR0 = 0; ET0 = 0; } } void main(void) { while (1) { led1 = 1; delay_ms(500); led1 = 0; delay_ms(500); } } 结果 总结 最后我想说一下关于时间的计算 时钟周期 一个CPU周期时间又包含若干个时钟周期。时钟周期定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 μs),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件威廉希尔官方网站 和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的 8051单片机的时钟范围是1.2MHz-12MHz。机器周期 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。通常用内存中读取一个指令字的最短时间来规定CPU周期,(也就是计算机通过内部或外部总线进行一次信息传输从而完成一个或几个微操作所需要的时间)),它一般由12个时钟周期(振荡周期)组成,也是由6个状态周期组成。而振荡周期=1秒/晶振频率,因此单片机的机器周期=12秒/晶振频率 。所以在51 芯片中定时器启动后会在每一个机器周期会使定时器值的存储寄存器增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M 的晶振用在51芯片上,那么51的计数速率就为1M。 即一秒钟1000000次,1ms=1000次,我们用的是16位的定时器,则可以存储2^16=65536次,所用根本用不玩,于是我们就从65536-1000开始计数就完美解决了,下面这个初值就是这样算出来的 //时钟频率#define FOSC 12000000L//计算器初值计算#define Times (65536 - FOSC / 12 / 1000) 同理若为11.0592M计算为 //时钟频率#define FOSC 11059200L//计算器初值计算#define Times (65536 - FOSC / 12 / 1000) |
|
|
|
只有小组成员才能发言,加入小组>>
2561 浏览 0 评论
1158浏览 2评论
761浏览 1评论
514浏览 0评论
271浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 13:41 , Processed in 1.138340 second(s), Total 49, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号