51单片机的定时中断(三)

发布者:心有归属最新更新时间:2021-10-25 来源: eefocus关键字:51单片机  定时中断  周期 手机看文章 扫描二维码
随时随地手机看文章

周期:


振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)


状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。


机器周期:1个机器周期含6个状态周期,12个振荡周期。


指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。


(1M=1000000,所以在晶振频率为12MHZ时,一个机器周期=1/12M=1us)


(指令周期的长短不一,如果不知道一些指令周期的长度,即使定时中断,也不能理论上绝对准确的中断。因为函数的调用等也需    要时间)(这目前我还不会,但是感觉应该可以更精确延时,因为可以在计时中剪掉相应的操作时间)


IT0/IT1:


51单片机有两组定时器/计数器IT0/IT1,因为既可以定时又可以计数,故称之为定时器/计数器。


定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。


51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。


有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。


定时/计数器的工作原理

定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。


51单片机定时/计数器结构

定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

图一:定时计数器结构

 

定时/计数器的控制

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。


工作方式寄存器TMOD

图二:TMOD

1、高四位用来控制T1,低四位用来控制T0


2、GATE是门控位。GATE=0时,用于控制定时器的启动不受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。


3、C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。(T上有个非)


4、M1M0:工作方式设置位。定时/计数器有四种工作方式。(8位自动重装,指的是将初始化值装在高位,然后赋值给低位。低位进行计数或计溢出后,高位的数重新赋值给低位,重复)

图三


控制寄存器TCON


制定时/计数器的启动和中断申请。其格式如下:

图四

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。


TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。


TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。


TR0(TCON.4):T0运行控制位,其功能与TR1类同。


定时/计数器的工作方式

这里仅仅提及方式一(我目前只用过这两种)


方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。

计数个数与计数初值的关系为:X=216-N

图五


定时器的使用

对TMOD赋值,以确定T0和T1的工作方式。


计算初值,并将其写入TH0、TL0或TH1、TL1。


中断方式时,则对EA,ET0/1赋值,开放定时器中断


使TR0或TR1置位,启动定时/计数器定时或计数。(这个最后设置,因为一旦设置,计时或计数就开始)


代码:

定时器0


#include

 

sbit led=P2^0;//LED接在P2^0引脚上

 

int i=0;

 

void Timer0Init()

{

TMOD|=0X01;//这样写是非常好的,仅仅设置定时器0,不影响定时器1的工作状态。在多文件编程中,这一点能更好的体现

TH0=(65536-1000)/256;

    TL0=(65536-1000)%256;

//TH0=0xFC;//晶振频率为12M

//TL0=0X18;

TH0=0xFC;//我板子上晶振频率为11.05926M

TL0=0X66;//这差别很小的

ET0=1;//定时器0的中断允许

EA=1;//打开总终端

TR0=1;

}

 

void main(void)

{

Timer0Init();

while(1);

}

 

void Timer0() interrupt 1//尽量减少中断中的操作,提高精度

{

   i++;

   TH0=0xFC;//重新赋初值

   TL0=0X66;

   if(i==1000)

   {

    led=~led;

i=0;

   }

}


1、TMOD|=0X01;//这样写是非常好的,仅仅设置定时器0,不影响定时器1的工作状态。在多文件编程中,这一点能更好的体现


2、尽量减少定时中断中的操作,提高精度。


3、这个定时中断是1ms,中断中的操作应该是不到1000的1/10,所以这个中断在ms级别中,可能还是相对准确的。可以用于以后的实验。但是在s级别误差逐渐变大,下面是我简单测量的方法和结果。


测量:


在灯灭下的瞬间,手机开始计时。如果要测10s,在第五次灯灭的时候结束计时。(因为点亮和熄灭各一秒)


下面用上述方法测量了10s,30s,50,70s,各三次。结果如下


1ms延时的测量

image.png

 上表可见,误差越来越大。当然也可能我的晶振不是11.0592MHz,上面没标注,问的淘宝客服。


好奇万年历是怎么做出来的,回头好好查查。


 


定时器1(普中科技的代码)


/**************************************************************************************

*               定时器1实验   *

实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。

注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。   

***************************************************************************************/

 

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

 

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

u8 n=0;

/*******************************************************************************

* 函 数 名         : Timer1Init

* 函数功能    : 定时器1初始化

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Timer1Init()

{

TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

 

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

ET1=1;//打开定时器1中断允许

EA=1;//打开总中断

TR1=1;//打开定时器

}

 

/*******************************************************************************

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

LSA=0;

LSB=0;

LSC=0;

Timer1Init();  //定时器1初始化

while(1);

}

 

/*******************************************************************************

* 函 数 名         : void Timer1() interrupt 3

* 函数功能    : 定时器0中断函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Timer1() interrupt 3

{

static u16 i;

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

i++;

if(i==1000)

{

i=0;

P0=smgduan[n++];

if(n==16)n=0;

}

}


在定时中断函数中,为了不断定时,进行了重装载(重新赋值)。当溢出的时候ET0置一,中断标志。


TR0=1,为打开计时器;ET0=1是打开定时器1中断允许。我咋感觉这两个有点重复呢?


 


补充:

来自百度百科:晶体振荡器


石英晶体振荡器是高精度和高稳定度的振荡器,被广泛应用于彩电、计算机、遥控器等各类振荡电路中,以及通信系统中用于频率发生器、为数据处理设备产生时钟信号和为特定系统提供基准信号。


石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的

关键字:51单片机  定时中断  周期 引用地址:51单片机的定时中断(三)

上一篇:单片机的中断系统(一)
下一篇:C51单片机LED灯的控制

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

51单片机PWM占空比不到0的解决方案
在使用STC12C5608AD的PWM功能时,需要用到把PWM的占空比从0%调到100%,0%即低电平,100%即高电平。通过改变CCAP0H的值,可以调节占空比,按道理,当CCAP0H的值为255时,占空比应该为0,但是通过示波器发现,还是有那么一点点的脉冲,所以我们为了让PWM引脚输出为0,可以采用把PWM引脚改回GPIO功能,且把引脚拉低的办法。例如: CCAP0H=255;//占空比为0 CR=0;//关PWM定时器 CCAPM0=0x00;//把引脚改回GPIO PWM=0; //引脚输出低电平 除了上述改引脚功能的办法,STC的手册上还提到了一种解决方法,就是再加个EPC0H=1即可。例如: CCAP0H=255;//
[单片机]
8051单片机波特率计算公式(配套C语言例程)
8051单片机使用定时器1工作在方式2的情况下作为串口波特率发生器,其波特率=(2smod /32)×(定时器T1溢出率),其中smod是PCON 7 ,表示是否波特率加倍,Fsoc是系统的晶振大小。 波特率公式中:T1溢出率=溢出周期的倒数;溢出周期=(256-TH1)×12/Fosc; 最终公式: 波特率:Baud=(2smod × Fsoc)/(32 ×12×(256-TH1)) 我们一般不太关注波特率的计算,而是关心选用的传输速度(波特率)去反算定时器1(自动重装模式)的初值(TH1),所以将上面的公式导一下,得到TH1的公式: TH1=256-(Fsoc×2smod)/(12×32×Baud) 下面针对串口发送程序,水寒
[单片机]
51单片机用PID算法温度控制器毕业设计
毕业设计任务 设计并制作一个水温自动控制系统,控制对象为纯净水(容量大于等于1升),容器为瓷器皿。水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。 基本功能及要求 1.温度设定范围为40~90℃,最小区分度为1℃,标定温度≤1℃。 2.环境温度降低时(例如用电风扇降温)温度控制的静态误差≤1℃。 3.在硬件中显示水的实际温度。 4.采用适当的控制方法,当设定温度突变(由40℃提高到60℃)时,减小系统的调节时间和超调量。 5.温度控制的静态误差≤0.2℃。 6.在设定温度发生突变(由40℃提高到60℃)时,用上位机显示温度变化曲线。 实物图 电路原理图 功能框图 PI
[单片机]
<font color='red'>51单片机</font>用PID算法温度控制器毕业设计
16-基于51单片机的烟雾和温湿度检测控制系统仿真
具体实现功能 由STC89C52单片机+LCD1602液晶显示屏+ADC0832模块+蜂鸣器+DHT11温湿度传感器 +烟雾传感器+LED+按键构成。 具体功能: 1、LCD1602液晶第一行显示当前的烟雾值,第二行显示当前的温度和湿度值; 2、可以设置烟雾、温湿度上下限报警值。共4个按键:复位按键、减键、加键、设置键;设定的参数具有掉电保存,保存在STC单片机的内部,上电无需重新设置; 3、当烟雾值高于设定的报警值或温度湿度超出上下限范围,蜂鸣器和指示灯会发出声光报警; 4、当温湿度值低于或高于设定的范围时,相应的指示灯亮,蜂鸣器报警; 5、当同时满足烟雾过高、温度过高、湿度过低三个条件时,控制继电器吸合
[单片机]
16-基于<font color='red'>51单片机</font>的烟雾和温湿度检测控制系统仿真
51单片机2个外部中断的应用
;51单片机的P1口上接有8只LED。 ;在外部中断0输入引脚P3.2接有一只按钮开关K1。 ;在外部中断1输入引脚P3.3接有一只按钮开关K2。 ;要求K1和K2都未按下时,P1口的8只LED呈流水灯显示, ;仅K1(P3.2)按下时,左右4只LED交替闪烁。 ;仅按下K2(P3.3)时,P1口的8只LED全部闪亮。 ;两个外中断的优先级相同。 ;============================================= ;用 PROTSUE 仿真界面如下: ;图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/50c618c5f08ba9
[单片机]
<font color='red'>51单片机</font>2个外部<font color='red'>中断</font>的应用
数显温度计设计电路图大全(DS18B20/89S51单片机/液晶)
数显温度计设计电路图(一):液晶显示的数字式电脑温度计电路 如图为液晶显示的数字式电脑温度计电路。该八段式四位LCD显示器,内置驱动器,串行数据传送,使用方便。 液晶显示的数字式电脑温度计电路 数显温度计设计电路图(二) 介绍一种具有简单人工智能的温度控制电路,使用该电路进行温度控制时,只需将开关打在2的位置,通过设定控制温度,并通过3位半数显表头所显示的温度值,即可精确地控制温度,使得温控操作变得十分方便。LM35是一种内部电路已校准的集成温度传感器,其输出电压与摄氏温度成正比,线性度好,灵敏度高,精度适中.其输出灵敏度为10.0MV/℃,精度达 0.5℃.其测量范围为-55—150℃。在静止温度中自热效应低.工作电压较
[单片机]
数显温度计设计电路图大全(DS18B20/89S<font color='red'>51单片机</font>/液晶)
8051单片机-模拟串口
传统的8051系列单片机一般都配备一个串口,而STC89C52RC增强型单片机也不例外,只有一个串口可供使用,这样就出问题了,假如当前单片机系统要求二个串口或多个串口进行同时通信,8051系列单片机只有一个串口可供通信就显得十分尴尬,但是在实际的应用中,有两种方法可以选择。 方法1:使用能够支持多串口通信的单片机,不过通过更换其他单片机来代替8051系列单片机,这样就会直接导致成本的增加,优点就是编程简单,而且通信稳定可靠。 方法2:在IO资源比较充足的情况下,可以通过IO来模拟串口的通信,虽然这样会增加编程的难度,模拟串口的波特率会比真正的串口通信低一个层次,但是唯一优点就是成本上得到控制,而且通过不同的IO组合可以实现
[单片机]
80<font color='red'>51单片机</font>-模拟串口
MCS-51单片机有几个I/O口?组成特点是什么
MCS-51单片机有几个I/O口? 答:MCS-51单片机有4个双向的8位I/O口的P0~P3口为三态双向口 P1,P2,P3口为准双向口(用作输入时,口线被拉成高电平,所以称为准双向口)。 I/O口的组成有什么特点? 答:每一位均由锁存器(SFR)、输出驱动器和输入缓冲器组成。 它们的上拉电阻实际上不是线性电阻,而是由场效应管构成 ,每位锁存器均由D触发器组成。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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