精华内容
下载资源
问答
  • 单片机中断方式与轮询方式 单片机中断方式与轮询方式
  • 单片机中断技术的应用设计——中断方式控制单片机输入输出
  • 中断方式单片机交通信号灯系统
  • xmodem C语言,单片机 串口中断方式接收,使用SecureCRT,Tera Term等工具已通过
  • 本文介绍了51单片机外部中断触发方式
  • 中断的概念:中断是计算机独有的一种工作方式;在主程序执行的过程中,中断主程序的执行;在执行子程序的过程中,中断子程序的执行。中断程序主要是为某些特定控制功能而设定。与子程序不同,中断是随机发生且必须...
    fc1e93be3f607fd2c19bb177879eeade.png中断的概念:中断是计算机独有的一种工作方式;在主程序执行的过程中,中断主程序的执行;在执行子程序的过程中,中断子程序的执行。中断程序主要是为某些特定控制功能而设定。与子程序不同,中断是随机发生且必须立即响应的。需要执行中断程序必须要有中断源(引发中断的信号)每个中断信号都有一个编号加以识别,也就是我们说的中断事件号      在200SMART系列PLC中共有三大类中断事件,分别是:I/O中断:I/O 中断包括上升/下降沿中断、高速计数器中断和脉冲串输出中断。CPU 可以为输入通道 I0.0、I0.1、I0.2 和 I0.3(以及带有可选数字量输入信号板的标准 CPU 的输入通道 I7.0 和 I7.1)生成输入上升和/或下降沿中断。可对这些输入点中的每一个捕捉上升沿和下降沿事件。这些上升沿/下降沿事件可用于指示在事件发生时必须立即处理的状况。      高速计数器中断可以对下列情况做出响应:当前值达到预设值,与轴旋转方向反向相对应的计数方向发生改变或计数器外部复位。这些高速计数器事件均可触发实时执行的操作,以响应在可编程逻辑控制器扫描速度下无法控制的高速事件。    脉冲串输出中断在指定的脉冲数完成输出时立即进行响应。脉冲串输出的典型应用为步进电机控制。     通信中断:CPU 的串行通信端口可通过程序进行控制。通信端口的这种操作模式称为自由端口模式。在自由端口模式下,程序定义波特率、每个字符的位数、奇偶校验和协议。接收和发送中断可简化程序控制的通信

          时基中断:基于时间的中断包括定时中断和定时器 T32/T96 中断。可使用定时中断指定循环执行的操作。循环时间位于 1 ms 到 255 ms 之间,按增量为 1 ms 进行设置。必须在定时中断 0 的 SMB34 和定时中断 1 的 SMB35 中写入循环时间。 

        每次定时器到时时,定时中断事件都会将控制权传递给相应的中断程序。通常,可以使用定时中断来控制模拟量输入的采样或定期执行 PID 回路。      将中断程序连接到定时中断事件时,启用定时中断并且开始定时。连接期间,系统捕捉周期时间值,因此 SMB34 和 SMB35 的后续变化不会影响周期时间。要更改周期时间,必须修改周期时间值,然后将中断例程序重新连接到定时中断事件。重新连接时,定时中断功能会清除先前连接的所有累计时间,并开始用新值计时。      定时中断启用后,将连续运行,每个连续时间间隔后,会执行连接的中断程序。如果退出 RUN 模式或分离定时中断,定时中断将禁用。如果执行了全局 DISI(中断禁止)指令,定时中断会继续出现,但是尚未处理所连接的中断程序。每次定时中断出现均排队等候,直至中断启用或队列已满。       使用定时器 T32/T96 中断可及时响应指定时间间隔的结束。仅 1 ms 分辨率的接通延时 (TON) 和断开延时 (TOF) 定时器 T32 和 T96 支持此类中断。否则 T32 和 T96 正常工作。启用中断后,如果在 CPU 中执行正常的 1 ms 定时器更新期间,激活定时器的当前值等于预设时间值,将执行连接的中断程序。可通过将中断程序连接到 T32(事件 21)和 T96(事件 22)中断事件来启用这些中断。       当多个中断同时发生请求时,CPU对中断响应有优先顺序,从高到低的中断顺序分别是通信中断、I/O中断及最低的时基中断。      需要注意的是,当比如在执行I/O中断时,通信中断又产生了,此时不会马上去执行通信中断,而是执行完正在执行的I/O中断后再执行通信中断。而如果同时产生的话就是按优先顺序执行了下表为不同的中断事件号对应的中断事件:

    事件

    说明

    CR20s
    CR30s
    CR40s
    CR60s

    SR20/ST20
     SR30/ST30
     SR40/ST40
     SR60/ST60

    0

    I0.0 上升沿

    Y

           Y

    1

    I0.0 下降沿

    Y

            Y

    2

    I0.1 上升沿

    Y

            Y

    3

    I0.1 下降沿

    Y

             Y

    4

    I0.2 上升沿

    Y

            Y

    5

    I0.2 下降沿

    Y

             Y

    6

    I0.3 上升沿

    Y

    Y

    7

    I0.3 下降沿

    Y

    Y

    8

    端口 0 接收字符

    Y

    Y

    9

    端口 0 发送完成

    Y

    Y

    10

    定时中断 0(SMB34 控制时间间隔)

    Y

    Y

    11

    定时中断 1(SMB35 控制时间间隔)

    Y

    Y

    12

    HSC0 CV=PV(当前值 = 预设值)

    Y

    Y

    13

    HSC1 CV=PV(当前值 = 预设值)

    Y

    Y

    14-15

    保留

    N

    N

    16

    HSC2 CV=PV(当前值 = 预设值)

    Y

    Y

    17

    HSC2 方向改变

    Y

    Y

    18

    HSC2 外部复位

    Y

    Y

    19

    PTO0 脉冲计数完成

    N

    Y

    20

    PTO1 脉冲计数完成

    N

    Y

    21

    定时器 T32 CT=PT(当前时间 = 预设时间)

    Y

    Y

    22

    定时器 T96 CT=PT(当前时间 = 预设时间)

    Y

    Y

    23

    端口 0 接收消息完成

    Y

    Y

    24

    端口 1 接收消息完成

    N

    Y

    25

    端口 1 接收字符

    N

    Y

    26

    端口 1 发送完成

    N

    Y

    27

    HSC0 方向改变

    Y

    Y

    28

    HSC0 外部复位

    Y

    Y

    29

    HSC4 CV=PV

    N

    Y

    30

    HSC4 方向改变

    N

    Y

    31

    HSC4 外部复位

    N

    Y

    32

    HSC3 CV=PV(当前值 = 预设值)

    Y

    Y

    33

    HSC5 CV=PV

    N

    Y

    34

    PTO2 脉冲计数完成

    N

    Y

    35

    I7.0 上升沿(信号板)

    N

    Y

    36

    I7.0 下降沿(信号板)

    N

    Y

    37

    I7.1 上升沿(信号板)

    N

    Y

    38

    I7.1 下降沿(信号板)

    N

    Y

    43

    HSC5 方向改变

    N

    Y

    44

    HSC5 外部复位

    N

    Y

        N表示无   Y表示有   红色部分表示常用中断事件号中断指令ATCH:中断连接,连接某中断事件所要调用的程序段。ENI:全局允许中断,开放中断处理功能。DISI:全局禁止中断,禁止处理中断服务程序,但中断事件仍然会排队等候。DTCH:中断分离,将中断事件号与中断服务程序之间的关联切断,并禁止该中断事件。RETI:条件中断返回,根据逻辑操作的条件,从中断服务程序中返回。CLR_EVNT:清空中断队列。

    b1b54e18fde4314a27f539f2dee6e067.png

    ATCH表示中断连接指令,用于中断事件号和中断程序进行连接INT管脚表示连接具体的中断程序EVNT表示中断事件号ENI为允许中断指令。CPU在RUN模式下时是禁止中断功能的,在使用中断程序前必须使用允许开中断指令中断分离指令DTCH

    6ac28756c78aeb6c1a25bff1069a94ff.png

           中断分离指令解除中断事件 EVNT 与所有中断例程的关联,并禁用中断事件,需要再次激活中断程序时,则需再次激活允许中断连接中断返回 RETI

    4092f86382e6288e1a32beeda925d064.png

         中断有条件返回指令可用于根据前面的程序逻辑的条件从中断返回,不再执行后面的程序段,在中断程序中使用  中断禁止指令 DISI    

    271af88e47cb6493d01505081086d83c.png

           当指令执行后禁止所有中断,即便发生中断事件也不会执行中断程序;需重新开启允许中断后才可再次使用中断功能。中断禁止和中断分离有一定的区别,中断分离是断开某个中断事件而中断禁止是断开整个中断程序

    清除中断事件指令 CLR_EVNT      从中断队列中移除所有类型为 EVNT 的中断事件。使用该指令可将不需要的中断事件从中断队列中清除。如果该指令用于清除假中断事件,则应在从队列中清除事件之前分离事件。否则,在执行清除事件指令后,将向队列中添加新事件。中断程序使用的过程中应需要注意以下几点:1、中断程序应短小而简单,执行时对其他处理越短越好2、200SMART 最多使用128个中断程序,中断程序不能嵌套3、中断程序执行后会自动返回,也可在中途由逻辑控制使用中断返回指令返回4、中断程序只需要和中断事件连接一次(使用沿脉冲或SM0.1 );多个中断事件可以连接一个中断服务程序;一个中断事件只能连接一个中断程序

    5、中断程序不能通过条件调用,只有由用户程序把中断程序名称和中断事件联系起来,并且需要允许中断后才能进入等待中断并随时执行的状态

    推荐阅读

    1. 这篇推送是教你认识三菱变频器和故障处理的

    2. 步进或伺服运动控制偏位问题:现象、原因及解决办法

    3. 西门子的博途S7-1200/1500 TIA Portal编程软件如何优雅的进行不同版本之间的切换

    4. PLC编程实例最基础的30个,你还学不会???

    5. 什么是EtherCAT总线通讯????

    7d6b772725777918282e696635a4da4a.png

    展开全文
  • 文章51单片机的外部中断触发方式进行了介绍。
  • 在B站跟个up主中断教程, ...page=4&keyword=&...如上图所示51单片机总共有5个中断源,本博文先展示第一种 INT0 中断 先看电路图 按键 P3^2 可以处罚中断源 INT0 贴上代码: 中断函数的定义 #includ

    51单片机具有5个中断源,其中有两个外部中断,这次我们以下降沿触发Int0为例。
    在B站跟个up主中断教程,
    传送门 https://space.bilibili.com/483942191/video?tid=0&page=4&keyword=&order=pubdate
    实验目的:用独立按键作为外部中断的触发信号,当按键按下发送来信号的时候,再执行中断函数(在函数内定义LED灯的亮灭)
    在这里插入图片描述

    如上图所示51单片机总共有5个中断源,本博文先展示第一种 INT0 中断

    先看电路图
    在这里插入图片描述
    在这里插入图片描述
    按键 P3^2 可以触发中断源 INT0

    设置寄存器,打开终端并选择中断的触发方式。
    EA为整体中断允许位,首先要将EA置1,打开中断。
    EX0为外部中断INT0,置1开启。
    IT0寄存器:置0为低电平触发,置1为下降沿触发。

    编写中断函数,int0的中断编号为0,这里使用中断控制led的点亮与熄灭。
    中断函数格式一般为:
    void 函数名称(void) interrupt 中断编号 【using 寄存器组编号】{
    语句;
    }

    贴上代码:
    中断函数的定义

    #include"pbdata.h"
    
    //外部中断初始化
    void EX0_Init(void)
    {
      //设置触发方式 外部中断0
    	IT0=1;  //设置下降沿触发TCON 硬件可自动清零触发信号
     	EX0=1; //IE
    	EA=1;
    }
    
    
    /**********************************************************
    1、中断服务函数一定是一个没有返回值的函数
    2、中断服务函数一定是个没有参数的函数
    3、中断服务函数函数名后跟关键字 interrupt
    4、interrupt n的取值从0~4 分别代表5个中断源 计算公式为 8*n +0003H
       分别为 0 0003H INT0
              1 000BH T0
    		  2 0013H INT1
    		  3 001BH T1
    		  4 0023H ES
    5、中断服务函数不能被主程序或其他程序调用
    6、n 后面跟 using m (0-3)工作寄存器组
    ***********************************************************/
    
    void EX0_ISR(void) interrupt 0
    {
    	LED_1=~LED_1;
    }
    
    

    上面注释很重要,记得看注释!

    中断函数在main函数中的初始化与使用

    void main()
    {
    	EX0_Init();  //在while函数外部初始化一次即可
    	while(1)   以下程序中,定义了没调用会有1个warning
    	{
    		
    	}
    }
    
    展开全文
  • 单片机原理及接口技术 利用中断方式实现灯的闪烁(单片机钟最经典的案例)
  • 本文主要介绍了51单片机是如何产生中断的。
  • 1、中断请求标志(1)TCON的中断标志IT0(TCON.0),外部中断0触发方式控制位。当IT0=0时,为电平触发方式。当IT0=1时,为边沿触发方式(下降沿有效)。IE0(TCON.1),外部中断0中断请求标志位。IT1(TCON.2),外部中断1触发...

    1、中断请求标志

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

    fc5319b1a60e5977a06d1be9e94c6352.png

    (2)SCON的中断标志

    RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。

    TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。   

    d8e741856458d674301ea44b848e2b80.png

    2、80C51中断的控制    

    (1)中断允许控制

            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中断允许(总允许)位。

    b0d6a5cbc8943344cdb3e4cdb5d0543b.png

    (2)中断优先级控制

            80C51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。

    PX0(IP.0),外部中断0优先级设定位;

    PT0(IP.1),定时/计数器T0优先级设定位;

    PX1(IP.2),外部中断0优先级设定位;

    PT1(IP.3),定时/计数器T1优先级设定位;

    PS  (IP.4),串行口优先级设定位;

    PT2 (IP.5)    ,定时/计数器T2优先级设定位。

    42dc2890c23e1a26679888ef45bc9254.png

    同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:

    9247e61a7bb4145d3dcf7993a18a2b66.png

    3、80C51单片机的中断优先级原则

    (1)CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。

    (2)正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。

    (3)正在进行的低优先级中断服务,能被高优先级中断请求所中断。

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

    4、中断响应条件和时间 

    中断响应条件§中断源有中断请求;§此中断源的中断允许位为1;§CPU开中断(即EA=1)。以上三条同时满足时,CPU才有可能响应中断。
    展开全文
  • 433遥控器无线解码 1527中断方式解码 51单片机 这版为1527遥控器解码,是为了项目洗臀器做遥控器控制。1527遥控器原理如下。 码分别为:同步码 地址码20位 键码4位(也可以同步码16位 键码八位) 本方法的核心思想先...

    433遥控器无线解码 1527中断方式解码 51单片机

    这版为1527遥控器解码,是为了项目洗臀器做遥控器控制。1527遥控器原理如下。

    码分别为:同步码 地址码20位 键码4位(也可以同步码16位 键码八位)
    本方法的核心思想先判断同步码是否接收成功,如果接收成功开始接收后面的24位数据并且存入三个字节当中,最后一个字节的后四位就是键码,然后通过键码的不同确定不同的功能。

    本实验所使用遥控器,因为遥控器发出波形时间会有误差,所以下面都是大概值 程序中也会以范围方式判断。
    每桢码间隔时间为12MS (即同步码)
    同步码:0.4MS+12MS
    0:0.4MS+1.2MS 为0
    1:1.2MS+0.4MS 为1
    以下就是这次的代码了

    #include <stc15.h>
    #include <intrins.h>
    
    #define uchar unsigned char 
    #define uint  unsigned int
    
    
    sbit RF		   	=	P0^5;	   //信号输入
    sbit LED		=	P3^4;	   //
    						  					
    sbit D0			=	P3^6;	  //用于后面按位取键值
    sbit D1			=	P3^7;
    sbit D2			=	P4^1;
    sbit D3			=	P4^2;
    sbit VT			=	P3^5;     //解码成功
    
    
    
    bit  decode_ok;		 //解码成功标志
    uchar  hh_w,ll_w;           //高低电平宽度
    uchar  ma_x;                //接收到第几位编码
    uchar  bma1,bma2,bma3,bma4; //四个字节存放编码   第一次的
    uchar idata mmb1,mmb2,mmb3,mmb4; // 存放编码  第二次  当两次一样才算一次有效按键
    
    bit rf_ok1,rf_ok2;		 //临时成功接收标志  分别第一次和第二次
    bit rf_ok;               //接收成功 可以解码
    bit old_rc5;             //接收到24为码可以开始解码
    bit tb_ok;               //同步码接收成功标志
    
    uchar  mma1,mma2,mma3,mma4; //四个字节用来存放编码
    uchar temp_h;temp_l;
    bit bt_auto;     //自动设置遥控接收波特率标志 根据码不同的长度做不同的波特率
    uint s,s1;用于系统延迟 分别为留时间做第二次解码 和 留时间实现功能  目的保证系统稳定性
    
    
    void timeint() interrupt 1    //定时器中断
       {   	
    
    	  if(!bt_auto)	  //
    		   {
    		   	 	TL0=0x70;             //   90
    				TH0=0xfB;				//fc     定时器100us
    		else
    			{
    				TL0=temp_l;             // 
    				TH0=temp_h;			
    			}
    
    	  TF0=0;                // 
               
          if (!RF)
           { ll_w++;old_rc5=0; }           //接收到低电平
          	else                                      // 接收到高电平
           	{ hh_w++;
             if (!old_rc5)                          // 检测到从低到高的跳变  表示接收到一个完整的(高-低)电平周期
              { if (((hh_w>=2)&&(hh_w<=8))&&((ll_w>=50)&&(ll_w<=190)))          // 满足同步码时长   H:0.4ms L:12ms
                 { 
    				if((ll_w>=110)&&(ll_w<=140)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=0;}	 //根据更精确的时长确定波特率和后面的定时器长度 保证精确
    			 	  else
    					{  
    					  if((ll_w>140)&&(ll_w<=160))
    					  	{ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x6b; }				  
    					   else
    						 {  
    						  if((ll_w>160)&&(ll_w<=190))
    						  	{ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0xdc; }
    							else
    								{					  
    								  if((ll_w>70)&&(ll_w<=90))
    								  	{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x30; }
    									else
    										{
    										  if((ll_w>90)&&(ll_w<=110))
    								  			{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x00; }
    											else
    											  {
    												 if((ll_w>=50)&&(ll_w<=70))
    								  					{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x7a; }									
    											  }
    										}
    								}							  
    						 }
    					  }			
                 }
                else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=14))) 	//  已经接收到同步码  且下一个电平周期的低电平时长满足H:0.4ms L:1.2ms 判0 
    				{ 	
    					ma_x++;			//取编码的数量  达到24表示接收到一个完整的码
    					if(ma_x>23)
    						{
    						   if(!rf_ok1)第一次接收到
    						  	{
    							  mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的码放入解码寄存器    (第一次解码的寄存器)                       
                                  rf_ok1=1;                                // 可以解码
                                  tb_ok=0;
    							  bt_auto=0;
    							  s=1500;								
    							}
    							else  //第二次接收到
    								{
    								  mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的码放入解码寄存器 (第二次解码的寄存器)                                           
                                      rf_ok2=1;                                //可以解码
                                      tb_ok=0;
    								  bt_auto=0;																			
    								}
    						}
    				 }  
                else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=8)))  		 // 已经接收到同步码  且下一个电平周期的低电平时长满足H:1.2ms L:0.4ms 判1     
                      { switch (ma_x)  //判1   所以按位或等于取1
                         { 
    					   case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第一位
                           case 1 : { bma1=bma1 | 0x40; break; }
                           case 2 : { bma1=bma1 | 0x20; break; }
                           case 3 : { bma1=bma1 | 0x10; break; }
                           case 4 : { bma1=bma1 | 0x08; break; }
                           case 5 : { bma1=bma1 | 0x04; break; }
                           case 6 : { bma1=bma1 | 0x02; break; }
                           case 7 : { bma1=bma1 | 0x01; break; }
                           case 8 : { bma2=bma2 | 0x80; break; }
                           case 9 : { bma2=bma2 | 0x40; break; }
                           case 10: { bma2=bma2 | 0x20; break; }
                           case 11: { bma2=bma2 | 0x10; break; }
                           case 12: { bma2=bma2 | 0x08; break; }
                           case 13: { bma2=bma2 | 0x04; break; }
                           case 14: { bma2=bma2 | 0x02; break; }
                           case 15: { bma2=bma2 | 0x01; break; }
                           case 16: { bma3=bma3 | 0x80; break; }
                           case 17: { bma3=bma3 | 0x40; break; }
                           case 18: { bma3=bma3 | 0x20; break; }
                           case 19: { bma3=bma3 | 0x10; break; }
                           case 20: { bma4=bma4 | 0x80; break; }//°´¼ü״̬µÚ1λ
                           case 21: { bma4=bma4 | 0x40; break; }
                           case 22: { bma4=bma4 | 0x20; break; }
                           case 23: { bma4=bma4 | 0x10;
    					   if(!rf_ok1)
    								  	{								  mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到寄存器中  前面是最后一个键值为0  这里是最后一个键值为1        (为1的第一次用于解码的寄存器)                  
    	                                  rf_ok1=1;                                // 可以解码
    	                                  tb_ok=0;
    									  bt_auto=0;
    									  s=1500;
    									  break;									
    									}
    									else
    										{
    										  mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的编码复制到寄存器中  前面是最后一个键值为0  这里是最后一个键值为1      (为1的第二次用于解码的寄存器)
    		                                  rf_ok2=1;                                // 可以解码
    		                                  tb_ok=0;
    										  bt_auto=0;
    										  break;																			
    										} 
                                       
                                    }
                         } 
                        ma_x++;
    					
                      }
                else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; bma4=0;hh_w=1;ll_w=0;}      //没有接收到同步码
        	   ll_w=0;hh_w=1; 
      			 }          
             old_rc5=1;      // 记录本次电平
           }
    	if(rf_ok1)		//成功接收两次编码有效
    		{
    			s--;
    			if(!s) rf_ok1=0;
    			if(rf_ok2) 
    				{
    				  if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3)&&(mma4==mmb4))//两次编码相等  为有效
    				  	 {
    					  rf_ok=1;   //解码有效 接收成功的标志
    					  rf_ok1=0;
    					  rf_ok2=0;					 
    					 }
    					 else
    					   {
    						  rf_ok=0;
    						  rf_ok1=0;
    						  rf_ok2=0;			 
    					   }		  				
    				}					
    		}
        if((rf_ok))		 //解码有效  接收成功
    			{  	
    				EA=0;
    				rf_ok=0;											
    				D3=mma4 & 0x80;    //取出键码
    				D2=mma4 & 0x40;
    				D1=mma4 & 0x20;
    				D0=mma4 & 0x10;
    //				D4=mma4 & 0xC0;
    				decode_ok=1;
    				VT=0;		
    				s1=1500;
    				EA=1;
    			}
    
    
       if(decode_ok)   //接收成功标志
    	  	{
    			s1--;
    			if(!s1)
    				{
    					VT=1;//接收成功亮灯
    					decode_ok=0;//接收成功标志位置零 用于下一次
    				}				  
    	  	}
       }
    
    void system_start()   //系统初始化		
     	AUXR=0xb5;   	
    	P0M0=0x01;
    	P0M1=0x20;
    	P3M0=0xC0;
    	P3M1=0x00;
    	P4M0=0x06;
    	P4M1=0x00;
    	P0=0xfe;
      	P3=0x3f;	 //将LED灯拉低电平 判高电平亮
    	P4=0xf9;
      TMOD =   0x11;   //T1/T0改为定时器方式1
    	TL0=0xb5;
    	TH0=0xfb;
    	ET0=1;
    	TR0=1;			
    	EA=1;
    }
    
    void main()
    {
      system_start();
      while(1);
    }
    
                                 这次有点累了  下次补查询方式解码 下次用2262来写吧  有不明白的可以下面提出来
    
    展开全文
  • 本文主要讲了51单片机外部中断触发方式的经验总结,希望对你的学习有所帮助。
  • 本文主要讲了单片机利用中断复位的两种方式,下面一起来学习一下
  • 单片机外部中断方式精确测频率,误差1HZ
  • 利用中断方式实现电脑和单片机的串口通信 文档中有基础源代码
  • 资源是用keil开发的51单片机红外接收程序,红外接收采用中断方式,解码后亮灯以示接受到信息。
  • 使用51单片机进行串口通信的学习记录之中断方式:   1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现。 接收...
  • 单片机I/O设备的控制方式主要有三种:程序循环检测、中断驱动和直接内存访问。 1、程序循环检测方式 程序循环检测方式的基本思路是:在程序(一般是设备驱动程序)当中,通过不断地检测I/O设备的当前状态,来控制一个...
  • 关于51单片机“外部中断触发方式”的经验总结。
  • 外部中断单片机一个比较重要的部分,这次,用最简单的方法让你去实现中断嵌套的功能,通过下面这个小实验,相信你对中断的认识会更加的深刻。如果还对中断这方面不太了解的话,请看这篇文章。 链接: 单片机的外部...
  • p1.0口做输出口,接一只喇叭,利用定时器中断方式编写程序,使喇叭放出悦耳的音乐。晶振频率6MHz。
  • 51单片机串口通信 采用中断方式

    万次阅读 2018-01-07 22:31:01
    void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char Temp; //定义临时变量 if(RI) //判断是接收中断产生 { RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 P1=Temp; //把值输出到...
  • [ ] 中断允许寄存器IE 1.EA:cpu总中断允许控制位。EA=1,cpu开放中断。 2.ET0/ET1:定时器T0和定时器T1溢出中断允许位。ET0/ET1=1;允许中断。 3.EX0/EX1:外部中断0和外部中断1中断允许位。EX0/ET1=1;允许中断。[ ] ...
  • 单片机中断讲解

    2013-04-04 22:09:04
    单片机中断相关介绍,让你了解几种中断方式及相关程序的编写。
  • 中断方式:发送数据——发送、等待中断、中断中发送; 接收数据——等待中断、在中断中接收。 下面让我们通过两个列子进一步看一下两者的区别: /******************查询方式实现的串口通讯*********************...
  • 单片机中断

    2020-12-28 10:55:03
    2、8051单片机有2个中断优先级,每个中断源的优先级可以编程控制,中断允许受到CPU的开中断中断源开中断的两级控制 2、中断源: (1)中断系统应设置多个中断请求触发器(标志位)实现记忆,这些中断请求标志位...

空空如也

空空如也

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

中断方式单片机