单片机:定时器0和1中断(内含硬件内容详解+软件编程)(ps:此处硬件执行结构间的理解是重中之重)

简介: 单片机:定时器0和1中断(内含硬件内容详解+软件编程)(ps:此处硬件执行结构间的理解是重中之重)

b2a02c3a42a34007b9081fde585b385f.png

fd51eb649e00496b8dfec19fc18e5707.png

T=1/f,若f=12MHz,

则振荡周期T=1/12us,

状态周期T=2*(1/6)us;

机器周期T=12*(1/12)=1us

指令周期T=1~4us

精确的延时函数,用定时器完成


f15ca7a5c2464b2cb0bb11b17ebf3fb3.png


默认介绍T0-T1, T2不做介绍,内容基本相同


实质是+1计算。有16位=高8位+低8位


每次有脉冲时,自动+1,当全部+1时,溢出,此时完成定时/计数功能


定时时间/计数次数计算=溢出计数值-初值(如65536-10)


T0引脚连接P3.4管脚


T1引脚连接P3.5管脚


TMOD寄存器工作方式寄存器;控制选择是定时器功能还是计数器功能


TCON寄存器低4位用于控制外部中断相关位,高4位控制定时器控制位,包括启动,停止,溢出


b4941937dc794c0ba129444e7ed364a9.png


7-4位,高4位,管理T1:


GATE:门控位,为0时,软件控制TR0=1,TR1=1(常用)


为1时,软件控制TR0=1,TR1=1并且INTO=1,INT1=1


C/T:选择位,C为计数,T为定时,T=0时,低电平有效,为定时模式,T=1时,为计数模式


M0,M1为工作方式的设置:00 01 10 11多使用01和10(01是定时寄存器工作,10是串口通信波特率的生成)


3-0位,低4位,管理T0:


df957d49955c4646944aadfe103a0fb7.png


TF1/TF0:查询定时器是否溢出(也可通过软件置1或清0)

TR1:为1时,定时器开始工作;为0时,定时器停止工作,通过软件配置


14b36a8235f14812b88983ad36bad5cb.png

TMOD的0X00方式0的00,13位,若5位均为11111,则向前8位置1,若前8位也满,则溢出给TF0,


TFO为溢出标志位,溢出,发送信号给计数器


图右侧:


GATE=0时,经过非门为1,(与INTO引脚的)或门为1,当TRO为1时,经过与门,进入中断开关,使之置为1。


GATE=1时,经过非门为0,(与INTO引脚的)或门为1(INT0为1时),当TRO为1时,经过与门,进入中断开关,使之置为1。


GATE=1时,经过非门为0,(与INTO引脚的)或门为0(INT0为0时),进入中断开关,使之置为0。


C/T:工作模式选择


当T=0时,计数模式,中断开关连接1,TO引脚连接外部引脚P3.4管脚,并传输外部脉冲


当T=1时,计数模式,中断开关连接0,机器周期,一次就是1us..达到技术目的


计数初值与计数个数:2的13次方-N


(用于定时计算器)


b55548e0a6d54bc5bf81a25e47b945e4.png


TM0D的0X01方式1的01,16位,低八位计数满了,向高八位溢出,高八位计数满了则溢出给TF0,给CPU中断...

计数初值与计数个数:2的16次方-N

(用于波特率)


4917e22329ce4b14aea66de85db115bd.png


TMOD的0X02方式2的10,TLO全为11111111时,溢出给THO,THO再次归还给TLO,自动重置

适用于精确脉冲信号发生器,如串口通信uart

计数初值与计数个数:2的8次方-N


d7062b7bde9447dabede471fb2a57240.png


TMOD的0X03方式3的11,仅适用于T0


89bdb4f5f3fd4e6fa620cfa0744d1a33.png


计算初值1ms


如默认为f=12MHz时,机器的T=1/f=1us


则1ms/1us=1000,65536-1000=64536,并将其写入TL0,TH0或TH1,TH1中,FC18


TL0=0xFC TL1=0x18


若计算值过大时,则可以用工具里面的定时器计算工具


理解此图需要与上图尤其是方式1.2紧密结合着理解,较简单,不再赘述。


b009adbd77984c49a20b8a54ab926b85.png

TMOD=0x01,0x0代表选择T0,1代表0001,0001的0代表GATA=0,C/T=0,M1=0,M0=1.此时完成对T0/T1的确定


TH0=0XFC;TL0=0X18是赋初值,将1ms=FC18,FC18给TH0和TL0


打开ET0或ET1,(定时器0中断允许位或定时器1中断允许位)+EA(总中断)


打开定时器1或定时器2


若T0换为T1时,需要TMOD|=0X10;TH1=0XFC;TL1=0X18L;ET1=1;EA=1;TR1=1......


注:用单片机板子显示出来时,需要用D1=P2.0


994ec10d01cf40a181dc20f519ae22bd.png


#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1=P2^0;
void time0_init(void)//定时器中断0
{
    TMOD|=0X01;//选择为定时器0模式,工作方式1
    TH0=0XFC;//给定时器赋初值,定时1ms
    TL0=0X18;
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器
}
void time1_init(void)
{
    TMOD|=0X10;//选择为定时器0模式,工作方式1
    TH1=0XFC;    //给定时器赋初值,定时1ms
    TL1=0X18;    
    ET1=1;//打开定时器1中断允许
    EA=1;//打开总中断
    TR1=1;//打开定时器        
}
void main(void)
{
    time0_init();//定时器0中断配置
    time1_init();//定时器1中断配置
    while(1)
    {
    }
}
void time0() interrupt 1 //定时器0中断函数
{
    static u16 i;//定义静态变量i
    TH0=0XFC;    //给定时器赋初值,定时1ms
    TL0=0X18;
    i++;
    if(i==1000)
    {
        i=0;
        LED1=!LED1;    
    }                        
}
void time1() interrupt 3 //定时器1中断函数
{
    static u16 i;//定义静态变量i
    TH1=0XFC;    //给定时器赋初值,定时1ms
    TL1=0X18;
    i++;
    if(i==1000)
    {
        i=0;
        LED1=!LED1;    
    }                        
}

a9a6eefb51bb4227a8ce9183a69262ee.png



相关文章
|
7月前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
110 1
|
4月前
【51单片机】通过定时器中断 在8位数码管显示时间
【51单片机】通过定时器中断 在8位数码管显示时间
|
4月前
|
算法
51单片机不用定时器的数码管倒计时
51单片机不用定时器的数码管倒计时
|
7月前
|
算法 定位技术 C语言
51单片机实现俄罗斯方块游戏编程
设计了一款基于AT89C51单片机的俄罗斯方块游戏机,使用LCD12864液晶显示,按键控制方块移动与变形。游戏中,7种不同形状的方块随机下落,填满一行得分,满屏则游戏结束。包含电源、单片机最小系统、LCD和按键模块的硬件电路通过Proteus进行了仿真,展示了游戏运行、得分和计时等。代码部分展示了检查碰撞和更新地图的函数。
156 1
|
7月前
|
传感器 人工智能 物联网
单片机:编程实践与应用探索
单片机:编程实践与应用探索
82 4
|
7月前
|
存储 传感器 数据处理
单片机编程入门与实践
单片机编程入门与实践
79 2
【51单片机】一文带你利用【Keil软件的模板功能】【自定义模板】简化操作(带图详解)
【51单片机】一文带你利用【Keil软件的模板功能】【自定义模板】简化操作(带图详解)
|
7月前
|
IDE 开发工具 C++
【51单片机】开发板&开发软件(Keil5&STC-ISP)简介&下载安装破译传送门(1)
【51单片机】开发板&开发软件(Keil5&STC-ISP)简介&下载安装破译传送门(1)
|
7月前
|
C++ 内存技术
【期末不挂科-单片机考前速过系列P8】(第八章:21题速过AT89S51单片机的内部硬件结构)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P8】(第八章:21题速过AT89S51单片机的内部硬件结构)经典例题盘点(带图解析)