一、实验目的
掌握中断控制原理;
掌握中断处理程序的编程方法。
二、知识要点
(1)8051内部有5个中断源,其中两个为外部中断源/INT0、/INT1,两个定时器T0、T1的溢出请求中断,1个片内串行口发送或接收中断源TI和RI。
(2)8051的5个中断源的优先次序已由硬件结构决定,由高到低顺序:
/INT0→T0→/INT1→T1→RI或TI
(3)C51编译器支持51单片机的中断服务程序。用C语言编写中断服务函数的格式为:
函数类型 函数名(形式参数列表)[interrupt n][using m]
其中,interrupt后面的n是中断编号,取值范围为0~4。using中的m表示使用的工作寄存器组号(如不声明,取默认值第0组)
三、实验步骤与要求
使用Proteus画出电路原理图。
使用Keil C51编写源程序,编译,生成Hex文件。
运行程序,观察并分析实验结果。
写实验报告。
四、实验内容
(1)利用外中断/INT0和/INT1控制P1口所接8位LED。无中断时,灯全亮,当外中断0响应时,灯左移亮;当外中断1响应时,灯右移亮。

#include<reg51.h>
char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(unsigned int time);
key() interrupt 0{
char i;
for(i=0;i<=7;i++){
P1=led[i];
delay(200);
}
P1=0x00;
}
key1() interrupt 2{
char j;
for(j=7;j>=0;j--){
P1=led[j];
delay(200);
}
P1=0x00;
}
void main(){
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
while(1){P1=0x00;
}
}
void delay(unsigned int time){
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
(2)以下两小题中,二选一
(2-1)利用外中断/INT1,统计中断次数,并将统计结果送P1口的8位LED显示。

#include<reg51.h>
char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(unsigned int time);
int num=0;
key1() interrupt 2{
num++;
P1=~num;
}
void main(){
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
while(1){
}
}
void delay(unsigned int time){
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
(2-2)利用外中断/INT1,统计中断次数,利用数码管实时显示次数。

#include<reg51.h>
int num=0;
void delay(unsigned int time);
char DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
key()interrupt 2
{
num++;
P1=DSY_CODE[num];
delay(200);
if(num==9)
num=-1;
}
void main(){
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
P1=DSY_CODE[num];
while(1){
}
}
void delay(unsigned int time){
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
版权声明:本文为qq_52919446原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。