精华内容
下载资源
问答
  • 本章提要本章介绍MCS51单片机重要功能硬件中断系统定时/计数器串行口的工作原理及应用通过本章学习熟悉中断的基本概念掌握中断系统的硬件组成中断系统的程序结构初始化编程的设计方法掌握定时/计数器串行口的结构...
  • 51单片机中断级别中断源默认中断级别序号(C语言用)INT0---外部中断0最高0T0---定时器/计数器0中断第21INT1---外部中断1第32T1----定时器/计数器1中断第43TX/RX---串行口中断第54T2---定时器/计数器2中断最低5中断...

    51单片机中断级别中断源默认中断级别序号(C语言用)

    INT0---外部中断0最高0

    T0---定时器/计数器0中断第21

    INT1---外部中断1第32

    T1----定时器/计数器1中断第43

    TX/RX---串行口中断第54

    T2---定时器/计数器2中断最低5

    中断允许寄存器IE位序号DB7DB6DB5DB4DB3DB2DB1DB0

    符号位EA-------ET2ESET1EX1ET0EX0

    EA---全局中允许位。

    EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。

    EA=0,关闭全部中断。

    -------,无效位。

    ET2---定时器/计数器2中断允许位。 EA总中断开关,置1为开;

    ET2=1,打开T2中断。 EX0为外部中断0(INT0)开关,……

    ET2=0,关闭T2中断。 ET0为定时器/计数器0(T0)开关,……

    ES---串行口中断允许位。 EX1为外部中断1(INT1)开关,……

    ES=1,打开串行口中断。 ET1为定时器/计数器1(T1)开关,……

    ES=0,关闭串行口中断。 ES为串行口(TX/RX)中断开关,……

    ET1---定时器/计数器1中断允许位。 ET2为定时器/计数器2(T2)开关,……

    ET1=1,打开T1中断。

    ET1=0,关闭T1中断。

    EX1---外部中断1中断允许位。

    EX1=1,打开外部中断1中断。

    EX1=0,关闭外部中断1中断。

    ET0---定时器/计数器0中断允许位。

    ET0=1,打开T0中断。

    ET0=0,关闭T0中断。

    EX0---外部中断0中断允许位。

    EX0=1,打开外部中断0中断。

    EX0=0,关闭外部中断0中断。

    中断优先级寄存器IP位序号DB7DB6DB5DB4DB3DB2DB1DB0

    位地址---------PSPT1PX1PT0PX0

    -------,无效位。

    PS---串行口中断优先级控制位。

    PS=1,串行口中断定义为高优先级中断。

    PS=0,串行口中断定义为低优先级中断。

    PT1---定时器/计数器1中断优先级控制位。

    PT1=1,定时器/计数器1中断定义为高优先级中断。

    PT1=0,定时器/计数器1中断定义为低优先级中断。

    PX1---外部中断1中断优先级控制位。

    PX1=1,外部中断1中断定义为高优先级中断。

    PX1=0,外部中断1中断定义为低优先级中断。

    PT0---定时器/计数器0中断优先级控制位。

    PT0=1,定时器/计数器0中断定义为高优先级中断。

    PT0=0,定时器/计数器0中断定义为低优先级中断。

    PX0---外部中断0中断优先级控制位。

    PX0=1,外部中断0中断定义为高优先级中断。

    PX0=0,外部中断0中断定义为低优先级中断。

    定时器/计数器工作模式寄存器TMOD位序号DB7DB6DB5DB4DB3DB2DB1DB0

    位符号GATEC/TM1M0GATEC/TM1M0

    |-----------------定时器1------------------------|--------------------定时器0----------------------|

    GATE---门控制位。

    GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX(X=0,1)来控制。

    GATE=1,定时器计数器启动与停止由TCON寄存器中TRX(X=0,1)和外部中断引脚(INT0或INT1)上的电平状态来共同控制。

    C/T---定时器和计数器模式选择位。

    C/T=1,为计数器模式;C/T=0,为定时器模式。

    M1M0---工作模式选择位。M1M0工作模式

    00方式0,为13位定时器/计数器

    01方式1,为16位定时器/计数器

    10方式2,8位初值自动重装的8位定时器/计数器

    11方式3,仅适用于T0,分成两个8位计数器,T1停止工作

    定时器/控制器控制寄存器TCON位序号DB7DB6DB5DB4DB3DB2DB1DB0

    符号位TF1TR1TF0TR0IE1IT1IE0IT0

    TF1---定时器1溢出标志位。

    当定时器1记满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。

    TR1---定时器1运行控制位。

    由软件清0关闭定时器1。当GATE=1,且INIT为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器1。

    TF0---定时器0溢出标志,其功能及其操作方法同TF1。

    TR0---定时器0运行控制位,其功能及操作方法同TR1。

    IE1---外部中断1请求标志。

    当IT1=0时,位电平触发方式,每个机器周期的S5P2采样INT1引脚,若NIT1脚为定电平,则置1,否则IE1清0。

    当IT1=1时,INT1为跳变沿触发方式,当第一个及其机器周期采样到INIT1为低电平时,则IE1置1。IE1=1,表示外部中断1正向CPU中断申请。当CPU响应中断,转向中断服务程序时,该位由硬件清0。

    IT1外部中断1触发方式选择位。

    IT1=0,为电平触发方式,引脚INT1上低电平有效。

    IT1=1,为跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效。

    IE0---外部中断0请求标志,其功能及操作方法同IE1。

    IT0---外部中断0触发方式选择位,其功能及操作方法同IT1。

    从上面的知识点可知,每个定时器都有4种工作模式,可通过设置TMOD寄存器中的M1M0位来进行工作方式选择。

    方式1的计数位数是16位,对T0来说,由TL0寄存器作为低8、TH0寄存器作为高8位,组成了16位加1计数器。

    关于如何确定定时器T0的初值问题。定时器一但启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为一个机器周期,那么此时机器周期为1us,记满TH0和TL0就需要216 -1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需65536us,约等于65.6ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上记50000个数后,定时器溢出,此时刚好就是50ms中断一次,当需要定时1s时,我们写程序时当产生20次50ms的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536.,把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536/256=176装入TL0中。

    以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为TCY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/TCY ,装入THX和TLX中的数分别为:

    THX=(65536-N)/256 , TLX=(65536-N)%256 中断服务程序的写法

    void 函数名()interrupt 中断号 using 工作组

    {

    中断服务程序内容

    }

    在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下:

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

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

    (3)中断方式时,则对IE赋值,开放中断。

    (4)使TR0和TR1置位,启动定时器/计数器定时或计数。

    例:利用定时器0工作方式1,实现一个发光管以1s亮灭闪烁。

    程序代码如下:

    #include#define uchar unsigned char

    #define uint unsigned int

    sbit led1=P1^0;

    uchar num;

    void main()

    {

    TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1)

    TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872

    TL0=(65536-45872)%256;

    EA=1; //开总中断

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

    TR0=1; //启动定时器0

    while(1)

    {

    if(num==20) //如果到了20次,说明1秒时间

    {

    led1=~led1; //让发光管状态取反

    num=0;

    }

    }

    }

    void T0_time()interrupt 1

    {

    TH0=(65536-45872)/256; //重新装载初值

    TL0=(65536-45872)%256;

    num++;

    }

    展开全文
  • 51单片机最小系统原理图、PCB及组成原理详解

    万次阅读 多人点赞 2018-04-07 09:40:54
    单片机:单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示...

    关注公众号:大狮熊 回复:最小系统 获取工程文件

    欢迎加入单片机学习交流群:946480874

    单片机:单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

     先上原理图和PCB,原理介绍在后面:

    原理图:(如有错误欢迎留言,

    PCB:

    3D效果图:

    最小系统组成:

    51单片机最小系统:单片机、复位电路、晶振(时钟)电路、电源

    最小系统用到的引脚

    1、主电源引脚(2根)
    VCC:电源输入,接+5V电源
    GND:接地线

    2、外接晶振引脚(2根)
    XTAL1:片内振荡电路的输入端
    XTAL2:片内振荡电路的输出端

    3、控制引脚(4根)
    RST/VPP:复位引脚,引脚上出现2个机器周期(如果用11.0592Mhz的晶振,一个机器周期为1us,一个机器周期等于12个时钟周期)的高电平将使单片机复位,

    电源:

        电脑端输出232电平,单片机是TTL电平,需要USB转换模块对其转换

    复位电路:分为高电平和低电平复位。上电复位、按键复位、看门狗复位。

    单片机的复位电路就好比电脑的重启部分,当电脑在使用过程中死机,按下重启按钮电脑内部的程序开始从头执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮,内部程序从头开始执行。

     (包括上电复位和按键复位)

    当这个电路处于稳态时,电容起到隔离直流的作用,隔离了+5V,而左侧的复位按键是弹起状态,下边部分电路就没有电压差的产生,所以按键和电容C11 以下部分的电位都是和GND 相等的,也就是 0V。我们这个单片机是高电平复位,低电平正常工作,所以正常工作的电压是 0V,没有问题。

    我们再来分析从没有电到上电的瞬间,电容 C11 上方电压是 5V,下方是 0V,根据我们初中所学的知识,电容 C11 要进行充电,正离子从上往下充电,负电子从 GND 往上充电,这个时候电容对电路来说相当于一根导线,全部电压都加在了 R31 这个电阻上,那么 RST端口位置的电压就是 5V,随着电容充电越来越多,即将充满的时候,电流会越来越小,那RST 端口上的电压值等于电流乘以 R31 的阻值,也就会越来越小,一直到电容完全充满后,线路上不再有电流,这个时候RST 和 GND 的电位就相等了也就是 0V 了。

    从这个过程上来看,我们加上这个电路,单片机系统上电后,RST 引脚会先保持一小段时间的高电平而后变成低电平,这个过程就是上电复位的过程。那这个“一小段时间”到底是多少才合适呢?每种单片机不完全一样,51 单片机手册里写的是持续时间不少于 2 个机器周期的时间。复位电压值,每种单片机不完全一样,我们按照通常值 0.7VCC 作为复位电压值,复位时间的计算过程比较复杂,我这里只给大家一个结论,时间t=1.2RC,我们用的 R是 4700 欧,C 是 0.0000001 法,那么计算出 t 就是 0.000564 秒,即564us,远远大于 2 个机器周期(2us),在电路设计的时候一般留够余量就行。

    按键复位(即手动复位)有 2 个过程,按下按键之前,RST 的电压是 0V,当按下按键后电路导通,同时电容也会在瞬间进行放电,RST 电压值变化为 4700VCC/(4700+18),会处于高电平复位状态。当松开按键后就和上电复位类似了,先是电容充电,后电流逐渐减小直到 RST 电压变 0V 的过程。我们按下按键的时间通常都会有几百毫秒,这个时间足够复位了。

    按下按键的瞬间,电容两端的 5V 电压(注意不是电源的 5V 和 GND 之间)会被直接接通,此刻会有一个瞬间的大电流冲击,会在局部范围内产生电磁干扰,为了抑制这个大电流所引起的干扰,我们这里在电容放电回路中串入一个 18 欧的电阻来限流。

    晶振(时钟电路):

    晶振通常分为无源晶振和有源晶振两种类型,无源晶振一般称之为 crystal(晶体),而有源晶振则叫做 oscillator(振荡器)。

    有源晶振是一个完整的谐振振荡器,它是利用石英晶体的压电效应来起振,所以有源晶振需要供电,当我们把有源晶振电路做好后,不需要外接其它器件,只要给它供电,它就可以主动产生振荡频率,并且可以提供高精度的频率基准,信号质量也比无源信号要好

    无源晶振自身无法振荡起来,它需要芯片内部的振荡电路一起工作才能振荡它允许不同的电压,但是信号质量和精度较有源晶振差一些。相对价格来说,无源晶振要比有源晶振价格便宜很多。无源晶振两侧通常都会有个电容,一般其容值都选在10pF~40pF 之间,我们用 20pF 就是比较好的选择,这是一个长久以来的经验值,具有极其普遍的适用性。

    有源晶振通常有 4 个引脚,VCC,GND,晶振输出引脚和一个没有用到的悬空引脚(有些晶振也把该引脚作为使能引脚)。无源晶振有 2 个或 3 个引脚,如果是 3 个引脚的话,中间引脚接是晶振的外壳,使用时要接到 GND,两侧的引脚就是晶体的 2 个引出脚了,这两个引脚作用是等同的,就像是电阻的 2 个引脚一样,没有正负之分。对于无源晶振,用我们的单片机上的两个晶振引脚接上去即可,而有源晶振,只接到单片机的晶振的输入引脚上,输出引脚上不需要接,如图所示。

     

     总结:

    1.   51单片机最小系统复位电路的极性电容C1的大小直接影响单片机的复位时间,一般采用10~30uF,51单片机最小系统容值越大需要的复位时间越短。

     2.    51单片机最小系统晶振Y1也可以采用6MHz或者11.0592MHz典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)在正常工作的情况下可以采用更高频率的晶振,51单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。

     3.    51单片机最小系统起振电容C2、C3一般采用10~40pF,并且电容离晶振越近越好,晶振离单片机越近越好

     4.    P0口为开漏输出,作为输出口时需加上拉电阻,阻值一般为10k。

    欢迎加入单片机学习交流群:946480874

    展开全文
  •  引起CPU中断的根源,称为中断源,中断源向CPU提出中断请求,CPU暂时中断原来...中断优先级决定了中断是否能够实现嵌套,52单片机一共有六个中断中断源 序号(C 默认中断级别 ...

     

             引起CPU中断的根源,称为中断源,中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对时间B处理完毕后,再回来原来的地方(断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。

    中断优先级决定了中断是否能够实现嵌套,52单片机一共有六个中断源

    中断源

    序号(C

    默认中断级别

    INT0

    0

    最高

    T0

    1

    2

    INT1

    2

    3

    T1

    3

    4

    TI/RI

    4

    5

    T2

    5

    最低

     51系列单片机的中断有三种,外部中断, 定时器/计数器中断,串行口中断,中断优先级别如表格

    中断允许寄存器IE以及中断优先级寄存器IP

    位序

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    位符

    EA

    --

    ET2

    ES

    ET1

    EX1

    ET0

    EX0

    位地址

    AFH

    --

    ADH

    ACH

    ABH

    AAH

    A9H

    A8H

     

    IE在特殊功能寄存器中(sfr)可进行位寻址,单片机复位时IE全清零

     

    EA----全局中断允许位

             EA=1,打开全局中断控制,由各个中断控制位确定相应的打开或者 关闭中断

             EA=0,禁用所有中断

    除--为无效位外,其他位分别为各个中断的允许位,置1打开中断,置零关闭中断

     

    位序号

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    位符号

    --

    --

    --

    PS

    PT1

    PX1

    PT0

    PX0

    位地址

    --

    --

    --

    BCH

    BBH

    BAH

    B9H

    B8H

     

    IP位于特殊功能寄存器中(sfr)可进行位寻址,单片机复位时IP全清零

     

              51单片机系列中,高优先级 能够打断低优先级中断以形成中断嵌套,同优先级之间或者低级对高优先级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,在没有设置的中断优先级的情况下,按照默认中断级别响应中断,在设置中断优先级后,则按设置顺序确定响应的先后顺序

    51系列单片机的定时器中断

     单片机的定时器系统

                51单片机内有两个16位可编程计数器/定时器(16位加1计数器,分由高八位和低八位两个寄存器组成),分别为T0( TH0,TL0 )、T1( TH1,TL0 ),另52单片机内部多一个T2。它们既有定时器功能又有计数功能,通过设置相关的特殊功能寄存器可以使用它们。定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,CPU一旦设置开启定时器功能后,定时器便在晶振的作用下自动开始计时,当定时器的计数器计满后,会产生中断。

                加1计数器的计数脉冲有两个来源:一个是系统的时钟震荡器输出脉冲经12分频后送来,另一个是由T0或是T1引脚输入的外部脉冲源,每一个脉冲计数加1,计满再一个脉冲则归零,向CPU请求中断。

      先来了解定时器,计数器功能暂不介绍

    定时器/计数器工作方式寄存器TMOD以及定时器/计数器控制寄存器TCON

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    符号

    GATE

    C/T

    M1

    M0

    GATE

    C/T

    M1

    M0

     

    TMOD位于特殊功能寄存器中,字节地址89H,不能进行位寻址,单片机复位全清零0

     

    GATE----门控制位

      GATE=0,定时器计数器启动与停止仅受TCON寄存器中的TRX(X=0,1)控制

      GATE=1,定时器计数器启动与停止由外部中断引脚(INT0或INT1)上的电平状态来共同控制

    C/T----定时器或者计数器模式选择位

    M1M0--工作方式选择位

    每个定时器都有4中工作方式,它们由M1M0来设定

      

    M1

    M0

    工作方式

    0

    0

    方式0,为13位定时器/计数器

    0

    1

    方式1,为16位定时器/计数器

    1

    0

    方式2,8位初值自动重装的定时器/计数器

    1

    1

    方式3,仅适用于T0,分成两个8位计数器,T1停止计数

    位序号

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    位符号

    TF1

    TR1

    TF0

    TR0

    IE1

    IT1

    IE0

    IT0

    位地址

    8FH

    8EH

    8DH

    8CH

    8BH

    8AH

    89H

    88H

     

    TCON位于特殊功能寄存器中(SFR),可进行位寻址

    TF1/TF0--------定时器/计数器溢出标志位

       当定时器计满溢出时,由硬件使其置1,并且向CPU申请中断,进入中断服务程序后,由硬件自动清0。

    TR1/TR0-------定时器运行控制位

       当GATE=1,当相应的外部中断引脚(INT1/INT0)为高电平时,TR1/TR0置1启动定时器,当GATE=0,TR1/TR0置1启动定时器

    IE1/IE0--------外部中断请求标志位

    IT1/IT0---------外部中断触发方式选择位

            0为电平触发模式

            1为跳变沿触发模式

    定时器中断应用举例->方式1

            16位定时器/计数器

     在写单片机程序之前,需要对定时器以及中断寄存器做初始化设置

            ①对TMOD赋值,确定定时器工作方式

            TOMD=0x01;-----即系设定定时器0为16位定时器,GATE=0此时仅由TR0控制启动定时器0

            ②计算初值,并将初值写入TH0/TL0

            ③对IE赋值,开放中断

            ④对TR0/TR1置位,开始定时或者计数

        

            关于计算初值,前面提到,加1计数器的脉冲源为一个是系统的时钟震荡器输出脉冲经12分频后送来,另一个是由T0或是T1引脚输入的外部脉冲源,每一个脉冲计数加1,计满再一个脉冲则归零,向CPU请求中断。

             这里使用系统的时钟振荡器输送经12分频之后送来的脉冲源,由此,1个机械周期等于12个时钟周期。

          

             令单片机的时钟晶振频率为f,则一个机械周期的时间为[(1/f)*12 ] 。51单片机常用的外部晶振为12MHz和11.0592MHz,若使用12MHz的晶振,则机械周期为1us(微秒),即系定时器寄存器每经一微秒就加1。

             我们令定时器寄存器(TH0和TL0)的初值为(2^16 - N),此时每经N微秒发生一次中断。(2^16=65536)

             将初值装入TH0、TL0的方式: TH0=(65536-N)/256;  TH0=(65536-N)%256;

          

    1. #include<reg52.h>
    2. sbit led1=P1^0;
    3. unsigned char num;
    4. void main()
    5. {
    6. TMOD=0x01;<span style="white-space:pre"> </span>//设定定时器0为工作方式1
    7. TH0=(65536-50000)/256; //定时器寄存器装初值
    8. TL0=(65336-50000)%256;
    9. EA=1; //全局中断允许
    10. ET0=1; //定时器0中断允许
    11. TR0=1; //启动定时器0
    12. while(1);
    13.  
    14. }
    15. void timer0() interrupt 1
    16. {
    17. TH0=(65536-50000)/256; //重装初值
    18. TL0=(65536-50000)%256;
    19. num++;
    20. if( 20==num) //每20*50ms 即系1秒让led1取反一次
    21. {
    22. num=0;
    23. led1=~led1;
    24. }
    25. }

             这是一个简单的程序,让I/O口驱动一个led灯,每一秒改变一次状态。

             一旦开启定时器,其便开始计数,当计数溢出时候,自动进入中断服务程序,计数器自动计数,知道程序执行结束才停止。所以,中断服务程序的代码不可以过长,以免中断服务程序未执行完,下一次中端来临,便会丢失中断。

     

    展开全文
  • 51单片机中断

    千次阅读 多人点赞 2021-01-27 23:59:10
    51单片机中断51单片机中断原理中断的概念:中断作用中断源及相关寄存器中断源及优先级定时器/计数器控制寄存器 TCON中断允许寄存器 IE中断优先寄存器 IP工作方式寄存器TMOD定时器初值寄存器THx 和 TLx计数器初值的...

    51单片机中断原理

    中断的概念:

    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。
    在这里插入图片描述

    中断作用

    随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点:

    1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。
    2. 实时操作:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
    3. 可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性更高。

    中断源及相关寄存器

    中断源及优先级
    中断源符号名称中断标志中断引起原因中断号优先级
    /INT0外部中断0IE0低电平或下降沿信号0最高
    T0定时器中断0TF0定时/计数器0 计数回0溢出1
    /INT1外部中断1IE1定电平或下降沿信号2
    T1定时器中断1TF1定时/计数器1 计数回0溢出3
    TX/RX串行口中断TI/RI串行通信完成一帧数据发送或接收4最低
    定时器/计数器控制寄存器 TCON
    D7D6D5D4D3D2D1D0
    功能TF1TR1TF0TR0IE1IT1IE0IT0

    TF0、 TF1: 是定时器中断标志(定时器0溢出标志位、定时器1溢出标志位)
    TR0 、TR1: 打开相应的定时器(定时器0运行控制位,=1时启动定时器0、定时器1运行控制位,=1时启动定时器1)
    由软件清0关闭定时器0/1。当GATE=1,且INIT为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器0/1。
    IT0、IT1: 是外部中断的触发方式。 =0时 低电平触发,=1时负跳变触发。
    IE0、IE1: 是外部中断的标志位

    中断允许寄存器 IE
    D7D6D5D4D3D2D1D0
    功能EA————ESET1EX1ET0EX0

    EA: 总中断允许。 EA=0;CPU屏蔽所有中断的请求 EA=1;开放所有中断。
    ES:串行口中断允许位。ES=0; 禁止串行中断。ES=1; 允许串口中断。
    ET0、ET1: 定时器/计数器0 和 定时器/计数器 1 中断允许位 =0时 禁止相应的定时器中断。 =1 允许相应的定时器中断
    EX0、EX1: 外部中断0 和 外部中断 1 中断允许位。=0时 禁止相应的外部中断。 =1时 允许相应的外部中断。
    ——:无效位

    中断优先寄存器 IP
    D7D6D5D4D3D2D1D0
    功能——————PSPT1PX1PT0PX0

    PS: 串行口中断优先级 PS = 1;(高) 。PS = 0; (低)。
    PT0:定时器0中断优先级 PT0 = 1;(高) PT0 = 0;(低)。
    PT1:定时器1中断优先级 PT1 = 1;(高) PT1 = 0;(低)。
    PX0:外部中断0中断优先级 PX0 = 1;(高) PX0 = 0;(低)。
    PX1:外部中断1中断优先级 PX1 = 1;(高) PX1 = 0;(低)。
    ——:无效位

    IP寄存器不做设置,上电复位后为00H,默认是为低优先级
    不设置默认优先级是(由高到低):
    外部中断0→定时器0→外部中断1→定时器1→串口

    如果我们把IP寄存器设置为:(IP = 0X10)
    PS = 1;
    PT1 = 0;
    PX1 = 0;
    PT0 = 0;
    PX0 = 0;
    如下表:

    D7D6D5D4D3D2D1D0
    功能——————10000

    那么优先级从高到低是:
    串口→外部中断0→定时器0→外部中断1→定时器1

    工作方式寄存器TMOD
    D7D6D5D4D3D2D1D0
    功能GATEC/TM1M0GATEC/TM1M0

    在这里插入图片描述
    GATE:门控制
    =0:仅有运行控制位TRx来控制定时/计数器的开启。
    =1:由TRx和外部中断脉冲计数。(用于计算外部中断 负跳变 的次数)
    C/T:计数器模式和定时器模式选择
    =0:选择定时器模式
    =1:选择计数器模式
    M1、M0:选择定时/计数器的工作方式

    M1M0工作方式
    00方式0:为13位定时/计数器
    01方式1:为16位定时/计数器
    10方式2:为8位初值自动重装定时/计数器
    11方式3:仅适用于T0,分成两个8位计数器,T1停止计数。

    方式0
    方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
    在这里插入图片描述
    方式1
    方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。
    在这里插入图片描述
    方式2
    方式2为自动重装初值的8位计数方式。
    在这里插入图片描述
    方式3
    方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
    在这里插入图片描述

    定时器初值寄存器THx 和 TLx

    首先先了解一下CPU时序有关知识:
    振荡周期: 为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
    状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。
    机器周期:1个机器周期含6个状态周期,12个振荡周期。
    指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。

    例如:外接晶振为12MHz时,51单片机相关周期的具体值为:
    振荡周期=1/12us;
    状态周期=1/6us;
    机器周期=1us;
    指令周期=1~4us;

    计数器初值的计算:

    机器周期就是CPU完成一个基本操作所需要得时间。
    机器周期 = 1 /单片机的时钟频率
    51单片机内部时钟频率是外部时钟的12分频,也就是当外部晶振的频率输入到单片机里面
    的时候要进行12分频。

    比如:你用的是12MHZ的晶振,当你使用12MHZ的外部晶振的时候,
    机器周期 = 1 / 1M = 1us。
    (选择定时器工作方式1 16位)
    我们2的16次方等于65536,也就是最大值为65536(溢出)
    如果定时1ms
    初值就为:1ms / 1us = 1000。也就是要计数1000个数, 初值 = 65535-1000+1 = 64536,65536才会溢出。 所以初值即FC18H(十进制为64536)

    如果定时50ms
    50ms/1us=50000;
    初值 = 65535-50000+1=15536;
    定时为50ms 初值为15536 即3CB0(十六进制)

    对于每个不同的方式计算初值数有公式去计算的,但是我不会哈哈,我是用一个软件来计算的,软件名字 mcuelf这样也比较快
    在这里插入图片描述

    外部中断

    操作步骤(INT0 INT1)

    1 设置 外部中断中断源号及触发方式。设置IT0或IT1(TCON寄存器)
    2 打开相应的外部中断允许。设置EX0或EX1(IE寄存器)
    3 打开总中断。设置EA(IE寄存器)

    如何配置外部中断

    这里就用外部中断0开示例吧

    //配置外部中断0
    void initInterrupt0()
    {
    	IT0 = 1; //触发方式为负跳变触发
    	EX0 = 1; //打开外部中断0允许
    	EA  = 1; //总中断打开
    }
    

    中断服务函数(发生中断你想做什么?)

    无返回值 函数名(随意起) interrupt 中断号
    void interrupt0ServiceFun() interrupt 0
    {
    	//编写你要做的事情
    }
    

    外部中断1也是差不多的,这里就不写了。

    程序示例

    实现按键按下开灯/关灯

    #include "reg52.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16; 
    typedef unsigned long int u32;
    						   
    
    sbit KEY = P3^2; //定义中断按键引脚  
    sbit LED = P2^0; //定义LED1引脚
    
    //配置中断0
    void initInterrupt0()
    {
    	EX0 = 1;
    	IT0 = 1;
    	EA  = 1;
    }
    //延时函数
    void delay(u8 i)
    {
    	while(i--);
    }
    void main()
    {
    
    	initInterrupt0();	//调用中断
    	while(1);
    
    }
    
    //发生中断执行函数
    void interruptHandler() interrupt 0
    {
    	delay(12000);  //延迟 因为当进入外部中断函数的时候按键时已经按下了这里是消抖作用
    	if(KEY == 0)	//再次确认是否真的按键被按下
    	{
    		LED = ~LED;	   //开灯/关灯
    	}
    }
    

    定时器/计数器中断

    需要了解的知识

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

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

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

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

    工作原理

    实质上是加1计数器,随着输入脉冲,计数器自动加1,
    溢出的时候会回0.,且计数器的溢出使相应的中断标志位 置1.
    向CPU发出中断请求。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
    可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

    定时器结构

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

    操作步骤(T0 T1)

    1.选择工作方式。设置M1、M0 (TMOD寄存器)
    2.选择控制方式。设置GATE(TMOD寄存器)
    3.选择定时器还是计数器模式。设置C/T(TMOD寄存器)
    4.给定时/计数器赋初值。设置THx 和 TLx(定时器初值寄存器)
    5.开启总中断。设置EA(IE寄存器)
    6.打开相应定时器中断允许。 设置ET0或ET1(IE寄存器)
    7.启动定时器。设置TR1或TR0(TCON寄存器)

    如何配置定时器

    这里就选择定时器0吧 选择方式1(16位)进行定时示例吧
    1.选择工作方式1(16位)M1=0;M0=1;
    2.控制方式 :仅有运行控制位TRx来控制定时/计数器的开启。GATE=0;
    3.选择定时器模式 C/T=0;

    TMOD=0x01;
    

    4.赋初值 这里选择定时为50ms 我的板子晶振是11.0592 具体怎么算我不会,推荐跟我一样不会的用软件mcuelf计算出以下结果
    在这里插入图片描述

        TH0 = 0x4C;
        TL0 = 0x00;
    

    5.打开总中断(总开关)

    EA=1;
    

    6.打开T0中断开关

    ET0=1;
    

    7.启动定时器0

    TR0=1;
    
    //配置定时器函数
    void time0Config()
    {
    	TMOD=0x01; //设定T0定时器,选择工作方式1(16位),定时器模式 仅有运行控制位TRx来控制定时/计数器的开启。
    	TH0 = 0x4C;  //初值设定
    	TL0 = 0x00;	 //初值设定
    	EA=1;        //打开总中断开关
    	ET0=1;		 //打开T0中断开关
    	TR0=1;		 //启动定时器0
    }
    
    
    //发生中断执行函数(这样就是50ms)
    void time0() interrupt 1   //T0中断号为1
    {
    	/*要注意这里不会自动重装,所以要再次设置回初值(除工作方式2)*/
    	TH0 = 0x4C;  //初值重新设定
    	TL0 = 0x00;	 //初值重新设定
    	
    	//编写你要做的事
    }
    

    程序示例

    这里就写一个用定时器来做一个简单的时钟显示在LCD1602上
    LCD1602我昨天发布了一个LCD1602的使用和显示hello word。这里就是详细讲LCD1602具体的操作了。

    引脚定义

    //引脚定义
    #define LCD P0
    sbit E = P2^7;   //使能
    sbit RS = P2^6;  //数据/命令(H/L)
    sbit RW = P2^5; //读写(H/L)
    
    

    lcd1602.h

    void write_com(unsigned char command);	//写命令函数
    void write_data(unsigned char dat);		//写数据函数
    void init_lcd();  //初始化LCD1602函数
    void delay5ms();  //延时5ms函数	
    

    lcd1602.c

    #include <reg52.h>
    #include "lcd1602.h"
    
    #define LCD P0
    sbit E = P2^7; 
    sbit RS = P2^6;
    sbit RW = P2^5;
    
    /******延迟5毫秒函数********/
    void delay5ms()   //误差 -0.000000000001us
    {
        unsigned char a,b;
        for(b=15;b>0;b--)
            for(a=152;a>0;a--);
    }
    
    
    /******LCD1602写命令函数********/
    void write_com(unsigned char command)
    {
    	RS = 0; 
    	RW = 0; 	//高读低写
    	LCD = command;
    	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
    	E = 1;		//使能拉高 
    	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
    	E = 0;
    }
    
    /******LCD1602写数据函数********/
    void write_data(unsigned char dat)
    {
    	RS = 1;
    	RW = 0;
    	LCD = dat;
    	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
    	E = 1;		//使能拉高 
    	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
    	E = 0;
    }
    /******初始化LCD1602********/
    void init_lcd()
    {	
    	write_com(0x06); //写入数据后光标自动右移 整屏不移动。
    	write_com(0x0c); //开显示功能 无光标 不闪烁
    	write_com(0x38); //数据总线8位 16X2显示 5*7点阵
    	write_com(0x01); //清屏 0000 0001
    }
    

    main.c

    #include <reg52.h>
    #include "lcd1602.h"
    
    unsigned char t = 0; //用来计数时间
    unsigned char i=0;
    unsigned char hours = 23;  //小时
    unsigned char minutes = 59; //分钟
    unsigned char seconds = 0; //秒
    
    unsigned char date[16] = {"2021-01-27   WED"};
    unsigned char time[5] = {"time:"};
    
    //配置定时器函数
    void time0Config()
    {
    	TMOD=0x01; //设定T0定时器,选择工作方式1(16位),定时器模式 仅有运行控制位TRx来控制定时/计数器的开启。
    	TH0 = 0x4C;  //初值设定
    	TL0 = 0x00;	 //初值设定
    	EA=1;        //打开总中断开关
    	ET0=1;		 //打开T0中断开关
    	TR0=1;		 //启动定时器0
    }
    
    void main()
    {	
    	init_lcd();	 //1.初始化lcd1602
    	
    	write_com(0x80); //设置显示日期位置 (第一行第一个开始)
    	for(i=0;i<16;i++)
    	{
    		write_data(date[i]);	
    	}
    	
    	write_com(0xc0); //设置显示time:位置(第二行第一个开始)
    	for(i=0;i<5;i++)  
    	{
    		write_data(time[i]);		
    	}
    	
    	time0Config();//调用定时器中断
    
    	while(1)
    	{
    		write_com(0xc6); 	//设置显示小时的十位 位置
    		write_data(hours/10+'0');	//小时十位
    		write_com(0xc7); 	//设置显示小时的个位 位置
    		write_data(hours%10+'0');	//小时个位
    	
    		write_com(0xc8); //设置显示: 位置
    		write_data(':');			//显示 :
    	
    		write_com(0xc9); 	//设置显示分钟的十位 位置
    		write_data(minutes/10+'0');	//分钟十位
    		write_com(0xca); 	//设置显示分钟的个位 位置
    		write_data(minutes%10+'0');	//分值个位
    	
    		write_com(0xcb); 	//设置显示: 位置
    		write_data(':');			//显示 :
    	
    		write_com(0xcc); 	//设置显示秒的十位 位置
    		write_data(seconds/10+'0');	//秒十位
    		write_com(0xcd); 	//设置显示秒的 个位 位置
    		write_data(seconds%10+'0');	//秒个位
    						
    	}
    }
    
    //发生中断执行函数(一次就是50ms)
    void time0() interrupt 1   //T0中断号为1
    {
    	/*要注意这里不会自动重装,所以要再次设置回初值(除工作方式2)*/
    	
    	TH0 = 0x4C;  //初值重新设定
    	TL0 = 0x00;	 //初值重新设定	
    	t++;
    	if(t == 20) //证明够1秒了 20 X 50ms = 1000ms = 1s
    	{
    		seconds++;	//秒+1
    		t=0;   //够了1秒设置为0 重新计数
    	}
    	if(seconds == 60) //如果秒到60
    	{
    		minutes++;   //分钟+1
    		seconds = 0; //秒回0
    	}
    	if(minutes == 60) //如果分钟到60
    	{
    		hours++;     //小时+1
    		minutes = 0; //分钟回0
    	}
    	if(hours == 24 ) //如果小时到24
    	{
    		hours = 0;   //小时回0
    	}
    	
    }
    

    最终项目展示

    在这里插入图片描述

    展开全文
  • 51单片机中断系统

    2021-03-21 14:43:50
    一、中断的概念 中断是指:CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断...80C51中断系统有5个中断源(80C52有 6个) ,2个优先级,可实现二级中断嵌套 。(而80C52单片机有四个中断优先级,即
  • 关于51单片机中断

    2018-07-24 20:42:46
    众所周知,51单片机共有5个中断源,从高到低依次为p3.2引脚触发的外部中断0 定时器0触发的中断1 p3.3引脚出发的外部中断1 定时器1触发的中断1 串口数据缓冲器TX/RX中断 下面附上中断系统组成原理图 仔细...
  • 51单片机中断

    2019-08-08 21:46:53
    普中51 单片机中断 51 单片机一定有的5 个中断,序号为各自的中断号,按优先级从高到低排序依次为: 0----INT0:外部中断0;1---T0:定时/计数器0;2---INT1:外部中断1;3---T1:定时/计数器1;4---RXD 和TXD:串行口...
  • 中断装置和中断处理程序统称... 中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统中断系统的应用大大提高了计算机效率。这篇文章我们主要讲解单片机中断
  • 本文主要介绍什么是中断中断的基本概念、中断的处理过程、中断系统的结构和中断系统控制寄存器
  • C51单片机学习笔记(四)——单片机中断系统及应用 文章目录C51单片机学习笔记(四)——单片机中断系统及应用1.单片机中断系统2.中断需要设置的4个寄存器 1.单片机中断系统 中断的概念: CPU在处理某一事件A时...
  • MCS-51单片机概述 MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示...
  • 51单片机中断详解

    千次阅读 多人点赞 2019-06-03 14:37:17
    51单片机中断级别 中断源 默认中断级别 序号(C语言用) INT0---外部中断0 最高 0 T0---定时器/计数器0中断 第2 1 INT1---外部中断1 第3 2 ...
  • STC51单片机中断介绍

    2021-05-22 18:25:01
    关于51单片机的介绍1.1中断应用背景介绍1.2中断寄存器介绍1.中断示例1.1程序设计1.2讲解1.总结与心得 1.关于51单片机的介绍 总体介绍:51单片机是对所有兼容Intel 8051指令系统的单片机的统称。该系列单片机的始祖是...
  • 单片机中断技术概述 在任何一款事件驱动型的CPU里面都应该会有中断系统,因为中断就是为响应某种事件而存在的。中断的灵活应用不仅能够实现想要的功能,而且合理的中断安排可以提高事件执行的效率,因此中断在...
  • 单片机中断系统

    2021-08-29 10:55:31
    前言:中断系统单片机非常重要的组成部分,是为了使单片机能够对外部或者内部随机发生的事件实时处理而设置的。 一:单片机的概念 一个高速主机和一个低俗外设连接时,效率极低,低俗外设工作时无端大量占用CPU...
  • 单片机中断系统51为例)

    千次阅读 2020-04-15 13:15:54
    单片机中断系统概述: 中断是指单片机的CPU在执行程序过程中,外部有一些事件变化,如数据采集结束,电平变化,定时器/计数器溢出等,要求CPU立即处理,这时CPU暂时停止当前的执行程序,转去处理中断请求,处理后,...
  • MCS51单片机中断系统及应用 本章提要本章介绍MCS51单片机重要功能硬件中断系统定时/计数器串行口的工作原理及应用通过本章学习熟悉中断的基本概念掌握中断系统的硬件组成和中断系统的程序结构初始化编程的设计方法...
  • 估计也困扰了许多小伙伴很久,今天以我的角度重新给大家说一下关于51单片机中断。 定义 中断的意思很简单,以一个生活中的例子来说: 我在洗衣服,洗衣服可以认为是一个程序在运行中,这时候突然有人打来电话,...
  • 51单片机 中断与定时器

    千次阅读 2020-06-23 11:45:27
    51单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机的定时器是一样的,只是52比51多了一个定时器/计数器T2,它们的设置都大同小异 定时器T0与T1不同之处在于它们的工作方式3不同,方式0...
  • 文章目录外部中断外部中断的触发外部中断的控制外部中断的处理过程定时/计数器定时/计数器的工作原理定时/计数器的工作方式设置...51单片机中断学习总结 51单片机包含: 2个外部中断(外部中断0,外部中断1) 2...
  • MCS-51单片机概述MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动...
  • 【蓝桥杯单片机07】彻底理解51单片机中断系统广东职业技术学院 欧浩源 在接下来的教程中,将会介绍定时器、串口通信等外设的基本使用,而这些外设的使用都要涉及中断,而且中断是单片机或嵌入式开发中一个相当...
  • 51单片机中断机制(定时器)

    千次阅读 2020-07-10 11:00:27
    单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0 - ...
  • 一个全双工串行通信口·外部数据存储器寻址空间为64kB·外部程序存储器寻址空间为64kB·逻辑操作位寻址功能·双列直插40PinDIP封装·单一 5V电源供电CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊...
  • 【硬见小百科】单片机中断系统 单片机中断系统的概念 什么是中断,我们从一个生活中的例程引入。 你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这...
  • 51单片机——中断

    2020-01-09 14:43:53
    51单片机中断级别 ** D0D3为T0定时/计数器的设置,D4D7为T1定时/计数器的设置 。 GATE :为门控位,GATE=0时,只要在编写程序时,使TCON中的TRO或TR1为1,就可以启动定时器/计数器工作。 GATE=1时,不仅要在编写...
  • 单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,743
精华内容 1,897
关键字:

51单片机中断系统组成