资源描述
//实验一: 用外部中断0测量负跳变信号的累计数,同时在LED数码管上显示出来。
#include <reg51.h>
#define uchar unsigned char
//各数字的数码管段码
uchar code DSY_CODE[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar counter=0;
main()
{
EA=1;
EX0=1;
IT0=1;
P3=0x04;
while(1)
{P1=DSY_CODE[counter];}
}
void int0() interrupt 0
{
EA=0;
counter++;
if(counter==10)counter=0;
EA=1;
}
//实验二: 用外部中断改变流水灯的方式
#include <reg51.h>
#define uchar unsigned char
void delay(uchar i);
uchar lamp[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//将P0口,P0.0~P0.7依次亮的值放在数组中
void delay( uchar i)//延时函数
{
uchar j,k;
for(k=0;k<i;k++)
for(j=0;j<255;j++);
}
void main()
{
uchar a;
EA=1; //开放总中断
EX0=1; //允许使用外中断0
IT0=1; //选择下降沿来触发外中断
EX1=1; //允许使用外中断1
IT1=1; //选择下降沿来触发外中断
/*IP=0x01;//中断优先级别设定,设定外部中断0为高优先级中断,能打断其他中断服务程序,
// 实验效果为按K2进入外部1中断后,只要按K1便能打断1中断*/
IP=0x04;//中断优先级别设定,设定外部中断1为高优先级中断,能打断其他中断服务程序,
//实验效果为按K1进入外部0中断后,只要按K2便能打断0中断
while(1)
{
for(a=0;a<8;a++)//开始时,P0.0~P0.7依次亮
{
P0=lamp[a];//将数组中对应P0.0~P0.7依次亮的值送P0口
delay(250);
}
}
}
void int0() interrupt 0 //外中断0的中断编号为0 K1按钮按下时左右4个灯闪烁亮八次
{
uchar a,b;
EA=0;//关中断
b=P0;//保护现场
EA=1;//开中断
for(a=0;a<8;a++)
{
P0=0xf0;
delay(250);
P0=0x0f;
delay(250);
}
EA=0;//关中断
P0=b;//恢复现场
EA=1;//开中断
}
void int1() interrupt 2 //外中断1的中断编号为2 K2按钮按下时8个灯间隔闪烁8次
{
uchar a,b;
EA=0;//关中断
b=P0;//保护现场
EA=1;//开中断
for(a=0;a<8;a++)
{
P0=0xaa;
delay(250);
P0=0x55;
delay(250);
}
EA=0;//关中断
P0=b;//恢复现场
EA=1;//开中断
}
展开阅读全文