51单片机之晶振与定时器

发布者:美好梦想最新更新时间:2021-10-13 来源: eefocus关键字:51单片机  晶振  定时器 手机看文章 扫描二维码
随时随地手机看文章

Part1 晶振

晶振,也就是晶体振荡器,主要作用是产生稳定的振动频率用于单片机时钟电路。


一、晶振的工作原理

压电效应:

晶体振荡器结构图

如图所示,晶体振荡器主要由引线构成的电极和晶体片构成。


当我们在晶体两电极外加电压后,晶体会发生形变,反过来,如果外力使得晶体变形,两极上又会产生电压。


因此当我们在晶体两端施加一个交变电压时,随着电压正负的改变,晶体交替形变,进而以一定的频率发生谐振–单频振荡(振荡频率固定不变)。


二、晶体单频振荡产生时钟脉冲

在这里插入图片描述

我们知道,脉冲信号是一个按一定电压幅度、一定时间间隔连续发出的信号。

而我们的晶体振荡器,既有电压幅度–晶体两端施加的电压,又有时间间隔–振荡频率 f 的倒数作为周期。因此我们可以通过我们的晶体振荡器产生一个稳定的时钟脉冲信号来为我们的单片机提供精准计时。


三、单片机的时间单位

现在我们有了由晶体振荡器产生的精准时钟脉冲,可以给我们的单片机计时了。但对于单片机来讲,用我们所熟知的时分秒等计时单位来计时,并不合适。因此我们根据单片机的工作特性和原理,引入了时钟周期、状态周期、机器周期、指令周期几个概念来作为我们单片机的时间单位。


1、时钟周期


也叫振荡周期或者晶振周期,即晶振的单位时间发出的脉冲数。如12Mhz晶振的时钟周期为1/ f =1/12Mhz,也就是1/12微秒。


时钟周期是计算机中最基本、最小的时间单位。


8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)


2、机器周期


计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。51单片机中一个机器周期等于12个时钟周期。


在标准的51单片机中,一般情况下,一个机器周期等于12个时钟周期,也就是机器周期=12*时钟周期,(上面讲到的原因)如果是12MHZ,那么机器周期=1微秒。单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。


机器周期不仅对于指令执行有着重要的意义,而且机器周期也是单片机定时器和计数器的时间基准。例如一个单片机选择了12MHZ晶振,那么当定时器的数值加1时,实际经过的时间就是1us,这就是单片机的定时原理。


3、指令周期


指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。


对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。


对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期


Part2 定时计数器

在我们的单片机中,说到时间就离不开上面所提的时钟脉冲。而我们的定时计数器就是对这些脉冲进行计数,来进行时间计算的,本质上我们的定时计数器是一个加1计数器,也就是每输入一个脉冲,计数加一。


但要注意的一点是,定时器和计数器是两个不同的功能单元。


定时器是由单片机自身提供的一个非常稳定的计数器(晶振),接受的是内部脉冲;


而计数器则不同,记录的是单片机外部发生的事情,接受的是外部脉冲。


举一个计数器的例子,方便大家理解,我现在让我的计数器记录我的一个独立按键按下的次数,那它所接受的脉冲便是我们按键按下过程中产生外部脉冲。


这里需要注意的是,计数器自动加1需要检测从1到0的下降沿,因此需要两个计数周期,最高计数频率为24晶振频率。


由于不同型号的51单片机的定时器个数不同,下面以最基础的8951单片机为例进行阐述


一、定时计数器的寄存器

说了这么多,那单片机具体应该怎么使用呢,别急,咱们还得从最基本的寄存器开始看起。


首先我们来看一下定时计数器的定时方式寄存器–TMOD

GATE :定时操作开关控制位,当GATE=1时,INT0或INT1引脚为高电平,同时TCON中的TR0或TR1控制位为1时,计时/计数器0或1才开始工作。若GATE=0,则只要将TR0或TR1控制位设为1,计时/计数器0或1就开始工作。


C/T :定时器或计数器功能的选择位。C/T=1为计数器,通过外部引脚T0或T1输入计数脉冲。C/T=0时为定时器,由内部系统时钟提供计时工作脉冲。


M1 M0:T0、T1工作模式选择位

设置好方式,当然还有具体的定时器控制寄存器–TCON

TF1:定时器T1溢出标志,可由程序查询和清零,TF1也是中断请求源,当CPU响应T1中断时由硬件清零。


TF0:定时器T0溢出标志,可由程序查询和清零,TF0也是中断请求源,当CPU响应T0中断时由硬件清零。


TR1:T1充许计数控制位,为1时充许T1计数(定时)。


TR0:T0充许计数控制位,为1时充许T0计数(定时)。


下面四个属于中断部分,这里不多做阐述。


IE1:外部中断1请示源(INT1,P3.3)标志。IE1=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”。


IT1:外部中断源1触发方式控制位。此位为1设置为底电平触发,为0设置为下降沿触发。


IE0:外部中断0请示源(INT0,P3.2)标志。IE0=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”。


IT0:外部中断源0触发方式控制位。此位为1设置为底电平触发,为0设置为下降沿触发。


二、我们来看一下定时器的4种工作模式

1、工作模式0:


由TL0的低5位和TH0的全部8位共同构成一个13位的定时器/计数器,定时器/计数器启动后,定时或计数脉冲个数加到TL0上,从预先设置的初值(时间常数)开始累加,不断递增1,当 TL0计满后,向TH0进位,直到13位寄存器计满溢出,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。并且定时器/计数器硬件会自动地把13位的寄存器值清0,如果需要进一步定时/计数,需要使用相关指令重置时间常数,并把定时器/计数器的中断标记TF0置0。


2、工作模式1:最常用的定时器工作模式


模式1与模式0几乎完全相同,唯一的区别就是,模式1中的寄存器TH0和TL0共同构成的是一个16位定时器/计数器来参与操作,因此比模式0中的定时/计数范围更大


3、工作模式2: 工作方式2特别适合于用作较精确的脉冲信号发生器


这种模式又称为自动再装入预置数模式。有时候,我们的定时/计数操作是需要多次重复定时/计数的,如果溢出时不做任何处理,那么,在第二轮定时/计数时就是从0开始定时/计数了,而这并不是我们想要的。所以,要保证每次溢出之后,再重新开始定时/计数的操作是我们想要的,那就要把预置数(时间常数)重新装入某个地方,而重新装入预置数的操作是硬件设备自动完成的,不需要人工干预,所以这种工作模式就叫自动再装入预置数方式。在工作模式2中,把自动重装入的预置数存放在定时器/计数器的寄存器的高8位中,也就是存放在TH0中,而只留下TL0参与定时/计数操作。


这个工作模式常用于波特率发生器(串口通信),T1工作在串口模式2;用于这种方式时,定时器就是为了提供一个时间基准;计数溢出之后,不需要做太多的事情,只做一件事就可以,就是重新装入预置数,再开始重新计数,而且中间不需要任何延时。


4、工作模式3:


方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数由于定时器/计数器T1没有工作模式3,如果把定时器/计数器T0设置为工作模式3,那么TL0和TH0将被分割成两个相互独立的8位定时器/计数器。


三、定时计数器初值的确定

1、计数器计数初值确定


计数初值C=模-X

注:模为选用定时方式的最大数值,如方式一的模为65536


2、定时器定时初值


定时初值C=[t/MC] 注: MC-- 机器周期,t预定时间


3、定时器不同方式初值


工作方式0:13位定时器/计数器工作模式,最多可计数2的13次方次,即:8192次


工作方式1:16位定时器/计数器工作模式,最多可计数2的16次方次,即:65536次


工作方式2:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次,


工作方式3:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次


4、定时计数器初值载入寄存器

TH0=(65536-9216)/256


TL0=(65536-9216)%256


四、定时计数器的具体使用

定时:定时计数器作为定时器使用,配置步骤如下:


1.模式设置,配置TMOD寄存器


2.定时器初值设置 假设10ms中断


3.开定时器中断


4.开总中断


5.打开定时器


#include


sbit led=P1^0;


unsigned int flag;


void main()


{


TMOD=0x01;//1.模式设置,00000001,采用的是定时器0,工作与式1(M1=0,M0=1)。


TH0=(65536-10000)/256; //2.定时器设置,每隔10毫秒发起一次中断。


TL0=(65536-10000)%256;


ET0=1; //3.开定时器0中断


EA = 1; //4.开总中断


TR0=1; //5.打开定时器


while(1)


{


if(flag==100)


{


led=~led;


flag=0;


}


}


}


void TIM0() interrupt 1 //中断服务程序


{


TH0=(65536-10000)/256; //进入中断要重新设置定时器处置,要注意。


TL0=(65536-10000)%256;


flag++;


}


计数:定时计数器作为计数器使用,配置步骤如下:


1.模式设置,配置TMOD寄存器。


2.开计数器中断


3.开总中断


4.打开计数器


通过这简单的四步,我们就打开了一个计数器,可以对P3.4或者P3.5进行下降沿的脉冲计数,这里有一点要注意就是计数器可以不开中断,这样溢出时只是不会进去中断服务程序。


计数器示例程序


#include


sbit led=P1^0;


sbit s=P3^4;


unsigned int count;


void main()


{


TMOD=0x05; //1.模式设置,00000101,采用的是计数器0,工作模式1(M1=0,M0=1)。


TH0=0; //计数器清零


TL0=0;


ET0=1; //2.开计数器0中断


EA=1; //3.开总中断


TR0=1; //4.打开计数器


led=1;


while(1)


{


count=(TH0<<8)|TL0;


if((count*10000)==50000)//按5下按键led状态取反


{


led=0;


TH0=0XFF;


TL0=0XFF; //人为的让计数器进入中断


}


}


}


void TIM0() interrupt 1 //中断服务程序


{


led=1;


TH0=0;


TL0=0;


}

关键字:51单片机  晶振  定时器 引用地址:51单片机之晶振与定时器

上一篇:51驱动两相四线步进电机
下一篇:51单片机之串口通信详解

推荐阅读最新更新时间:2024-11-08 10:11

51单片机不为人知的IO口之谜
1.准双向口输出数据时: 准双向口输出类型可用作输出和输入功能而不需重新配置口线输出状态。这是因为当口线输出为1时驱动能力很弱,允许外部装置将其拉低。当引脚输出为低时,它的驱动能力很强,可吸收相当大的电流。准双向口有3个上拉晶体管适应不同的需要。在3个上拉晶体管中,有1个 极弱上拉 ,当口线锁存为1时打开。当引脚悬空时,这个极弱的上拉源产生很弱的上拉电流将引脚上拉为高电平。第2个上拉晶体管称为 弱上拉 ,当口线寄存器为1且引脚本身也为1时打开。此上拉提供基本驱动电流使准双向口输出为1。如果一个引脚输出为1而由外部装置下拉到低时,弱上拉关闭而 极弱上拉 维持开状态,为了把这个引脚强拉为低,外部装置必须有足够的灌电流能力使引脚上的电压将
[单片机]
<font color='red'>51单片机</font>不为人知的IO口之谜
51单片机心形灯实现花样流水编程
心形灯原理图 编译软件:Keil uVision5 (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343174) 单片机程序下载软件:STC-ISP (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343157) 程序代码: #include reg51.h #include intrins.h unsigned char code table ={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; void De
[单片机]
<font color='red'>51单片机</font>心形灯实现花样流水编程
51单片机超声波测距仿真结果分析
制作51单片机超声波测距仪时,程序设计及试工作是一项重要内容,所设计的程序51单片机超声波测距程序只是在编译环境下通过编译,消除编程工作中产生的语法错误后,直接将程序写入单片机中与硬件一起进行联调,如果这时硬件设计制作是正确的还好说,只需要进行软件的调试修改,烧写到硬件环境中验证直到达到设计要求即可,但这个工作也是需要反复不停地修改程序并烧录到硬件单片机中进行调试,但如果说硬设计、制作及程序设计都存在问题,整个调试工作就显得无从下手,给软件调试、硬件故障排出带来非常大的困难,增加不少工作量,甚至造成整个超声波测距系统设计制作的失败。有好的解决办法吗?回答是肯定的,就是程序仿真,编译通过的程序,在Proteus环境下,按设计的硬件原
[单片机]
<font color='red'>51单片机</font>超声波测距仿真结果分析
C8051F与80C51系列单片机的不同初始化
1 引言 近30年来,世界各主要电子元器件生产厂商纷纷推出自己各具特色的单片机产品。而在百花齐放的单片机家族中,80C5l系列一直扮演着重要的角色。该单片机在教学、科研等领域已经成为入门单片机并成为单片机应用的首选,该产品以其易读性好、扩展能力强而著称,从而成为广大从事单片机开发者最熟悉、最具代表的机型。但人们往往在熟悉80C51单片机之后又选择别的系列单片机开发产品,这是因为80C51具有运算速度慢、功耗大、内部资源少等不足,所以限制了其使用范围。Cygnal公司推出的C805lF系列单片机既弥补了80C51系列的不足,又与MCS—5l指令集兼容。C805lFxxx系列单片机是完全集成的混合信号系统级芯片,具有与8051指令集
[应用]
ARM7学习---LPC2103 Time0定时器练习
继续学习ARM7,练习了下LPC2103的内部定时器T0,定时1S,让LED闪烁。具体测试程序如下: /**************ARM7(LPC2103)练习程序**************************/ /*************************************************************/ /*****File Function : Time0测试程序 *****/ /*****Program Author : ZhengWen(ClimberWin) *****/ /*****MCU : LPC2103F 外部11.0592M晶
[单片机]
ARM7学习---LPC2103 Time0<font color='red'>定时器</font>练习
基于C51单片机对液晶显示的实验设计
程序一:在液晶屏上显示一个1 //在液晶屏上显示一个字符 #include #define uchar unsigned char #define uint unsigned int //端口设置 sbit lcden=P3^4; sbit lcdrs=P3^5; //延迟函数,大约1秒 void delay(uint z) { uint x,y; for(x=z;x》0;x--) for(y=110;y》0;y--); } //写命令 void write_com(uchar com) { lcdrs=0;//写命令 P0=com; delay(5)
[单片机]
基于C<font color='red'>51单片机</font>对液晶显示的实验设计
西门子博途: 启动脉冲定时器
说明 使用“启动脉冲定时器”指令启动将指定周期作为脉冲的 IEC 定时器。逻辑运算结果 (RLO) 从“0”变为“1”(信号上升沿)时,启动 IEC 定时器。无论 RLO 的后续变化如何,IEC 定时器都将运行指定的一段时间。检测到新的信号上升沿也不会影响该 IEC 定时器的运行。只要 IEC 定时器正在计时,对定时器状态是否为“1”的查询就会返回信号状态“1”。当 IEC 定时器计时结束之后,定时器的状态将返回信号状态“0”。 在指令下方的 操作数 1 (持续时间)中指定脉冲的持续时间,在指令上方的 操作数 2 (IEC 时间)中指定将要开始的 IEC 时间。 说明 可以启动和查询不同执行等级的 IEC 定时器,每次查询
[嵌入式]
西门子博途: 启动脉冲<font color='red'>定时器</font>
8051单片机定时器溢出中断误差补偿示例
  1 前言   单片机内部一般有若干个定时器。如8051单片机内部有定时器0和定时器1。在定时器计数溢出时,便向CPU发出中断请求。当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。   2 误差原因、大小及特点   产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。
[单片机]

推荐帖子

电设之F5529——我的核心系统板
本帖最后由sunduoze于2015-8-2817:03编辑 今年电赛准备仓促,7月25日才知道必须用最小系统板(比赛没任何经验,之前被误导,计划直接用Lunchpad)做其他事情的同时,抽空画了一天多,搞定这个板子的核心模块(无JTAG调试器)。第一次画双面板,没什么经验,好多东西没有注意到更改:1、原LunchpadRST端子更改为P7.7(MCLK的时钟输出接口)2、P1.0、P1.1、P2.0、P2.1四个端口接为四个按键(无上拉电阻,自行配置
sunduoze 微控制器 MCU
储存搬运对静电敏感的元器件有什么方法?
 静电敏感元件在储存和运输过程中会暴露于有静电的区域中,用静电屏蔽的方法可削弱外界静电对电子元件的影响。最通常的方法是用静电屏蔽袋和防静电周转箱作为防护用。另外防静电衣对人体的静电具有一定的屏蔽作用。  所以我们要求在周转搬运过程中,工人必须佩带无绳静电环和手套,穿防静电服装和防静电鞋等,同时应使用防静电料箱、PCB防静电料架、不锈钢周转车等专业设备,尽量避免人体直接接触周转。  要说明的是:由于防静电服,是用特殊合成纤维织成布料,一般情况下揉搓磨擦不会产生静
ESD技术咨询 安防电子
EV1527编码芯片的应用及解码方法
本文介绍了一种新型的无线编码芯片EV1527在无线发射模块中的应用及其相应解码方法在无线接收模块中的实现。首先简要介绍了编码芯片EV1527的使用;其次提出了两种解码方法:利用解码芯片TDH6300硬件解码、采用单片机软件解码;最后系统地阐述了这种编解码方案的应用。EV1527编码芯片的应用及解码方法
Jacktang RF/无线
关于DMD8168/AM3894评估板的问题
TI官网DM8168和AM3894同用一块EVM,这两款芯片封装和引脚定义完全相同兼容吗?\0\0\0eeworldpostqq关于DMD8168/AM3894评估板的问题应该是兼容的,有点儿像OMAP-L138和TMS320C6748,前者是包含了一个DSP核和ARM9核,而后者只有DSP核。DM8168是包含了DSP核和A8的核,AM3894只有A8核吧
Jelly DSP 与 ARM 处理器
嵌入式运用了哪些软硬件知识?单片机、DSp和嵌入式三者的概念有什么区别?
嵌入式运用了哪些软硬件知识?单片机、DSp和嵌入式三者的概念有什么区别?嵌入式运用了哪些软硬件知识?单片机、DSp和嵌入式三者的概念有什么区别?
zhull1984 嵌入式系统
【2024 DigiKey 创意大赛】家庭环境检测器-完成贴
家庭环境检测器作者:白菜虫虫一、作品简介作品照片:作品功能介绍:本作品旨在实现家庭智能环境检测,实现的主要功能有如下几点:1.使用大尺寸LCD屏开发板结合LVGL制作精美界面,实时显示家庭环境质量。2.使用BME680等传感器获取家庭环境数据,并通过网络传输到LCD屏幕开发板上实时显示。3.通过网络获取天气预报信息并在LCD屏幕开发板上实时显示。4.根据事先设定的条件,控制其他家庭智能设备,调节室内温度,湿度等等环境条件。物料清单:
白菜虫虫 DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved