精华内容
下载资源
问答
  • 单片机中断是指CPU在正常执行程序的过程中,由于计算机内部或外部发生了另一...今天要做的一个实验叫做外部中断,按下按键,停止主程序中的内容,立即转去执行中断服务函数。 我们主要看到原理图与代码,了解中断是什...

    内部资源之外部中断

          中断类型                 中断入口地址     中断序号   
          外部中断0(INT0)P3.2      0003H           0
          外部中断1(INT1)P3.3      0013H           2
          定时计数器0(T0) 16bit    000BH           1
          定时计数器1(T1)          001BH           3
          定时计数器2(T2)          002BH           5
          异步串行通信口(UART)      0023H           4
          
    CPU外围模块的掌握方法:
    (1)相关口线
    (2)相关控制字
    (3)模块的工作方式
    一、外部中断
       (1)相关口线
            P3.2:int0,外部中断0输入。分为低电平和下降沿两种可选触发
            P3.3:int1,外部中断1输入。分为低电平和下降沿两种可选触发
       (2)相关控制字
            IE :中断允许控制寄存器
               EA -- ET2 ES ET1 EX1 ET0 EX0      IE=0X85 : EA=1 EX1=1 EX0=1
                 1 0  0  0   0   1   0   1 
               EA:  中断总允许控制位
               ET2:定时中断2允许控制位
               ES: 串行中断控制位
               ET1:定时中断1允许控制位
               ET0:定时中断0允许控制位
               EX0:外部中断0允许控制位
               EX1:外部中断1允许控制位
               当中断控制位为0时禁止中断,为1是允许中断
            IP:中断优先级控制寄存器
               -- -- PT2 PS PT1 PX1 PT0 PX0   PX0=0  PX1=1  IP=0X04;
               PX0:外部中断0优先级控制位
               PX1:外部中断1优先级控制位
               PT0:定时中断0优先级控制位
               PT1:定时中断1优先级控制位
               PT2:定时中断2优先级控制位
               PS:  串行中断优先级控制位
               优先级控制位为0时表示中断优先级为低,
                           为1时表示中断优先级为高,
               中断优先级高的中断源可再次中断中断优先级低的中断源
               同级间不能发生再次中断
            TCON:定时计数器控制寄存器
               TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0       IT0=1 : TCON=0X01
                0   0   0   0  0   0  0   1
               IT0:外部中断0触发方式选择位
                  当IT0=0时,外部中断0为低电平触发中断
                  当IT0=1时,外部中断0为下降沿触发中断,.优先选择
               IE0:外部中断0中断请求标志位
                  当EA&EX0=1时,如果中断外部(P3.2)有信号时,
                  IE0自动置1,当CPU响应中断后自动清零。
    
               IT1:外部中断1触发方式选择位
                  当IT1=0时,外部中断1为低电平触发中断
                  当IT1=1时,外部中断1为下降沿触发中断
               IE1:外部中断1中断请求标志位
                  当EA&EX1=1时,如果中断外部脚(P3.3)有信号时,
                  IE1自动置1,当CPU响应中断后自动清零。
    (3)CPU外围模块的使用方法:
    <1>相关控制字初始化;
    <2>如果模块工作在中断模式,则编写响应中断功能的子程序。
    

    单片机中断是指CPU在正常执行程序的过程中,由于计算机内部或外部发生了另一事件(如定时时间到,超压报警等),请求CPU迅速去处理,CPU暂时停止当前程序的运行,而转去处理所发生的事件。通俗的讲,就是单片机在中断发生时,就立即停止执行正在执行的内容,而去执行中断服务函数。

    今天要做的一个实验,按下按键,停止主程序中的内容,立即转去执行中断服务函数。

    我们主要看到原理图与代码,了解中断是什么,到底是怎么执行的

    打开仿真软件,开始绘制原理图。
    在这里插入图片描述
    我们的目的是按下按键,CPU不在执行主程序,转去执行中断服务函数,我们为了更好的观察,主函数里让灯灭,中断服务函数让灯亮,只要灯亮了,那么就一定执行了中断服务函数。而中断服务函数执行条件就是外部中断引脚INT0或INT1检测到上升沿或者下降沿。(可以通过寄存器设置)

    
    ```c
    #include <reg51.h>
    
    sbit LED = P1^0;// 定义LED就是P1^0
    
    void delayms(unsigned int t) //延时函数
    {
    	unsigned int a,b;
    	for(a=0; a<t; a++)
    	  for(b=0; b<120; b++);
    }
    void main(void)
    {
    	//设置INT0  (设置位寄存器)
    	IT0=1;//跳变沿出发方式(下降沿)
    	EX0=1;//打开INT0的中断允许。	
    	EA=1;//打开总中断	
    	while(1)
    	{
    	    LED = 0;	//注意,主函数是让led灭掉	
    	}
    }
    
    /*外部中断0函数,只有INIT0引脚有下降沿才会触发,并且只会执行一次*/
    /*外部中断0*/
    
    void Int0()	interrupt 0		//外部中断0的中断函数
    {
    		LED = 1;
    		delayms(1000);
    }
    
    
    
    

    在keil里编译,然后烧录到仿真,如果按下按键,灯亮一秒后熄灭,实验成功。不懂的话仔细分析代码与原理图,或者给我留言。
    在这里插入图片描述
    附带生成文件://download.csdn.net/download/mbs520/12168882

    另外,提供给学者一本秘籍:《51精简版教程》

    展开全文
  • 《初学者C51自学笔记》之中断(外部中断0

    万次阅读 多人点赞 2018-08-05 18:06:49
    概念:  CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作...(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时...

    概念:

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

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

    低电平有效:P3.2=0时中断;

    下降沿有效:从高电平跳变为低电平时中断;

    优先级:

    中断源:

    中断源符号

    名称

    中断引起原因

    中断号

    /INT0

    外部中断0

    P3.2引脚低电平或下降沿信号

    0

    T0

    定时器0中断

    定时/计数器0计数回0溢出

    1

    /INT1

    外部中断1

    P3.3引脚低电平或下降沿信号

    2

    T1

    定时器1中断

    定时/计数器1计数回0溢出

    3

    TI/RI

    串行口中断

    串行通信完成一帧数据发送或接收引起中断

    4

    中断响应条件:1、中断源有中断请求;2、此中断源的中断允许位为1;3、CPU开中断(即EA=1)。

    外部中断0程序:

    EA=1;//打开总中断开关

    EX0=1;//开外部中断0

    IT0=0/1;//设置外部中断的触发方式

    void int0 () interrupt 0 using  1
    {
    	
    }

    void:中断是无返回值得;

    int0是命名随便写(只要不是关键词);

    interrupt:表示现在用的是中断函数(必须加上);0 :中断号;

    using:寄存器(可不加);1:哪个寄存器;

     

    #include<reg52.h>
    #define uchar unsigned char 
    #define uint unsigned int 
    
    sbit led0=P0^0;
    
    unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
    unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
    
    //************************************************
    //延时函数,在12MHz的晶振频率下
    //大约50us的延时
    //************************************************
    void delay_50us(uint t)
    {
    	uchar j;
    	for(;t>0;t--)
            for(j=19;j>0;j--);
    }
    
    //************************************************
    //延时函数,在12MHz的晶振频率下
    //大约50ms的延时
    //************************************************
    void delay_50ms(uint t)
    {
    	uint j;
    	for(;t>0;t--)
    	for(j=6245;j>0;j--);
    }
    
    void main()
    {
    	uchar i;
    
    	EA=1;	 //开总中断开关
    	EX0=1;	 //打开外部中断0开关
    	IT0=1;	 //触发方式设置(下降沿)
    
    	while(1)
    	{
    		for(i=0;i<10;i++)
    		{
    		P1=smg_du[i];
    		delay_50ms(10);
    		}
    	}
    } 
    
    void int0 () interrupt 0
    {
    	led0=0;
    	delay_50ms(20);
    	led0=1;
    }

     

    展开全文
  • 8051单片机外部中断编程实例

    千次阅读 2018-04-29 14:15:18
    练习一下对外部中断有关的寄存器的控制,代码如下:;==================================================================== ; Main.asm file generated by New Project wizard ; ; Created: 周日 4月 29 2018 ; ...

    练习一下对外部中断有关的寄存器的控制,代码如下:

    ;====================================================================
    ; Main.asm file generated by New Project wizard
    ;
    ; Created:   周日 4月 29 2018
    ; Processor: AT89C51
    ; Compiler:  ASEM-51 (Proteus)
    ;====================================================================
    
    $NOMOD51
    $INCLUDE (8051.MCU)
    
    ;====================================================================
    ; DEFINITIONS
    ;====================================================================
    
    ;====================================================================
    ; VARIABLES
    ;====================================================================
    
    ;====================================================================
    ; RESET and INTERRUPT VECTORS
    ;====================================================================
    
          ; Reset Vector
          org   0000h
          jmp   Start
    	  org   0003h
    	  ljmp   INT0_
    ;====================================================================
    ; CODE SEGMENT
    ;====================================================================
    
          org   0100h
    Start:	
          ; Write your code here
    		MOV A,#00H
    		MOV SP,#50H
    LOOP1:	
    		MOV TCON,#01H
    		MOV IE,#81H
    		MOV P1,A
    		INC A
    		LCALL DELAY
    		SJMP LOOP1
    INT0_:
    		PUSH ACC
    		MOV B,#3
    LOOP2:
    		MOV P1,#0FFH
    		LCALL DELAY
    		MOV P1,#00H
    		LCALL DELAY
    		DJNZ B,LOOP2
    		POP ACC
    		RETI
    		
    DELAY:
    		MOV R4,#0ffH
    DELAY2:	MOV R3,#0ffH
    DELAY1:
    		NOP
    		NOP
    		DJNZ R3,DELAY1
    		DJNZ R4,DELAY2
    		RET
    Loop:	
          jmp Loop
    
    ;====================================================================
          END

    下面给出仿真设计的电路图。



    编程中注意循环的操作以及现场保护和现场还原,否则在中断服务子程序执行完后,回不到当初的状态。


    展开全文
  • 外部中断 2.1 外部中断0 代码示范 2.2 外部中断 分析 3.计数/定时器中断 3.1 计数/定时器中断0 代码示范 3.2 计数/定时器 分析 3.2.1 计数/定时器的概念 3.2.2 计数/定时器的工作原理 3.2.3 计数/定时器的结构 3.2.4...

    1.中断系统的概念

    1.1中断的概念

    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);

    CPU暂时中断当前的工作,转去处理事件B(中断响应中断服务);

    待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断

    图片来自普中科技

    1.2中断系统的概念

    引起CPU中断的根源,称为中断源

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

    1.3中断系统的优点

    • 解决了快速主机与慢速I/O设备的数据传送问题
    • 分时操作。CPU可以分时为多个I/O设备服务,提高了计算机的利用率;
    • 实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强;
    • 可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。

    1.4我们要说的三种中断源

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

    分别是外部中断0、计数/定时器中断0、外部中断1、计数/定时器中断1、串行通信中断。

    我们以外部中断0、计数/定时器中断0和串口通信中断来说说。

    下面这张图很关键,无论是那个中断都要走这个流程
    在这里插入图片描述

    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溢出中断请求标志位

    IE 中断允许控制寄存器,CPU对 中断系统 所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
    在这里插入图片描述

    • EX0(IE.0),外部中断0允许位;
    • ET0(IE.1),定时/计数器T0中断允许位;
    • EX1(IE.2),外部中断0允许位;
    • ET1(IE.3),定时/计数器T1中断允许位;
    • ES(IE.4),串行口中断允许位;
    • EA (IE.7), CPU中断允许(总允许)位。

    IP 中断优先级控制寄存器
    这个我们一般不改,用缺省值,
    外部中断0 > 计数/定时器中断0 > 外部中断1 > 计数/定时器中断1 > 串行通信中断
    为什么是这样的排序呢?因为在单片机的ROM他们的入口地址也是按照这个顺序排序的。
    在这里插入图片描述

    要记住的是中断号,这在后面很重要
    在这里插入图片描述
    所以如果要有一个中断产生,要符合这样的顺序,以下三条同时满足时,CPU才有可能响应中断。

    在这里插入图片描述

    51单片机的中断优先级有三条原则

    1. CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
    2. 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断
    3. 正在进行的低优先级中断服务,能被高优先级中断请求所中断

    为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

    2.外部中断

    2.1 外部中断0 代码示范

    /* 用外部中断0来控制led灯闪烁 */
    #include<reg51.h>
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit led = P2^0;
    sbit K3 = P3^2;
    
    void delay(u16 i)
    {
    	while(i--);
    }
    
    void Int0Init() //初始化函数,你也可以写在主函数里面
    {
    	IT0 = 1; //TCON寄存器中,IT0是外部中断0 的触发方式控制位,ITO = 1,下降沿有效触发
    	EX0 = 1; //IE寄存器中,外部中断0允许位置1
    	EA = 1;  //IE寄存器中,CPU中断允许总开关
    }
    
    void main()
    {
    	Int0Init();//初始化函数
    	while(1); //在这里等待被外部中断0打断
    }
    
    void Int0() interrupt 0   //外部中断0的中断函数,函数名可以定义,interrupt 后面的中断号不能出错
    {
    	delay(1000);//按键消抖
    	if(K3==0)// k3被按下
    	{
    		led = ~led;
    	} 
    }
    

    2.2 外部中断 分析

    在这里插入图片描述
    可以看到,外部中断是非常符合上面这个中断流程的

    打个比方,我要在床上吹风扇,我自己的电线不够长,我要用我室友的插排。首先我先要和室友请求,室友同意我就插上去了,最后需要室友把总开关打开,我才能吹到风扇。

    3.计数/定时器中断

    3.1 计数/定时器中断0 代码示范

    #include<reg51.h>
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit led = P2^0;
    static u16 i;
    
    void Time0Init() //初始化函数,你也可以写在主函数里面
    {
    	TMOD|=0x01; //工作方式寄存器TMOD 
    	TH0 = 0xFC;  //给寄存器赋值 
    	TL0 = 0x66;
    	TR0 = 1;    //中断请求标志,置位1,启动定时/计数器工作 (控制寄存器TCON) 
    	ET0 = 1;    //计数器中断0允许控制位置1(中断允许寄存器IE) 
    	EA = 1;		//IE寄存器中,CPU中断允许总开关EA置1.
    	
    } 
    
    void main()
    {
    	Time0Init(); //初始化函数
    	while(1)
    	{
    		if(i == 1000)//每1000ms led状态翻转一次
    		{
    			i = 0;
    			led = ~led;
    		}
    	}
    	
    }
    
    void Time0() interrupt 1
    {
    
    	TH0 = 0xFC; //给寄存器赋值
    	TL0 = 0x66;
    	i++;  //每次加1,一次是 1ms
    }
    

    3.2 计数/定时器 分析

    其实根据我们上面的分析,我们只要知道下面这段初始化代码的含义就可以了

    TMOD|=0x01; //工作方式寄存器TMOD 
    TH0 = 0xFC;  //给寄存器赋值 
    TL0 = 0x66;
    

    在这里插入图片描述

    3.2.1 计数/定时器的概念

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

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

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

    3.2.2 计数/定时器的工作原理

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

    可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

    这个原理决定了我们给计数/定时器的16位寄存器赋值的问题。

    3.2.3 计数/定时器的结构

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

    在这里插入图片描述

    TMOD 定时/计数器工作方式寄存器, 低四位用于T0,高四位用于T1.
    在这里插入图片描述
    GATE是门控位, 通常我们让GATE等于0,这样方便一些。

    • GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;

    • GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。

      C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。
      M1M0:工作方式设置位。定时/计数器有四种工作方式。
      在这里插入图片描述

    TIP:主要需要掌握方式1和方式2

    • 方式1一般是我们定时/计数器中断常用的。
    • 方式2一般是我们在串口通信时使用,用来计算频率。

    TCON 定时/计数器控制寄存器
    TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。
    在这里插入图片描述

    • 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和方式2
    方式1
    方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。
    TL0的8位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

    在这里插入图片描述

    在这里插入图片描述
    方式2
    方式2为自动重装初值的8位计数方式。
    计数个数与计数初值的关系为:X=2^8-N
    工作方式2特别适合于用作较精确的脉冲信号发生器。

    3.2.4 计数/定时器初值的设置

    51单片机内部时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ的晶振,那么单片机内部的时钟频率就是12/12MHZ,当你使用12MHZ的外部晶振的时候。

    机器周期=1/1M=1us。而我们定时1ms的初值是多少呢,1ms/1us=1000

    也就是要计数1000个数,初值=65535-1000+1(因为实际上计数器计数到66636才溢出)=64536=FC18H

    我们一般使用定时器工具,比较轻松就可以设置初值了。(需要这个工具的朋友可以在评论区留下邮箱)

    在这里插入图片描述

    3.3 小练笔

    用 定时计数器中断 和 动态八段数码管 做一个两位秒表:https://blog.csdn.net/m0_50679156/article/details/120097808

    4.串行口中断

    4.1串行口中断通信 代码示范

    /*pc连接51单片机,用串口助手发送一个数字会加1返回*/
    #include<reg52.h>
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    void UstartInit()//串口初始化设置 
    {
    	TMOD = 0x20; //确定T1的工作方式(设置GATE,C/T非,M1M0 = 10 方式2 ,高四位用于T1) 
    	TH1 = 0xF4;  //高8位 
    	TL1 = 0xF4;  //低8位 
    	PCON = 0x80; //PCON中只有一位SMOD(最高位)与串行口工作有关 ,SMOD为1是波特率提高一倍 
    	TR1 = 1;     // 启动定时/计数器T1 定时或计数 
    	SCON = 0x50; // 0101 0000 设置串行口工作方式,方式1(10位异步收发器(8位数据)) 
    	ES = 1;     // 串行口中断允许 (IE寄存器)
    	EA = 1;     // CPU 中断总允许位 (IE寄存器)
    }
    
    void main()
    {
    	UstartInit();
    	while(1);
    }
    
    void startInit() interrupt 4
    {
    	u8 ReceiveData;
    	ReceiveData = SBUF;
    	RI = 0; //准备下次接受 
    	SBUF = ReceiveData + 1;
    	while(!TI);
    	TI = 0; //准备下次发送 
    } 
    

    在这里插入图片描述

    4.2串行口中断通信分析

    对于串口通信不是我们这篇博客分析的重点,主要说一下串行口中断

    4.2.1 80C51串行口的结构

    在这里插入图片描述

    有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H
    这个概念很重要,SBUF是像是李信,光信和暗信是一个英雄,但是有不同的技能和外观。

    下面代码中的SBUF,一个是光信,一个是暗信,你懂了么?会心一笑的请点赞。

    void startInit() interrupt 4
    {
    	u8 ReceiveData;
    	ReceiveData = SBUF;
    	RI = 0; //准备下次接受 
    	SBUF = ReceiveData + 1;
    	while(!TI);
    	TI = 0; //准备下次发送 
    } 
    

    接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。

    4.2.2 使用到的新寄存器

    SCON(串行口控制寄存器) 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志

    这个寄存器完全为串行口服务

    在这里插入图片描述

    SM0SM1为工作方式选择位,可选择四种工作方式
    在这里插入图片描述

    • SM2多机通信控制位,主要用于方式2和方式3
      当接收机的SM2=1时可以利用收到RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。
      当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。
      在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
    • REN允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
    • TB8在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。
      在方式0和方式1中,该位未用。
    • RB8在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位在方式1时,若SM2=0,则RB8是接收到的停止位。
    • TI发送中断标志位在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请
    • RI接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请

    PCON 电源控制寄存器,中只有一位SMOD与串行口工作有关

    在这里插入图片描述
    SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。


    我们主要使用方式1来进行串口通信,所以我们就主要讲讲方式1

    方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。

    在这里插入图片描述
    1、方式1输出:
    在这里插入图片描述

    2、方式1输入:

    在这里插入图片描述
    用软件置REN(允许串行接收位)为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。
    接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI(接收中断标志位)=0,且SM2(多机通信控制位)=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI(接收中断标志位)=1,向CPU请求中断。

    4.2.3 波特率的设置

    在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。

    串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

    方式0的波特率 = fosc/12
    方式2的波特率 =(2SMOD/64)· fosc
    方式1的波特率 =(2SMOD/32)·(T1溢出率)
    方式3的波特率 =(2SMOD/32)·(T1溢出率)

    当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1(定时/计数器1运行控制位)=1,以启动定时器)。
    这时溢出率取决于TH1中的计数值。T1 溢出率 = fosc /{ 12×[256 -(TH1)]}
    在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。

    在这里插入图片描述

    4.3串口如何使用

    串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1串行口控制中断控制
    具体步骤如下:

    1. 确定T1的工作方式(编程TMOD寄存器);
    2. 计算T1的初值,装载TH1、TL1;
    3. 启动T1(编程TCON中的TR1位);
    4. 确定串行口控制(编程SCON寄存器);
    5. 串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。

    5.参考资料

    1. 普中科技A2开发板参考资料
    2. 《单片机原理及应用》(第四版)
    3. 《新概念51单片机C语言教程》郭天祥编著
    4. 单片机原理及应用课堂笔记
    展开全文
  • 51单片机外部中断实验报告51单片机外部中断实验实验报告要求:整理本实验涉及的程序,将它们按正确的格式详细书写在实验报告纸上。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000...
  • : ** 代码如下: ** #include<reg52.h> void delay() { int i,j;... for(i=0;... for(j=0;... int i=0;... for(i=0;... TH0=0X3C;... TL0=0XB0;... TR0=1;... while(TF0!... TF0=0;...//闪烁led 外部中断 void flas
  • 外部中断 功能: 八个LED灯D1到D8依次循环点亮,按下按键跳转到中断服务程序,此时8个LED灯全部熄灭,D9闪烁三次,然后返回主程序。 仿真图: 汇编代码: ORG 0000H LJMP START ORG 0003H LJMP INSER ...
  • Proteus仿真:C51中断函数实例

    千次阅读 2021-02-25 15:42:42
    要求外部中断INT0和INT1为低电平触发,相应引脚分别接一按钮,按钮按下接地输入低电平,产生中断信号;定时器/计数器T0和定时器/计数器T1设置为外部计数输入,相应引脚接1khz的方波信号,T0每满2000个脉冲产生1次...
  • Q:c语言编写51单片机中断程序,执行过程是怎样的?例如程序:#includevoid main(void){EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断P0=0xff; //关闭所有P0口的LED灯while(1); //无限...
  • 编程实现:当外部中断0请求中断时发光二极管左移;当外部中断1请求中断时发光二极管闪烁。 电路设计: 软件代码: /***************************************************************************** * ...
  • 外部可屏蔽中断的类型吗为08H,它的中断服务程序的入口地址为1020H:0040H,请用8086汇编语言编程,将该中断的入口地址填入中断向量表中。 方法一 MOV AX,0 MOV ES,AX MOV SI,20H MOV ES:[SI],0040H MOV ES:[SI+2]...
  • 简而言之就是触发某一事件可以使得MCU跳转执行该事件的处理程序,而按键按下或放开(GPIO口电平改变)则可作为一个外部中断,通过编写这一事件的处理程序从而达到改变灯亮灭状态的目的 (这里提到的“事件”并不是...
  • 若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写该中断所需的中断服务程序,并将该中断服务程序的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断...
  • 中断系统的运行必须与中断服务子程序配合才能正确使用。设计中断服务子程序需要首先明确以下几个问题...(3)若是外部中断源,还要设置中断请求的触发方式IT1或IT0,以决定采用电平触发方式还是跳沿触发方式。(4)编写...
  • 这个是板子的原理图,咱们主要关注WK_UP这里,WK_UP通过一个按键连接到PA0,按键按下后会将PA0上拉到VCC。 STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 ...
  • STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 STM32F103五分钟入门系列(三)GPIO的常用库函数使用方法总结+一...
  • 中断处理流程3.1 定时器中断实操3.2 外部中断实操3.3 思考:4. 最重要的事 1. 什么是中断 1.1 中断的概念 中断是指中央处理器CPU正在处理某件事情的时候,外部发生了某一事件(如定时器计时已到),请求...
  • 中断怎么发生,中断处理大概流程 1. 中断概念:  中断是指由于接收到来自外围...硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通...
  • 嵌入式(二十三):中断

    千次阅读 2020-05-29 15:41:11
    在执行程序的过程中,由于某种外界的原因,必须尽快终止当前的程序执行,而去执行相应的处理程序,待处理结束后,在回来继续执行被终止的程序。这种机制——称计算机中断系统 b、计算机系统中传送数据的几种方式: ...
  • 在51单片机的某一IO口上接8只LED,在外部中断0输入P3.2(INT0)引脚接一只按钮开关K1,在外部中断1输入P3,.3(INT1)引脚接一只按钮开关K2。要求K1和K2未按下时,8只LED呈流水灯逐一动态显示【方向自定义】,当K1按下时...
  • 有3个寄存器需要注意 1.EA寄存器:中断的总开关,EA=0则所有中断都不起作用 ...IT0为0:低电平触发,IT0为1:下降沿触发。 另外,外部中断0的引脚是P3.2,入口点地址为:0003H;外部中断1的引脚为P3.3,入口点地址
  • 05计组课后习题:输入输出系统

    千次阅读 2019-11-24 13:27:13
    解:这是一道多重中断,由于磁盘中断的优先权高于打印机,因此应将打印机输出停下来,等磁盘操作结束后,打印机输出才能继续进行。因为打印机的速度比磁盘输入输出的速度慢,并且暂停打印不会造成数据丢失。 ...
  • 现在,我们正式地认识一下中断中断是指微处理器在正常执行程序的过程中,当出现某些意外情况或某种外部设备请求时,暂停正在执行的程序,转而去执行某一个特定的程序,并在执行后返回原来暂停执行的程序继续执行的...
  • uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //数组 char m=99,n=98; //显示初值,m,n的值决定开机显示数值 //**************************************** //延时程序 //**********...
  • STM32应用过程中遇到的问题 实现功能: 1、自动流水灯:在LED1~LED4上实现自动流水灯,流水间隔时间为...//(1)、在新的程序中实现,不涵盖上功能。(2)按键通过中断实现 3、综合流水灯:1)通过按键KEY2实现自动流
  • 并发编程面试(2020最新版)

    万次阅读 多人点赞 2020-03-14 17:28:01
    文章目录基础知识并发编程的优缺点为什么要使用并发编程(并发编程的优点)并发编程有什么缺点并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全?并行和并发有什么区别?什么是多线程,多线程的优劣?...
  • STM32外部中断处理流程及注意事项

    千次阅读 2012-10-09 11:35:04
    STM32的外部中断是以组为单位,例如PA0、PB0、PC0、PD0、PE0、PF0、PG0共用外部中断0,我们再使用时从中选择一个座位外部中断0即可,其他中断类推。 外部中断包括EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI...
  • 单片机定时器中断(LED闪烁)。 编程: #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; void Time() { TMOD=0x01;//00000 0001定时器0工作方式1 TF0=0; TR0=1; TH...
  • 微机原理 接口部分编程题复习

    千次阅读 2020-06-05 16:15:17
    计数器l工作在方式0,对外部事件计数,每计满100个向CPU发出中断请求。试写出8253的初始化程序。 对于计数器0 ,二进制方式计数 MOV DX,0FFF3H ;写控制端口 MOV AL, 00110100B ;写控制字 OUT DX, AL MOV AX, 2000...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,535
精华内容 5,014
关键字:

编程题:外部中断0程序

友情链接: zuoye.zip