您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>C/C++语言编程>

外部中断典型实验案例分享

大小:0.15 MB 人气: 2017-09-06 需要积分:0
外部中断典型实验案例分享

1、两个外部中断实验

/* ch06-3-3.c - 两个外部中断实验 */
//==声明区===================================
#include  // 定义8x51暂存器之标头档,P2-17~19 
#define LED P1   // 定义LED接至Port 1
void delay1ms(int);  // 声明延迟函数 
void left(int);   // 声明单灯左移函数 
void right(int);  // 单灯右移函数开始
//==主程序===================================
main()     // 主程序开始 
{ IE=0x85;   // 准许INT 0,INT 1中断(6-4页)
 IP=0x01;   // 设定INT 0具有最高优先权(6-5页)
 LED=0x00;   // 初值=0000 0000,灯全亮 
 while(1)   // 无穷循环,程序一直跑 
 { delay1ms(250); // 延迟250 1m=0.25s 
  LED=~LED;  // LED反相 
 }     // while循环结束 
}      // 主程序结束 
//==子程序===================================
/* INT 0的中断子程序 - 单灯左移3圈 */
void my_int0(void) interrupt 0 // INT0 中断子程序开始 
{ unsigned saveLED=LED; // 储存中断前LED状态 
 left(3);   // 单灯左移3圈 
 LED=saveLED;  // 写回中断前ED状态   
}      // 结束INT0 中断子程序 
/* INT 1的中断子程序 - 单灯右移3圈 */
void my_int1(void) interrupt 2 // INT1 中断子程序开始 
{ unsigned saveLED=LED; // 储存中断前LED状态 
 right(3);   // 单灯右移3圈 
 LED=saveLED;  // 写回中断前LED状态 
}      // 结束INT1 中断子程序 
/* 延迟函数,延迟约x 1ms */
void delay1ms(int x) // 延迟函数开始 
{ int i,j;   // 声明整数变数i,j 
 for (i=0;i   for (j=0;j<120;j++); // 计数120次,延迟1ms 
}      // 延迟函数结束 
/* 单灯左移函数,执行x圈 */
void left(int x)   // 单灯左移函数开始 
{ int i, j;   // 声明变数i,j
 for(i=0;i  { LED=0xfe;  // 初始状态=1111 1110,最右灯亮 
  for(j=0;j<7;j++) // j循环,左移7次 
  { delay1ms(250); // 延迟250 1m=0.25s
   LED=(LED<<1)|0x01;  // 左移1位後,LSB设为1
  }    // j循环结束 
  delay1ms(250); // 延迟250 1m=0.25s
 }     // i循环结束*/
}      // 单灯左移函数结束 
/* 单灯右移函数,执行x圈 */
void right(int x)   // 单灯右移函数开始
{ int i, j;   // 声明变数i,j
 for(i=0;i  { LED=0x7f;  // 初始状态=0111 1111
  for(j=0;j<7;j++)// j循环,右移7次 
  { delay1ms(250); // 延迟250 10m=0.25s
   LED=(LED>>1)|0x80;  // 右移1位後,MSB设为1
  }    // j循环结束 
  delay1ms(250); // 延迟250 1m=0.25s
 }     // i循环结束*/
}      // 单灯右移函数结束 
 

2、INT1中断实验

/* ch06-3-2.c - INT1中断实验 */
//==声明区====================================
#include  // 定义8x51暂存器之标头档,P2-17~19 
#define SEG P0 // 定义七节显示器接至Port 0
void delay1ms(int); // 声明延迟函数 
/* 声明七节显示器驱动信号阵列(共阳) */
unsigned char code TAB[]={ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0-4
            0x92, 0x83, 0xf8, 0x80, 0x98 }; //数字5-9
//==主程序=====================================
main()     // 主程序开始  
{ int i;    // 声明i变数(计数值)
 IE=0x84;   // 准许INT 1中断(6-4页)
 while(1)   // 无穷循环,程序一直跑 
 { for(i=0;i<10;i++) // 显示0-9(上数)
  { SEG=TAB[i]; // 显示数字至七节显示器 
   delay1ms(500); // 延迟500 1m=0.5s 
  }
 }     // for循环结束 
}      // 主程序结束 
//==子程序===================================
/* INT 1的中断子程序 - 数字闪烁倒数9-0 */
void my_int1(void) interrupt 2  // INT1 中断子程序开始 
{ int i;    // 声明i变数(计数值)
 for (i=9;i>=0;i--) // for循环显示9-0(下数)
 { SEG=TAB[i];  // 显示数字至七节显示器 
  delay1ms(250); // 延迟500 1m=0.5s 
  SEG=0xff;  // 关闭七节显示器 
  delay1ms(250); // 延迟500 1m=0.5s 
 }     // for循环结束 
}      // 结束中断子程序 
/* 延迟函数,延迟约x*1ms */
void delay1ms(int x) // 延迟函数开始 
{ int i,j;   // 声明整数变数i,j 
 for (i=0;i   for (j=0;j<120;j++); // 计数120次,延迟1ms 
}      // 延迟函数结束 
 

3、INT0中断实验

/* ch06-3-1.c - INT0中断实验 */
//==声明区===================================
#include  // 定义8x51暂存器的标头档,P2-17~19 
#define LED P1   // 定义LED接至Port 1
void delay1ms(int);  // 声明延迟函数 
void left(int);   // 声明单灯左移函数 
//==主程序===================================
main()     // 主程序开始 
{ IE=0x81;   // 准许INT 0中断(6-4页)
 LED=0x00;   // 初值=0000 0000,灯全亮 
 while(1)   // 无穷循环,程序一直跑 
 { delay1ms(250); // 延迟250*1m=0.25s 
  LED=~LED;  // LED反相 
 }     // while循环结束 
}      // 主程序结束 
//==子程序===================================
/* INT 0的中断子程序 - 单灯左移3圈 */
void my_int0(void) interrupt 0 // INT0 中断子程序开始 
{ unsigned saveLED=LED; // 储存中断前LED状态 
 left(3);   // 单灯左移3圈 
 LED=saveLED;  // 写回中断前LED状态 
}      // 结束INT0 中断子程序 
/* 延迟函数,延迟约x 1ms */
void delay1ms(int x) // 延迟函数开始 
{ int i,j;   // 声明整数变数i,j 
 for (i=0;i   for (j=0;j<120;j++); // 计数120次,延迟1ms 
}      // 延迟函数结束 
/* 单灯左移函数,执行x圈 */
void left(int x)   // 单灯左移函数开始 
{ int i, j;   // 声明变数i,j
 for(i=0;i  { LED=0xfe;  // 初始状态=1111 1110,最右灯亮 
  for(j=0;j<7;j++)// j循环,左移7次 
  { delay1ms(250); // 延迟250*1m=0.25s
   LED=(LED<<1)|0x01;  // 左移1位後,LSB设为1
  }    // j循环结束 
  delay1ms(250); // 延迟250*1m=0.25s
 }     // i循环结束*/
}      // 单灯左移函数结束 

4、4x4键盘实验

/* ch06-3-4.c - 4x4键盘实验,外部INT0(P3.2) */
//==声明区===================================
#include  // 定义8x51暂存器之标头档,P2-17~19 
#define LED P1   // 定义LED接至Port 1
#define KEYBCD  P2   // 定义接键盘扫瞄(低4位元)及BCD输出(高4位元)
#define RR(x) (x==0x7f)? 0xfe:(x<<1)|0x01 // x向左旋转1bit
void delay1ms(int); // 声明延迟函数 
//==主程序===================================
main()     // 主程序开始 
{ IE=0x81;   // 准许INT 0中断(6-4页)
 LED=0xfe;   // 初值=1111 1110,最右灯亮 
 while(1)   // 无穷回圈,程序一直跑 
 { delay1ms(250); // 延迟250 1m=0.25s
  LED=RR(LED); // LED向左旋转1bit
 }     // while回圈结束 
}      // 主程序结束 
//==子程序===================================
/* 延迟函数,延迟约x 1ms */
void delay1ms(int x) // 延迟函数开始 
{ int i,j;   // 声明整数变数i,j 
 for (i=0;i   for (j=0;j<120;j++);// 计数120次,延迟1ms 
}      // 延迟函数结束 
/* INT 0的中断子程序 - 单灯左移3圈 */
void my_int0(void) interrupt 0 // INT0 中断子程序开始 
{ unsigned saveLED=LED; // 储存中断前LED状态 
 KEYBCD=0xff;  // 规划输入 
 KEYBCD>>=4;   // 高四位元移至低四位元 
 LED=saveLED;  // 写回中断前ED状态 
}      // 结束INT0 中断子程序 
 
 

5、4x4键盘与4个7节显示器实验

/* ch05-4-4.c - 4x4键盘与4个7节显示器实验, P1.4~7为共用扫描信号 */
/* P1.0~3为键盘输入值,P2为7节显示器直接输出 */
//==声明区================================================
#include   // 定义8051暂存器之标头档 
#define KEYP  P2   // 扫瞄输出端口(高位元)及键盘输入端口(低位元)
#define SEG7P  P0    // 7节显示器(g~a)输出埤 
unsigned char code TAB[17]= // 共阳7节显示器(g~a)编码 
{  0xc0, 0xf9, 0xa4, 0xb0, 0x99, // 数字0-4
   0x92, 0x82, 0xf8, 0x80, 0x98,  // 数字5-9
   0xa0, 0x83, 0xa7, 0xa1, 0x84,  // 字母a-e(10-14)
   0x8e, 0xbf};     // 字母F(15),负号(-)
unsigned char disp[4]={ 0xbf, 0xbf, 0xbf, 0xbf }; // 显示阵列初值为负号(-)
unsigned char scan[4]={ 0xef, 0xdf ,0xbf ,0x7f }; // 7显示器及键盘之扫瞄码 
void  delay1ms(int);   // 声明延迟函数 
void  scanner(void);   // 声明扫瞄函数 
//==主程序================================================
main()       // 主程序开始 
{ while(1)     // 无穷回圈,程序一直跑 
 scanner();     // 扫瞄键盘及显示7段显示器 
}        // 主程序结束 
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x)   // 防弹跳函数开始 
{ int i,j;     // 声明整数变数i 
 for(i=0;i   for(j=0;j<120;j++);  // 计数120次,延迟约1ms 
}        // 防弹跳函数结束 
// ======= 扫瞄4*4键盘及4个7节显示器函数 ================
void scanner(void)    // 扫瞄函数开始 
{ unsigned char col,row,dig;  // 声明变数(col:行,row:列,dig:颢示位)
 unsigned char rowkey,kcode; // 声明变数(rowkey:列键值,kcode:按键码)
 for(col=0;col<4;col++)     // for回圈,扫瞄第col行 
 { KEYP  = scan[col];  // 高4位输出扫瞄信号,低4位元输入列值 
  SEG7P = disp[col];  // 输出第col行数字 
  rowkey= ~KEYP & 0x0f;
  // 读入KEYP低4位,反相再清除高4位求出列键值 
  if(rowkey != 0)   // 若有按键 
  { if(rowkey == 0x01)      row=0; // 若第0列被按下 
   else if(rowkey == 0x02) row=1; // 若第1列被按下 
   else if(rowkey == 0x04) row=2; // 若第2列被按下 
   else if(rowkey == 0x08) row=3; // 若第3列被按下 
   kcode = 4 * col + row;   // 算出按键之号码 
   for(dig = 0; dig < 3 ; dig++) // 显示阵列之左3字 
    disp[dig]=disp[dig+1];  // 将右侧编码左移1位 
   disp[3]=TAB[kcode];    // 键值编码後,写入最右侧 
   while(rowkey != 0)    // 当按钮未放开 
    rowkey=~KEYP & 0x0f;  // 再读入列键值 
  }      // if叙述(有按键时)结束 
  delay1ms(4);   // 延迟4ms
 }       // for回圈结束(扫瞄col行)
}        // 扫瞄函数scanner()结束 
 

6、MM74C922实验

/* ch05-4-5.c - MM74C922实验,P2.4~7为键盘值,P2.0~3输出至7447 */
//==声明区===================================
#include    // 定义8051暂存器之标头档,P2-17~19 
sbit  IRQ=P3^2;     // 声明P3.2 侦测是否输入 
//==主程序===================================
main()      // 主程序开始 
{ P2=0xff;    // 规划P2.4~7为输入埠,并关闭显示器(P2.0~3)
 while(1)    // 无穷循环,程序一直跑 
  if (IRQ==1)     // 判读是否按下按键 
   P2=(P2>>4)|0xf0; 
 /* 高4位元(输入)移至低4位元(输出),再将高4位元设为1(规划输入)*/
}         // 主程序结束 
 

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!