2016-07-11 18:12:15 opshres169 阅读数 2871

/*以下是能在keilC 中变异的源码,直接粘贴过去就行,外部中断0(INT0)和外部中断1都有(INT1)*/

/*程序很简单,但是对新手来说还是很实用的*/

/*******************************************************************/
/*                                                                 */
/* 单片机开发系统演示程序 - INT0 INT1 中断计数                     */
/*                                                                 */
/* 6位数码管显示                                                   */
/*                                                                 */
/* 作者:曾露337  店铺:http://shop58430712.taobao.com             */
/*                                                                 */
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
/*                                                                 */
/*******************************************************************/
 
#include < reg51.h >
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

unsigned char code  LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,
                                  0x82,0xF8,0x80,0x90,0xff};
                                    
unsigned char data  display[8] = {0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00};

unsigned char code  scan_bit[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

unsigned char count0,count1,temp=0 ;

/********************************************************
*                                                       *
* 延时函数                                              *
*                                                       *
********************************************************/
void delay(uint ms) 
// 延时子程序
{
 uchar k;
 while(ms--)
 {
  for(k = 0; k < 100; k++);
 }
}

/********************************************************
*                                                       *
*  数据处理与显示函数                                   *
*                                                       *
********************************************************/
void  disp_count()
{
    char n; 

    temp=count0;

    display[2]=temp/100;    //数据处理
    temp=temp%100;
    display[1]=temp/10;
    display[0]=temp%10;

 if(display[2]==0)        //高位为0,不显示 
 { 
   display[2]=0x0a;
   if(display[1]==0)
   display[1]=0x0a;  
    }

    temp=count1;

    display[7]=temp/100;    //数据处理
    temp=temp%100;
    display[6]=temp/10;
    display[5]=temp%10;

 if(display[7]==0)        //高位为0,不显示 
 { 
   display[7]=0x0a;
   if(display[6]==0)
   display[6]=0x0a;  
    } 
     
    for(n=0;n<8;n++)
    {  
      P0 =LEDData[display[n]] ;  //显示段码
      P2 =scan_bit[n];           //输出位码
      delay(1);
   P2 = 0xff;                 //关闭显示
    } 
}

/********************************************************
*                                                       *
* 主程序                                               *
*                                                       *
********************************************************/
void main(void)
{  
   P0=0xff;
   P1=0xff;
   P2=0xff;   
   
   IT0=0;          //低电平触发
//   IT0=1;        //下降沿触发
   IT1=0;          //低电平触发
//   IT1=1;        //下降沿触发
   PX0=1;
   EA=1;
   EX1=1;
   EX0=1;

   while(1)
   {
      disp_count();
   }
}

/********************************************************
*                                                       *
* INT0中断函数                                          *
*                                                       *
********************************************************/
void  counter0(void) interrupt 0
{
   uchar  x;
   EX0=0;
   count0++;
    
   for(x=0;x<10;x++)
   {
     disp_count();
   }
   EX0=1;
}

/********************************************************
*                                                       *
* INT1中断函数                                          *
*                                                       *
********************************************************/
void  counter1(void) interrupt 2 
{
   uchar  x;
   EX1=0;
   count1++;
    
   for(x=0;x<10;x++)
   {
     disp_count();
   }
   EX1=1;
}

/********************************************************/

2013-09-24 19:54:56 xiaocaohuyang 阅读数 1980

MSP430单片机外部中断

小小总结,完全原创。欢迎转载!请注明出处。技术交流QQ1626092784

视频教程地址:http://www.youku.com/playlist_show/id_20133778.html

相关的源程序、视频教程、电路图、开发软件打包下载:http://pan.baidu.com/share/link?shareid=1516264396&uk=471316729

 

MSP430F149的外部中断资源丰富,P1口和P2口共16个IO口都可以作为外部中断源。我们着重讲怎么用。

要想让一个IO口作为外部中断的中断源必须有三个设置。第一,必须将该IO口的方向设置为输入;第二,选择外部中断的触发方式,即选择是上升沿触发还是下降沿触发;第三,使能该IO口的中断。

比如,如果我们想设置P1.0口作为外部中断源就可以这样设置:

P1DIR&= ~BIT0;//方向设置为输入

 P1IES |= BIT0;//触发方式设置

P1IE |=BIT0;//使能中断

其中触发方式设置中0为上升沿触发、1为下降沿触发。设置完成之后就可以使用P1.0端口的下降沿或者上升沿触发的外部中断了。

需要特别说明的是如果在一个设计程序中如果用到了中断,那么在使用中断之前必须使能总中断。IARfor430环境下的使能总中断的语句是:_EINT(); 就像我们如果想开A、B、C三个灯,我们除了需要把A、B、C三个灯的开关打开之外还需要把总电源开关打开,不然的话灯还是不会亮的。相应的关闭总中断的语句是:_DINT(); 

       具体的应用例程请观看我的视频教程。网址:

2014-01-18 15:40:26 lidec 阅读数 1613

void Usart_INT0_init()
{
  TMOD = 0X21;
  TH1 = 0XFD;
  TL1 = 0XFD;
  SM0 = 0;
  SM1 = 1;
  REN = 1;
  TR1 = 1;

  //ES = 1;//串口中断影响外部中断0 这句话会让程序无法进入外部中断服务

  TH0 = 0;
  TL0 = 0;
  ET0 = 0;//关闭定时器0

  IT0 = 1;//外部中断下降沿触发*/
  EX0 = 1;//打开外部中断

  EA = 1;
  //ES = 1;
}

void Send_data(unsigned char dat)
{
  SBUF = dat;
  while(!TI);
  TI = 0;
}

int j;

void main()
{
  unsigned int i;
  LED = LED_ON;
  //LED = LED_OFF;
  flag_test_high = ON;

 
  IN0 = 1;
  Usart_INT0_init();

  EX0 = 1;
  while(1)
  {  
       /*i=40000;
    while(i--);*/

    /*flag_test_high = ON;

    EX0 = 1;
    while(flag_test_high == ON);
    EX0 = 0;
    //Send_data('a');*/
    Send_data(result|0x30); 
  }
}

void EX_int(void) interrupt 0
{
  EX0 = 0;
  
  ET0 = 1;//打开定时器
  TR0 = 1;
  while(IN0 == 0);
  TR0 = 0;
  
  tem_TH = TH0;
  tem_TL = TL0;
  sum = tem_TH*256 + tem_TL;
  sum = (int)sum/1000;
  result = 9 - sum;
     //result = 9-(int)(10*(TH0*256 + TL0)/10000);//分步计算避免出错

  TH0 = 0;
  TL0 = 0;
  
  LED = LED_OFF;
  //Send_data(result|0x30);
  flag_test_high = OFF;
  ET0 = 0;//关闭定时器
  EX0 = 1;
}

2018-08-04 12:07:38 liming0931 阅读数 6862
;普中51开发板
;单片机的P3.2(INT0)引脚与按键K3脚连接
;用汇编语言实现:按一次K1外部中断INT0响应一次,LED显示值加1(十进制),
;前提是共阴数码LED第一位,需要设定,由P0口控制。
		ORG 0000H
		LJMP START
		ORG 0003H
		LJMP INTT0
		ORG 0600H
START: 	SETB EA
		SETB EX0 ; 打开外部中断0
		SETB IT0 ; 跳变沿出发方式(下降沿)	这个方法比较稳定
		;CLR IT0 ; 令中断0为电平触发,这个方式需要有延时程序,
		;否则,单片机处理速度快,按一下按键,
		;已经处理了很多个低电平中断了。
		CLR P2.2  ;段位选择第一位
		CLR P2.3
		CLR P2.4
CLR1:	MOV R0,#00H

DISPLAY: MOV DPTR,#TAB	;给字形表的初地址
		MOV A,R0	;将要显示的数给A
		;/////////////////////////
		MOV B, A   ;save a value
		CLR C
		SUBB A, #10H	;如果已计数到15,说明一次循环结束
		MOV A, B   ;load a value
		JNC CLR1   ;C=1,重新开始,R0=00H,若等于0,回display

		MOVC A,@A+DPTR ;在字形表中取数放到A
		MOV P0,A	;假设是P0口输出要显示的数据把A放到P0中

		
		SJMP DISPLAY ;循环显示等待中断

INTT0:	INC R0	;中断中有按键着加1
		RETI
TAB:	DB 3FH,06H,5BH,4FH,66H ;字形表0-15
		DB 6DH,7DH,07H,7FH,6FH
		DB 77H,7CH,39H,5EH,79H,71H
		END

 

2015-11-26 21:37:25 chengdong1314 阅读数 1141

这篇文章讲51芯片内部各个模块的汇编程序,这里不做实验,只贴代码:

外部中断模块-汇编:


中断地址定义:

  ;-----------------------------------------------
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;中断入口
  LJMP exter0  ;中断函数名
  ORG 0013H     ;中断入口
  LJMP exter1  ;中断函数名
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
  ;-----------------------------------------------


主函数  main:

MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  LCALL DELAY40ms          ;延时40.301ms 64KB长调用子函数
  MOV num,#00H
  MOV wei,#07H
  SETB EX0        ;开启外部中断 0,即P32引脚
  SETB IT0      ;将外部中断0设为边沿触发方式
  CLR PX0        ;优先级为0    
  SETB EX1    
  SETB IT1   
  SETB PX1  ;1的中断优先级比0的高   外部中短1的优先级比0的高
  SETB EA        ;首先开启总中断
  ;********************死循环**********************

while1:
  LCALL led_Static_display
  INC num
  MOV A,num
  CJNE A,#011H,rigthnum
  MOV num,#00H
  rigthnum:
  LCALL DELAY500ms
  LCALL DELAY500ms
  LJMP while1
  ;================================================
  ;外部中断0函数
  ;================================================




中断函数:

exter0:    
  ;CLR EA
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H    
  PUSH 06H
  PUSH 07H
  ;SETB p3.2   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  ;LCALL DELAY40ms
  ;JB p3.2,OVER
  MOV numtemp,#03H
  while1exter0:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  DEC numtemp     
  MOV A,numtemp    
  CJNE A,#0FFH,while1exter0
  OVER:
  POP 07H    
  POP 06H
  POP 05H    
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  CLR IE0   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;外部中断1函数
  ;================================================
exter1:    
  ;CLR EA
  PUSH 32H
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H    
  PUSH 06H
  PUSH 07H
  SETB p3.3   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  LCALL DELAY40ms
  JB p3.3,OVERexter1
  MOV numtemp,#04H
  while1exter1:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  INC numtemp     
  MOV A,numtemp    
  CJNE A,#08H,while1exter1
  OVERexter1:
  POP 07H    
  POP 06H
  POP 05H    
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  POP 32H
  CLR IE1   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  ;SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;数码管静态显示函数
  ;================================================


整个程序源代码:

  ;-----------------------数码管脚功能定义---------------------------   
  LED_wei EQU P2
  LED138_0 EQU P2.0
  LED138_1 EQU P2.1
  LED138_2 EQU P2.2
  LED_duan EQU P0
  ;-------------------- 数码要显示的位、数据---------------------------
  wei EQU 30H    ;数码管位选
  num EQU 31H    ;数码管段选
  numtemp EQU 32H    ;数码管段选暂存
  ;-----------------------------------------------
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;中断入口
  LJMP exter0  ;中断函数名
  ORG 0013H     ;中断入口
  LJMP exter1  ;中断函数名
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
  ;-----------------------------------------------
MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  LCALL DELAY40ms          ;延时40.301ms 64KB长调用子函数
  MOV num,#00H
  MOV wei,#07H
  SETB EX0        ;开启外部中断 0,即P32引脚
  SETB IT0      ;将外部中断0设为边沿触发方式
  CLR PX0        ;优先级为0    
  SETB EX1    
  SETB IT1   
  SETB PX1  ;1的中断优先级比0的高   外部中短1的优先级比0的高
  SETB EA        ;首先开启总中断
  ;********************死循环**********************
while1:
  LCALL led_Static_display
  INC num
  MOV A,num
  CJNE A,#011H,rigthnum
  MOV num,#00H
  rigthnum:
  LCALL DELAY500ms
  LCALL DELAY500ms
  LJMP while1
  ;================================================
  ;外部中断0函数
  ;================================================
exter0:    
  ;CLR EA
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H    
  PUSH 06H
  PUSH 07H
  ;SETB p3.2   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  ;LCALL DELAY40ms
  ;JB p3.2,OVER
  MOV numtemp,#03H
  while1exter0:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  DEC numtemp     
  MOV A,numtemp    
  CJNE A,#0FFH,while1exter0
  OVER:
  POP 07H    
  POP 06H
  POP 05H    
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  CLR IE0   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;外部中断1函数
  ;================================================
exter1:    
  ;CLR EA
  PUSH 32H
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H    
  PUSH 06H
  PUSH 07H
  SETB p3.3   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  LCALL DELAY40ms
  JB p3.3,OVERexter1
  MOV numtemp,#04H
  while1exter1:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  INC numtemp     
  MOV A,numtemp    
  CJNE A,#08H,while1exter1
  OVERexter1:
  POP 07H    
  POP 06H
  POP 05H    
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  POP 32H
  CLR IE1   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  ;SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;数码管静态显示函数
  ;================================================
led_Static_display:
  ANL wei, #07H
  ANL LED_wei,#0F8H
  MOV A,wei
  ORL LED_wei,A
  MOV A,num  
  MOV DPTR,#numtab
  MOVC A,@A+DPTR  ;查表取数据
  MOV LED_duan,A
  RET
  ;================================================
  ;各种参数的延时子函数
  ;================================================
DELAY100us:     ;100us  
  MOV R6,#06H
  DEL11: MOV R7,#08H
  DEL12: DJNZ R7,DEL12
  DJNZ R6,DEL11
  RET

DELAY500us:    ;500us
  MOV R6,#0CH   ;288
  DEL21: MOV R7,#18H
  DEL22: DJNZ R7,DEL22
  DJNZ R6,DEL21
  RET
 
DELAY1ms:    ;1ms
  MOV R6,#18H   
  DEL61: MOV R7,#18H
  DEL62: DJNZ R7,DEL62
  DJNZ R6,DEL61
  RET

DELAY40ms:    ;延时40ms  500得1ms
  MOV R6,#100
  DEL41: MOV R7,#200
  DEL42: DJNZ R7,DEL42
  DJNZ R6,DEL41
  RET

DELAY256ms:        ;延时256ms
  MOV R5,#05H
  DEL51: MOV R6,#100
  DEL52: MOV R7,#0FFH
  DEL53: DJNZ R7,DEL53
  DJNZ R6,DEL52
  DJNZ R5,DEL51
  RET
 
DELAY500ms:        ;延时256ms
  MOV R5,#0AH
  DEL81: MOV R6,#100
  DEL82: MOV R7,#0FFH
  DEL83: DJNZ R7,DEL83
  DJNZ R6,DEL82
  DJNZ R5,DEL81
  RET
 
DELAY1s:    ;1秒
  MOV R5,#16H
  DEL31: MOV R6,#100
  DEL32: MOV R7,#0FFH
  DEL33: DJNZ R7,DEL33
  DJNZ R6,DEL32
  DJNZ R5,DEL31
  RET
 
DELAY10s:    ;10秒
  MOV R5,#0DCH
  DEL71: MOV R6,#100
  DEL72: MOV R7,#0FFH
  DEL73: DJNZ R7,DEL73
  DJNZ R6,DEL72
  DJNZ R5,DEL71
  RET
numtab: DB  03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H,000H
end


keil工程整体源码:

51汇编之外部中断带优先级-汇编.zip

http://download.csdn.net/detail/chengdong1314/9303641

单片机-外部中断

阅读数 478

没有更多推荐了,返回首页