精华内容
下载资源
问答
  • 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:串行口...

    普中51 单片机中断

    51 单片机一定有的5 个中断,序号为各自的中断号,按优先级从高到低排序依次为:

    0----INT0:外部中断0;1---T0:定时/计数器0;2---INT1:外部中断1;3---T1:定时/计数器1;4---RXD 和TXD:串行口中断

    IE寄存器:控制中断,IE寄存器有8位,IE={EX0,ET0,EX1,ET1,ES,  ,  ,EA},其中每一位分别控制:

    EX0---INT0(外部中断0);ET0---T0(定时/计数器T0);EX1---INT1(外部中断1);ET1---T1(定时/计数器T1);

    ES---RXD\TXD(串行口中断);空;空;EA---总开关(当EA置1时,其他的才有效)

    TCON寄存器:控制中断方式以及中断标志位,TCON={IT0,IE0,IT1,IE1,TR0,TF0,TR1,TF1},其中每一位分别表示:

    IT0---IT0=0 时为电平触发,IT0=1 时为下降沿触发(一般选用1);eg:IT1同理

    IE0---INT0(外部中断0)中断标志;eg:IE1同理

    TR0---定时/计数器T0控制;eg:TR0同理

    TF0----定时/计数器T0溢出中断标志;eg:TF1同理

    INT0和INT1外部中断:

    工作原理:出现中断信号时,中断标志置1,CPU 执行中断函数。

    外部中断配置:INT0对应P3.2(INT1为P3.3),IT0选择触发方式(一般置1,选择下降沿触发),EX0置1允许CPU识别INT0中断,EA置1中断总开关打开。

    当P3.2 出现中断信号时,中断标志IE0置1,CPU 执行中断函数:void 自定义函数名() interrupt 0(eg:interrupt 是关键字,后面的“0”是中断号)。

    void Int0Init()
    {
        //初始化INT0
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0 的中断允许。
        EA=1;//打开总中断
    }
    
    void Int0() interrupt 0 //INT外部中断0的中断函数
    {
        //中断程序
    }
    
    void main()
    {
        Int0Init(); // INT外部中断0初始化函数
        while(1);
    }

    定时/计数器中断:

    工作原理:首先设置定时/计数器初始值,定时/计数器启动后每来一个脉冲,计数器就自动加1,当加到计数器为全1 时再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU 发出中断请求。

    TMOD寄存器:设置定时/计数器的工作方式,TMOD={M0,M1,C/T,GATE,M0,M1,C/T,GATE},低四位用于T0,高
    四位用于T1:

    GATE---控制定时器的启动是否受外部中断源信号的影响。GATE=0,TR0/TR1 =1时,启动定时/计数器工作;
                 GATA=1,TR0/TR1 =1时,需外部中断引脚INT0/1 也为高电平才能启动定时/计数器工作。

    C/T---0为定时模式;1为计数模式。

    M1/M0---工作方式设置位。定时/计数器有四种工作方式:                                                                                                                               00--方式0--13位定时/计数器,TL0 的低5 位(高3 位未用)和TH0 的8 位组成。                                                                             01--方式1--16位定时/计数器,TL0 的8 位和TH0 的8 位组成。                                                                                                         10--方式2--8位自动重装定时/计数器,TL0 的8 位满了后自动归零溢出。                                                                                         11--方式3--只适用于定时/计数器T0,将T0 分成为两个独立的8 位计数器TL0 和TH0。                                                                   eg:这几种工作方式中应用较多的是方式1 和方式2。定时器中通常使用定时器方式1,串口通信中通常使用方式2。

    定时/计数器中断配置:

    1.对TMOD 赋值,确定T0 和T1 的工作方式。例如:TMOD|=0X01;//选择为定时器0 模式,工作方式1,仅用TR0 打开启动。

    2.设置初值,写入TH0、TL0 或TH1、TL1。例如:定时1ms,机器周期=12/12M=1us,1ms/1us=1000,初值=65535-1000+1=64536=FC18H,所以初值即为THx=0XFC,TLx=0X18。

    3.对IE寄存器赋值,开放定时器。例如:ET0=1,EA=1.

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

    void Timer0Init()//初始化设置定时器
    {
        TMOD|=0X01;//选择为定时器0 模式,工作方式1,仅用TR0 打开启动。
        TH0=0XFC; //给定时器赋初值,定时1ms
        TL0=0X18;
        ET0=1;//打开定时器0 中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器
    }

     

    展开全文
  • 51单片机 中断

    2013-10-30 16:11:20
    一、中断的概念  CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);  CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);... 在51单片机中有5个中断源  中断号 

    一、中断的概念
        CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
        CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
        待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断

     

    二、中断源

        在51单片机中有5个中断源

        中断号          优先级                    中断源                    中断入口地址 

           0               1(最高)             外部中断0                      0003H
           1               2                      定时器0                       000BH

           2               3                     外部中断1                      0013H

           3               4                      定时器1                       0018H

           4               5                      串口总段                      0023H

     

    三、中断寄存器

        单片机有10个寄存器主要与中断程序的书写控制有关

        1.中断允许控制寄存器IE

        2.定时器控制寄存器TCON

        3.串口控制寄存器SCON

        4.中断优先控制寄存器IP

        5.定时器工作方式控制寄存器TMOD

        6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1)

    寄存器详细说明:http://blog.sina.com.cn/s/blog_a05b986d0101545c.html

     

    四、寄存器功能与赋值说明

        注:在用到中断时,必须要开总中断EA,即EA=1。  //开总中断

        1.中断允许控制寄存器IE

        51单片机中断学习

        EX0(EX1):外部中断允许控制位

            EX0=1 外部中断0开关闭合   //开外部0中断
            EX0=0 外部中断0开关断开

        ET0(ET1):定时中断允许控制位

            ET0=1 定时器中断0开关闭合 //开内部中断0

            ET0=0 定时器中断0开关断开
        ES: 串口中断允许控制位     

            ES=1 串口中断开关闭合     //开串口中断

            ES=0 串口中断开关断开

        2.定时器控制寄存器 TCON     //控制外部中断和定时器中断

        51单片机中断学习

        外部中断:

            IE0(IE1):外部中断请求标志位

                当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入

            中断程序后由单片机自动置0.

            //外部中断,即外部中断相应的引脚接入低电平或下降沿信号时,中断开始响应。

            IT0(IT1):外部中断触发方式控制位                   //选择有效信号

                IT0(IT1)=1:脉冲触发方式,下降沿有效。

                IT0(IT1)=0:电平触发方式,低电平有效。

        内部中断:

            TF0(TF1):内部定时器/计数器溢出中断标志位

                当定时器、计数器计数溢出的时候,此位由单片机自动置1,cup开始响应,处理中断,而当进入中

            断程序后由单片机自动置0.

         //内部中断实际上就是利用内部的计数器,只不过提供计数的脉冲来自单片机自身。

            TRO(TR1):定时器/计数器启动位                    //启动定时器

            TRO(TR1)=1; 启动定时器/计数器0

            TR0(TR1)=0; 关闭定时器/计数器0

         3.串口控制寄存器SCON

         51单片机中断学习

         TI:串行口发送中断标志位

              当单片机串口发送完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的,

         必须由用户在中断服务中用软件清0.

         RI:串行口接收中断标志位

              当单片机串口接收完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的,

        必须由用户在中断服务软件中用软件清0.

         (IP以后补上,TMOD,TL0/TH0 在定时器/计数器中讲)

     

    五、中断结构图:

        51单片机中断学习

     

    六、定时器/计数器

        1.计数的定义:

            计数是指对外部事件进行计数,外部事件的发生以输入脉冲的形式表示,因此计数功能的实质就是对外来

        的脉冲进行计数,在单片机中对应引脚T0和T1,两个脉冲输入端。

            外部输入的脉冲在负跳变时有效(即外部脉冲由1变化到0),计数器加1.

        2.定时器:

            定时器是通过计数器的计数来实现的,不过此时的计数脉冲来自单片机的内部,因此定时器的实质是对内

        部脉冲的计数,在单片机中,每个机器周期产生一次计数脉冲,计数器加1.

        3.工作方式控制寄存器TMOD:

            51单片机中断学习

            TMOD的低半字节(D0,D1,D2,D3)用来控制定时器/计数器0

            TMOD的高半字节(D4,D5,D6,D7)用来控制定时器/计数器1

            对TMOD中的内容说明:

            GATE——门控制。   
              GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。   
                 当INT0引脚为高电平时TR0置位,启动定时器T0;   
                 当INT1引脚为高电平时TR1置位,启动定时器T1。   
              GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。

            C/T——功能选择位   
               C/T=0时为定时功能,C/T=1时为计数功能。     
            M0、M1——方式选择功能   
            由于有2位,因此有4种工作方式 

            51单片机中断学习
       

      4.根据单片机晶振,所选TMOD的的工作方式,所要定的时间,来确定THO和TLO所要赋予的初值

        (以12M晶振,工作方式1,16位计数器为例,设所定时间为Xus(16为计数器最大数65536,即65536us,若所

          定时间大于65535,则要用if语句控制,现假设X<65535))

         1.时钟周期的时间t=1/12M=1/12 us

         2.机器周期的时间T=12*1/12=1 us

         3.因为每经过一个机器周期计数器+1,所以,计数器+1,经过的时间为 1 us。

         若所定时间为X,则要求经过Xus,中断响应,又因为16为计数器要全部置1(即达到65535)+1后,中断才会

         响应,所以,初值=(65536-X)

         4.将初值转化为16进制码,分别付给THO和TLO

         eg:所定时间5ms

             初值=(65536-5000)=60536=EC78

             TH0=0XEC; TL0=0X78;

         (当工作方式不同时,TH0/TL0的赋值也不同,个人觉得有了16位计数器了,其余的没什么用,不介绍了)

      5.写程序时另一种THO/TLO赋值方法

         TH0=(65536-20000)/256;     
         TL0=(65536-20000)%6;

         这样设置,每经过20ms,发生一次中断,中断时间一般以秒为单位,所以经过n次中断即可。

    展开全文
  • 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 外部中断0 IE0 低电平或下降沿信号 0 最高
    T0 定时器中断0 TF0 定时/计数器0 计数回0溢出 1
    /INT1 外部中断1 IE1 定电平或下降沿信号 2
    T1 定时器中断1 TF1 定时/计数器1 计数回0溢出 3
    TX/RX 串行口中断 TI/RI 串行通信完成一帧数据发送或接收 4 最低
    定时器/计数器控制寄存器 TCON
    D7 D6 D5 D4 D3 D2 D1 D0
    功能 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

    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
    D7 D6 D5 D4 D3 D2 D1 D0
    功能 EA —— —— ES ET1 EX1 ET0 EX0

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

    中断优先寄存器 IP
    D7 D6 D5 D4 D3 D2 D1 D0
    功能 —— —— —— PS PT1 PX1 PT0 PX0

    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;
    如下表:

    D7 D6 D5 D4 D3 D2 D1 D0
    功能 —— —— —— 1 0 0 0 0

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

    工作方式寄存器TMOD
    D7 D6 D5 D4 D3 D2 D1 D0
    功能 GATE C/T M1 M0 GATE C/T M1 M0

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

    M1 M0 工作方式
    0 0 方式0:为13位定时/计数器
    0 1 方式1:为16位定时/计数器
    1 0 方式2:为8位初值自动重装定时/计数器
    1 1 方式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单片机中断函数注意事项。
  • 80C51单片机 中断系统及其应用;3.3.1 80C51单片机中断系统;3.3.1 80C51单片机中断系统; 80C51单片机有5个中断源2个中断优先级它的中断处理程序可实现两级嵌套有较强的中断处理能力 单片机对中断系统的管理是通过...
  • 51单片机中断系统

    万次阅读 多人点赞 2018-12-11 20:04:08
    中断定义  CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续...

    中断定义

      CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。

      

     

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

      

     

      89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。

       

      1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。

      2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。

       3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。

       4、TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。

      5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

     

    中断允许控制

      CPU对中断系统的所有中断以及某个中断源的开发和屏蔽是由中断允许寄存器IE控制的。

      

    EA:中断允许总开关控制位。(1:所有中断请求被允许;0:所有中断请求被屏蔽)

    ES:串行口中断允许控制位。(1:允许串口中断;0:禁止串口中断)

    ET1:定时器/计数器T1的溢出中断允许控制位。(1:允许T1溢出中断;0:禁止T1溢出中断)

    EX1:外部中断1中断允许位。(1:允许外部中断1中断;0:禁止外部中断1中断)

    ET0:定时器/计数器T0的溢出中断允许控制位。(1:允许T1溢出中断;0:禁止T1溢出中断)

    EX0:外部中断0中断允许位。(1:允许外部中断1中断;0:禁止外部中断1中断)

     

    中断请求标志 

      TCON 的中断标志

      

      IT0(TCON.0),外部中断0触发方式控制位。

        当IT0=0时,为低电平触发方式。

        当IT0=1时,为边沿触发方式(下降沿有效)。

      IE0(TCON.1),外部中断0中断请求标志位。

      IT1(TCON.2),外部中断1触发方式控制位。

      IE1(TCON.3),外部中断1中断请求标志位。

      TF0(TCON.5),定时/计数器T0溢出中断请求标志位。

      TF1(TCON.7),定时/计数器T1溢出中断请求标志位。

     

     中断优先级

       

     

    中断源

         

     

    中断响应条件

      中断源有中断请求

      此中断源的中断允许位为1

      CPU开中断(EA=1)

     

    使用中断,需要做什么?

      你想使用的中断是哪个?选择响应的终端号。

      你所希望的触发条件是什么?

      你希望在中断之后干什么?

     

     以外部中断0为例

    主程序中需要有以下代码:

    EA=1;//打开总中断开关
    EX0=1;//开外部中断0
    IT0=0/1;//设置外部中断的触发方式

    中断服务函数:

    void int0 () interrupt 0 using 1  // using 1 不用写也不用管
    
    {
      do anything that you want
    }

     

    展开全文
  • 51单片机中断响应

    2020-11-26 17:17:44
    51单片机中断响应 每条指令结束后,都自动检测是否有中断请求,如果有,且允许中断,则响应中断。 硬件把优先级状态标志置1 硬件把PC入栈 硬件清楚中断请求标志 如果需要,软件保护现场(寄存器内容入栈) 硬件调用...
  • 51单片机中断详解

    千次阅读 2019-06-03 14:37:17
    51单片机中断级别 中断源 默认中断级别 序号(C语言用) INT0---外部中断0 最高 0 T0---定时器/计数器0中断 第2 1 INT1---外部中断1 第3 2 ...
  • 本文主要介绍了关于MCS-51单片机中断函数的几点注意事项,希望对你的学习有所帮助。
  • 51单片机中断配置

    2019-11-07 17:52:06
    51单片机中断配置 1.interrupt标号: interrupt0:外部中断0 interrupt1:定时器0 interrupt2:外部中断1 interrupt3:定时器1 interrupt4:串口 interrupt5:定时器2 2.寄存器配置 参考郭天祥P65页 2.1...
  • 51单片机中断问题

    2019-11-18 15:07:24
    51单片机中断使用注意事项 1.例如: 同时使用外部中断0和串口中断的时候,如果没有用到串口中断,一定要将串口中断ES置0,不然当你执行一次外部中断,然后再用串口发送数据(并没有用到串口中断服务程序),就会一直...
  •  51单片机中断优先级的设置方法解析  PX0(IP.0),外部中断0优先级设定位;  PT0(IP.1),定时/计数器T0优先级设定位;  PX1(IP.2),外部中断0优先级设定位;  PT1(IP.3),定时/计数器T1优先级设定位...
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • 第5章 AT89C51单片机中断系统 ;教学目标;5.1 中断概述;2为什么要设中断; 3中断源及其优先级; 4. 中断源的管理;5.2 AT89C51中断系统的结构;5.2.1 中断源及中断系统构成 ; 5.2.2 中断标志与中断控制;表5.1 TCON的结构...
  • C51 单片机中断函数的定义及应用 C51 函数声明对 ANSI C 作了扩展具体包括 1.中断函数声明 中断声明方法如下 void serial_ISR interrupt 4 using 1 { /* ISR */ } 为提高代码的容错能力在没用到的中断入口处生成 ...
  • 51单片机中断学习

    2016-05-09 11:14:56
    51单片机中断学习   (2012-04-12 19:36:39) 标签:  单片机中断 分类: 51mcu 本文转载自http://blog.sina.com.cn/s/blog_a05b986d010152h3.html 一、中断的概念  CPU在处理某一事件A时,发生...
  • 51单片机中断系统实验 一、实验内容 INT0端接单次脉冲发生器。按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转。 根据实验内容编写一个程序,并在实验系统上调试和验证。 二、仿真...

空空如也

空空如也

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

51单片机中断