精华内容
下载资源
问答
  • 16F877A有三个定时器,中断方式都...最后整明白了,PIC16系列单片机中断入口中有一个。PIC的功能是很强大,外围模块也多,速度也较快,但PIC的这个中断方案不好,应该改进。以下是三个定时中断同时工作的调试代码。
  • PIC18F系列单片机外部中断 以外部中断0为例,代码如下 void INTx_Init (void)//外部中断 { TRISBbits.TRISB0 = 1; INTCON2bits.INTEDG0 = 0; //INT0下降沿触发 INTCONbits.INT0IE = 1; //使能INT0中断 INTCONbits....

    PIC18F系列单片机外部中断

    以外部中断0为例,代码如下

    void INTx_Init (void)//外部中断
    {
      TRISBbits.TRISB0 = 1;
      INTCON2bits.INTEDG0 = 0; //INT0下降沿触发
      INTCONbits.INT0IE = 1;   //使能INT0中断
      INTCONbits.INT0IF = 0;   //清中断标志位
      
    }
    /***************************************************
                            外部中断0
    ***************************************************/
        if(INTCONbits.INT0IF == 1)
        { 
          INTCONbits.INT0IF = 0;
    	  LED101_REVERSE;
        }
     #pragma code
    #pragma interrupt Inter_Server 
    void Inter_Server (void)//中断函数时钟、串口
    {
     /***************************************************
                             外部中断1
     ***************************************************/
         if(INTCONbits.INT0IF == 1)
        { 
          INTCONbits.INT0IF = 0;
    	  LED101_REVERSE;
        }
    }
    **// MPLAB C18 不自动把中断服务程序放在中断向量处。通常将GOTO 指令放在中断向量
    // 处,从而把控制权转交给相应的中断服务程序。**
    #pragma code high_vector = 0x08	
     void high_interrupt (void)
    {
    	_asm goto Inter_Server _endasm
    }
    

    这样写发现并不能进入中断函数,把标志位INTCONbits.INT0IF在定时器里周期置1可以进入,原因是外部中断0的RB0口默认是模拟输入,把模拟输入功能关闭就可以了,配置如下 ADCON0 = 0x00; //关闭AD
    ANCON0 = 0x00;//全部设置为数字引脚
    ANCON1 = 0x00;//

    展开全文
  • PIC16F877A单片机外部中断)1 基本原理2 实现代码 1 基本原理 2 实现代码 /*----------------函数功能: 外部中断RB0/INT 按下按键(即产生一个中断),此时LED灯灭 --------------------------*/ #...

    PIC16F877A单片机 (外部中断)

    1 基本原理

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    2 实现代码

    
    /*----------------函数功能:
    	    外部中断RB0/INT
    		按下按键(即产生一个中断),此时LED灯亮
    --------------------------*/
    #include<pic.h>// 调用PIC16f87XA单片机的头文件
    
    //#include"delay.h"//调用延时子函数的头文件
    
    
    
    __CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关
    //__CONFIG(HS&WDTDIS&LVPDIS);
    
    
    
    /*-----------宏定义--------------*/
    #define  uint  unsigned int
    #define  uchar unsigned char
    #define  V0     RD0			// led灯
    
    
    
    
    /*-----------子函数声明--------------*/
    
    
    
    /*-----------主函数--------------*/
    void main()
    {
    	// The corresponding data direction register is TRISA. 
    	// Setting  a TRISA bit (= 1) will make the corresponding PORTA pi an input. 
    	// Clearing a TRISA bit (= 0) will make the corresponding PORTA pin an output.
    
    	// The RB0/INT pin interrupt, the RB port change interrupt
    	// RB0口是外部中断。要设置该端口的方向为输入,从而接收外部数据。
    	TRISB=0xff;				// 设置数据方向 RB7-RB0为输入
    	//TRISB0=1;				// 对于中断而言,和上一条语句等价
    	
    
    
    	// 控制LED灯的端口的数据方向为输出
    	TRISD0=0;				// 设置数据方向 RD0为输出	
    
    
    
    	// 1 = Port pin is > VIH,即高电平  ;  0 = Port pin is < VIL,即低电平
    	PORTB=0x00;				// 端口赋初值  这一句可以不要,因为设置为输入,如果是输出,则必须要赋初值
    	//PORTB0=0;				// 对于中断而言,和上一条语句等价
    
    
    
    	// LED灯的初值为灭
    	V0=0;					// 端口赋初值
    
    
    
    	
    	/************外部中断初始化************/
    	// External interrupt on the RB0/INT pin is edge triggered,
    	// either rising if bit INTEDG (OPTION_REG<6>) is set or falling if the INTEDG bit is clear.
    	INTEDG=1;				// 设置RB0/INT为上升沿触发
    
    
    	
    	INTF=0;					// RB0/INT的中断标志位清零
    
    
    
    	// This interrupt can be disabled by clearing enable bit, INTE
    	INTE=1;					// RB0/INT的溢出中断标志允许位置一
    
    
    
    
    
    	//*********开全局中断设置************/
    	// A global interrupt enable bit, GIE (INTCON<7>),enables (if set) all unmasked interrupts
    	// or disables (if cleared) all interrupts
    	// 外部中断RB0/INT设置了中断允许,此处要开全局中断
    	GIE=1;					//总中断允许
    	// 外部中断RB0/INT设置了中断允许,此处要允许外设中断
    	PEIE=1;					// 允许外设中断
    
    
    
    	while(1)				// 死循环,单片机初始化后,就一直运行这个死循环
    	{
    		//V0=1;
    		//delay(500);
    		//V0=0;
    	}
    	
    }
    
    
    
    
    /*************中断服务程序***************/
    void interrupt ISR(void)//PIC单片机的所有中断都是这样一个入口
    {
    	// When a valid edge appears on the RB0/INT pin, flag bit, INTF(INTCON<1>), is set.
    	if(INTF==1)				// 需要进一步判断是否为定时器1的溢出中断标志位    
    	{
    		// The interrupt flag bit(s) must be cleared in software before 
    		// re-enabling interrupts to avoid recursive interrupts
    		//溢出中断标志位清零     如果INTF出现上升沿,则产生中断,所以中断发生之后要清零。
    		INTF=0;			
    
    		
    
    		// 执行中断处理程序,执行中断产生时想要执行的功能
    		V0=1;				// 外部中断发生时,LED灯亮
    
    	}
    }
    
    展开全文
  • PIC单片机(PIC16F877A)外部中断程序

    千次阅读 2012-07-18 18:15:40
    正常运行为流水灯,发生中断则灯全亮。 #include __CONFIG(0x3B31); //4M #define uchar unsigned char #define uint unsigned int #define DELAY 500 uint j=50000; void delay(uint x) //1ms { uint y,z...

    正常运行为流水灯,发生中断则灯全亮。

    #include<pic.h>
    __CONFIG(0x3B31);	//4M
    #define uchar unsigned char
    #define uint unsigned int
    #define DELAY 500
    uint j=50000;
    void delay(uint x)	//1ms
    {
    	uint y,z;
    	for(y=x;y>0;y--)
    		for(z=25;z>0;z--);
    }
    void init(void)
    {
    	TRISB0=0;
    	RB0=1;		//为下降沿创造高电平的初始条件
    	TRISB0=1;	//输入模式
    	INTEDG=0;	//0下降沿触发,1为上升沿触发
    	INTF=0;		//清零标志位
    	INTE=1;		//开中断允许
    	GIE=1;		//开全局中断
    }
    void interrupt INT()	//查询式中断
    {
    	if(INTE&&INTF)
    	{
    		INTF=0;
    		PORTD=0xff;
    		while(j--);
    		j=50000;
    		TRISB0=0;	//RB0设为输出
    		RB0=1;		//输出高电平,以便检测中断条件(下降沿)
    		TRISB0=1;	//设为输入,等待中断
    	}
    }
    void main(void)
    {
    	uchar i,temp;
    	TRISD=0x00;
    	PORTD=0xff;
    	init();
        	while(1)
        	{
     		temp=0x01;
        		for(i=0;i<8;i++)
      		{
       			PORTD=temp;
       			delay(DELAY); 
       			temp<<=1;  
      		}
     	}
    }
    

     


     

    展开全文
  • PIC单片机学习-中断

    2020-12-04 12:09:47
    PIC单片机避坑系列-中断 前言: 问题描述: 原因分析: 1、PIC单片机中断标志位特点 2、PIC单片机中断响应函数特点 解决方案: 前言: PIC单片机有丰富的中断源,使用起来非常方便,但是在使用的时候有个点必须要...

    前言:

    PIC单片机有丰富的中断源,使用起来非常方便,但是在使用的时候有个点必须要注意,否则会出现预期外的结果。
    本文就重点讲一个PIC中断容易踩坑的点,希望大家能够避免出现问题。


    问题描述:

    之前我在做一个项目时,发现程序怎么都不按预期逻辑来执行,程序举例如下:

    void interrupt isr()
    {
    	if(RCIF)
    	{
    		recieve_buffer=RCREG;
    		recieve_flag=1;
    	}
    	if(CCP1IF)
    	{
    		CCP1IF=0;
    		ccp1_flag=1;
    	}
    	if(CCP2IF)
    	{
    		CCP2IF=0;
    		ACT=1;	
    	}
    	if(INTF)
    	{
    		INTF=0;
    		ACT=1;
    	}
    
    }
    

    这个程序我使能了串口中断,捕获1和外部中断,捕获2中断并未使能(CCP2IE=0)。串口是上位机每间隔100ms发送指令给单片机,因此单片机每间隔100ms会进入串口中断。程序本来设计是外部中断触发后,ACT=1;可是在调试时,还未有外部中断条件也会出现ACT=1。


    原因分析:

    1、PIC单片机中断标志位特点

    PIC单片机的中断标志位有一个特点—当一个中断条件发生时, 不管相应的中断允许位和全局允许位 GIE (INTCON<7>) 的状态如何,中断标志位都将置1。
    这就是说,不管中断的单独允许位,或者中断全局允许位是不是使能,只要某个中断条件满足,其中断标志位就会置1。

    2、PIC单片机中断响应函数特点

    我之前使用的51单片机不同中断会有不同的响应函数入口,不同中断会单独使用关键字interrupt,后面接相应的端口号,来响应不同中断程序。
    而PIC单片机在程序里面统一是一个中断函数,这就导致发生任何种类的中断,程序都会跳入统一的中断函数,然后依次执行函数内语句。

    综合以上两个原因,就会发生我上述程序调试时碰到的问题,我的捕获2中断未开启,如果发生了捕获2中断事件,虽然不会进入中断响应,其标志位CCP2IF会置1,这时如果发生其他中断响应进入中断函数。这就会发生我碰到的问题,虽然没有出现外部中断,捕获2未使能,但是CCP2IF已经置1了,所以判断会进入条件语句处理,使ACT的值变为1了。


    解决方案:

    要避免上述问题,其实只需要我们在代码上注意以下两点便可以避免。
    1、在中断响应函数中,判断条件除了标志位判断再增加使能判断,如外部中断原来只判断INTF,现写为INTF&&INTE;
    2、在开启一个中断前,必须先将其标志位清零;
    3、每个中断响应处理函数内,必须将其标志位清零,虽然某些标志位是硬件清零,但是考虑不同芯片型号设置不一致,或者遗忘,反正加一条软件清零不会出错。
    例程如下:

    void init_interrupt()
    {
    	RCIF = 0;
    	RCIE = 1;
    	
    	CCP1IF = 0;
    	CCP1IE = 1;
    	
    	INTF = 0;
    	INTE = 1;
    
    }
    void interrupt isr()
    {
    	if(RCIF&&RCIE)
    	{
    		RCIF = 0;
    		recieve_buffer = RCREG;
    		recieve_flag = 1;
    	}
    	if(CCP1IF&&CCP1IE)
    	{
    		CCP1IF = 0;
    		ccp1_flag = 1;
    	}
    	if(CCP2IF&&CCP2IE)
    	{
    		CCP2IF = 0;
    		ACT = 1;	
    	}
    	if(INTF&&INTE)
    	{
    		INTF = 0;
    		ACT = 1;
    	}
    
    }
    
    展开全文
  • 由于PIC16F 877单片机没有设置外部的中断优先级,提出了一种用74LS148优先权编码器来扩展PIC16F 877单片机的外部中断源。当PIC16F 877单片机外部有多个中断源中断请求时,74LS148优先权编码器首先对这些中断源进行...
  •  PIC16F87X系列的中断包含:TMR0溢出中断(TOIF)、外部中断(INTF)、端口B变化中断(RBIF)、并行从动端口中断(PSPIF)、A/D变换中断、USART异步接收中断(RCIF)和异步发送中断(TXIF)、同步串行端口中断...
  • PIC16F877A单片机外部中断与定时器Timer0的综合使用)1 实现原理2 实现电路图3 源代码 1 实现原理 见前面的定时器0和外部中断的内容 2 实现电路图 3 源代码 /*----------------函数功能: 定时器0+外部中断的...
  • 基于PIC16F877A单片机,利用中断捕获和定时器的方式解码红外遥控器程序
  • PIC单片机入门_中断系统详解

    万次阅读 多人点赞 2016-11-10 17:05:31
    1.中断的基本概念 当单片机正在执行程序时,出现了...“中断”加强了单片机处理突发事件的能力,如果没有中断功能,对可能发生的特殊状况的处理就必须采用定时查询,这样就会浪费大量的CPU时间。 因此,中断
  • 利用片内的定时器/计数器TMR0模块和中断逻辑功能部件,使TMR0工作在定时器模式,并且在超时溢出时向CPU发送中断请求信号,外部中断信号输入脚INT作为电源故障检测端。  电源电压检测模块电路原理图如图1所示,...
  • #include<pic.h> #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); //__CONFIG (CP_OFF &WDTE_OFF& BOREN_OFF&PWRTE_OFF &FOSC_HS&WRT_OFF&LVP_OFF&CPD_OFF); int a[10]={0x30,0x31,0x32,...
  • 上图中,高优先级为红色线的上半部分,低优先级为红色的下半部分。其中一个中断源在上半部分和下半...而INT0(外部中断0)只在上半部分有,在下半部分没有,表示它只能设置为高优先级,不能设置为低优先级。21ic基础知识
  • PIC单片机中断程序

    万次阅读 2013-01-29 00:19:33
    什么是中断程序呢?  形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你...
  • 在有些应用场合下,CPU只需间断性工作或对外部事件作出处理,平时处于待机状态。PIC16C5X有一种节能方式,睡眠(SLEEP)方式,在这种状态中,振荡驱动器停止工作, I/O口保持执行
  • 延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机...
  • PIC16F877A单片机中断与定时器Timer1)1 基本原理2 实现代码 1 基本原理 上图中,如果RC0左边外接了外部的晶振,那么T1OSCEN必须置一。这个外部的晶振频率一般都比较低。因为晶振频率越低,一般功耗越低。 为...
  • PIC单片机中断过程

    千次阅读 2011-10-21 09:52:39
    1)系统初始化的时候会打开总中断控制位(GIE),打开某个中断控制位,如果是外围中断还要打开外围中断控制位(PEIE); 2)CPU正在执行某个用户程序时,突然收到一个随机产生的中断信号,使某个中断标志位置为1; ...
  • 如何解决pic单片机的功耗问题唤醒SLEEP的条件有很多,如IO口电平变化,AD转换结束,外部复位、看门狗溢出等,具体请参考数据手册。当执行SLEEP指令时,PC+1的指令被预取指,当器件被一个中断条件唤醒时(这个中断的...
  • PIC 的八位单片机只有一个中断入口(16位和32位的单片机就有多个)也就只能在程序里只能有一个中断子函数。如果开了两个或更多的中断那就把两个中断的处理都放在这一个中断子函数中 效果:让数码管连续循环显示0...
  • PIC 外部中断INT0

    2017-06-21 22:47:31
    外部中断INT0就是在外部条件满足的情况下,简单的讲,就是对单片机内部的一个寄存器INT0IF会制1的操作 #include __CONFIG(1,XT) ;   //晶振为外部4M __CONFIG(2,WDTDIS) ;  //看门狗关闭 __CONFIG(4,LVPDIS) ; ...
  • PIC单片机概述

    千次阅读 2020-03-23 14:06:20
    PIC单片机的概述 PIC16F616是一款14引脚、8位的CMOS单片机.采用精简指令集,仅有35条指令,由于采用了数据总线和指令总线分离的哈佛总线结构,使得除少量指令不是单周期之外,大部分的指令都是单周期指令.这样有利于提高...
  • 外部中断  引言  因为具有运行速度快、低功耗、价格低、体积小等优点,Microchip公司推出的PIC系列单片机已经得到越来越广泛的应用。应用之一是作为下位机与上位机(例如PC机)通信,它被广泛应用在工业控制、数据...
  • Hello,小伙伴们大家好,最近从STM32平台转战到PIC平台,一开始不是特别的顺手...PIC32MX795F512L单片机,主频80MHz,定时器时钟频率为40MHz。采用外部4M晶振,通过PLL倍频器20倍频得到80MHz主时钟,外设时钟2分频,得到
  •  RB0/INT引脚上的外部中断由边沿触发,既可以是上升沿,也可以是下降沿,当寄存器OPTION_REG的INTEDG位为1时,选择上升沿触发;为0时选择下降沿触发。一旦检测到引脚上出现有效边沿,就将INTF位INTCON的D1置1。 ...
  • PIC24系列单片机原理与开发 第一章 PIC24 系列单片机概述。
  • Microchip PIC系列8位单片机入门教程(三) 第一节 知识点 (1)中断 PIC18F2420/2520/4420/4520 器件提供多个中断源及一个中断优先级功能,可以给大多数中断源分配高优先级或者低优先级。高优先级中断向量地址为...
  • 中断 PIC单片机16F84具有实时处理功能,能对外界异常发生的事件由中断技术作及时处理。 当单片机的CPU正在处理某事件时,若外部发生了某一事件(如定时器溢出、引脚上电平变化),请求CPU迅速去处理,于是CPU就暂时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 877
精华内容 350
关键字:

pic单片机外部中断