控制灯移位(c):
/*中断控制灯移位实验(查询方式) */
//===================声明区=================================
#include <reg51.h> // 定义8051暂存器之标头档
#define LED P0 //定义LED端口
unsigned char SHIFT=0x01; //LED显示初始状态
unsigned char i;
//===================主程序==================================
main() // 主程序开始
{
LED=0x00;//LED熄灭
IT0=1; //外部中断1控制为边沿触发方式(下降沿有效)
EX0=1; //允许INT0中断
EA=1; //开放所有中断
while(1) // 无穷回圈,程序一直跑
{
while(IE0) //等待中断标志位
{
LED=(SHIFT<<i); //左移一位
i=(++i)%8; //调整移位位置
IE0=0; //清中断标志位
}
}
} // 主程序结束
控制数码管(c):
/*数码管中断控制实验 (数码管七段输出8闪烁,若有中断产生,
七段笔划A、B、C、D、E、F依次来回逐个点亮3轮后又循环复原。)*/
//===================声明区=================================
#include <reg51.h> // 定义8051暂存器之标头档
#define LED P2 //定义LED端口
unsigned char SHIFTL=0x01; //LED显示初始状态
unsigned char SHIFTR=0x20; //LED显示初始状态
unsigned char i;
void delay1ms(int x); //延迟函数
//===================中断程序================================
void service_int0(void) interrupt 0 using 1
{
unsigned char j;
for(j=0;j<3;j++)
{
while(LED!=0xdf) //七段笔划A、B、C、D、E、F依次顺时针方向逐个点亮3轮
{
LED=~(SHIFTL<<i);
delay1ms(500);
i=(++i)%6;
}
while(LED!=0xfe) //七段笔划F、E、D、C、B、A依次逆时针方向逐个点亮3轮
{
LED=~(SHIFTR>>i);
delay1ms(500);
i=(++i)%6;
}
}
}
//===================主程序==================================
main() // 主程序开始
{
IT0=1; //外部中断1控制为边沿触发方式(下降沿有效)
EX0=1; //允许INT0中断
EA=1; //开放所有中断
while(1) // 无穷回圈,程序一直跑
{
LED=0x00; //数字8闪烁
delay1ms(500);
LED=0xff;
delay1ms(500);
}
} // 主程序结束
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x)
{ int i,j; // 声明整数变数i
for(i=0;i<x;i++) // 计数x次,延迟约*1ms
for(j=0;j<120;j++); // 计数120次,延迟约1ms
}
控制外部中断(c):
//按钮控制发光二极管,每按一次按钮,按顺序循环移动点亮一位
#include<reg51.h>
unsigned char temp;//中间变量
//定义键
sbit k0=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
sbit k5=P1^5;
sbit k6=P1^6;
sbit k7=P1^7;
void main()
{
EA=1;//cpu开中断
EX0=1;//外部中断0开中断
EX1=1;//外部中断1开中断
IT0=1;//外部中断0设置为下降沿触发方式
IT1=1;//外部中断1设置为下降沿触发方式
PX0=1;//外部中断0设置为高优先级
P0=0xff;//开始全都不亮
temp=0xfe;//设置发光二极管初始状态
while(1);//等待中断
}
void ext0(void )interrupt 0 using 0 //外部中断0
{
P0=temp;//点亮相应指示灯
temp=temp<<1|1;//修改灯状态
if(temp==0xff)
temp=0xfe;
}
void ext1(void )interrupt 2 using 0 //外部中断1
{
if(k0==0)//判断K0,如果不是,继续判断下一个
{
P0=0xFF;//灯全灭
}
else if(k1==0)//判断K1,如果不是,继续判断下一个
{
P0=0x0;//灯全亮
}
else if(k2==0)//判断K2,如果不是,继续判断下一个
{
P0=0x55;
}
else if(k3==0)
{
P0=0x7;
}
else if(k4==0)
{
P0=0x0f;
}
else if(k5==0)
{
P0=0x1f;
}
else if(k6==0)
{
P0=0x3f;
}
else if(k7==0)
{
P0=0x7f;
}
}
中断及优先级(c):
/*中断优先级控制实验 (INT0低级中断,控制P2口数码管;INT1为高级中断,控制P1口数码管;
主程序控制P0口数码管*/
//===================声明区=================================
#include <reg51.h> // 定义8051寄存器头文件
#define SMG_ZHU P0 //定义主程序控制的数码管端口
#define SMG_INT1 P1 //定义外部中断1控制的数码管端口
#define SMG_INT0 P2 //定义外部中断0控制的数码管端口
#define uchar unsigned char
uchar code TABP[10]= // 共阳7节显示器(g~a)编码
{ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, // 数字0-4
0x92, 0x82, 0xf8, 0x80, 0x90, // 数字5-9
};
void delay1ms(int x); //延迟函数
//===================中断程序================================
void service_int0(void) interrupt 0 using 1
{
uchar i;
for(i=0;i<10;i++)
{
SMG_INT0=TABP[i]; //显示数字0~9
delay1ms(500);
}
SMG_INT0=0xff;
}
void service_int1(void) interrupt 2 using 2
{
uchar i;
for(i=0;i<10;i++)
{
SMG_INT1=TABP[i]; //显示数字0~9
delay1ms(500);
}
SMG_INT1=0xff;
}
//===================主程序==================================
main() // 主程序开始
{
IT0=1; //外部中断0控制为边沿触发方式(下降沿有效)
IT1=1; //外部中断1控制为边沿触发方式(下降沿有效)
PX1=1; //外部中断1为高优先级
EX0=1; //允许INT0中断
EX1=1; //允许INT1中断
EA=1; //开放所有中断
while(1) // 无穷回圈,程序一直跑
{
uchar i;
for(i=0;i<10;i++)
{
SMG_ZHU=TABP[i]; //显示数字0~9
delay1ms(500);
}
}
} // 主程序结束
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x)
{ int i,j; // 声明整数变数i
for(i=0;i<x;i++) // 计数x次,延迟约*1ms
for(j=0;j<120;j++); // 计数120次,延迟约1ms
}
中断计数(c):
/*中断计数实验 (P0十位数码显示;P2口控制个位数码显示;
使用外部中断0*/
//===================声明区=================================
#include<reg51.h> //定义8051寄存器头文件
#define SMG_SW P0 //定义十位数码显示端口
#define SMG_GW P2 //定义个位数码显示端口
#define uchar unsigned char //定义uchar数据类型
uchar DATA_SW; //定义保存十位数据变量
uchar DATA_GW; //定义保存个位数据变量
uchar k; //保存计数值变量
uchar code TABP[10]= //共阳7节显示器(g~a)编码
{ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, // 数字0-4
0x92, 0x82, 0xf8, 0x80, 0x90, // 数字5-9
};
void delay1ms(int x); //延迟函数
//===================中断程序================================
void service_int0(void) interrupt 0 using 1
{
k++;
DATA_GW=k%10;
DATA_SW=k/10;
}
//===================主程序==================================
main() // 主程序开始
{
IT0=1; //外部中断0控制为边沿触发方式(下降沿有效)
EX0=1; //允许INT0中断
EA=1; //开放所有中断
while(1) // 无穷回圈,程序一直跑
{
SMG_GW=TABP[DATA_GW]; //显示个位数字
SMG_SW=TABP[DATA_SW]; //显示十位数字
delay1ms(500);
}
} // 主程序结束
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x)
{ int i,j; // 声明整数变数i
for(i=0;i<x;i++) // 计数x次,延迟约*1ms
for(j=0;j<120;j++); // 计数120次,延迟约1ms
}
自动防盗报警器(c):
//自动防盗报警器
//功能要求:
//任意输入低电平,报警器响并显示。
//报警后有其他位置的传感器送来低电平,
//喇叭继续响,显示会随之改变。
//也就是记忆之前所有低电平,
//直到按复位,清除记忆,停止报警。
//
//每个输入信号出现低电平,都可以引起外中断0的中断。
//在外中断0的中断服务程序中,查询P2口的每个输入信号,
//判断中断信号来自哪里,然后输出报警信号:显示和声音
#include<reg51.h> //引用库定义
void delayms(unsigned int t);//延时声明
unsigned char out,temp; //定义中间变量
void main()
{
EA=1; //允许外中断0,初始化
EX0=1;
IT0=1; //外中断0下降沿触发
out=0xff; //输出开始值全1
P1=0x00; //试验输出效果
delayms(300);//延时
P1=0xff; //试验完毕
while(1); //死循环,等待中断(出现情况报警)
}
//以下外中断0的中断服务程序
//程序循环检测扩展的中断输入信号,
//只要某输入端产生过负脉冲,就自动记忆,
//脉冲过去了也还记得,显示也不会消失。
//只要开始报警,本服务程序就不结束,直到复位
void ext0(void )interrupt 0 using 0
{
temp=P2; //读取传感器状态
out=out&temp; //保存当前报警状态
P1=out; //输出
}
void delayms(unsigned int t)//延时子程序,约1毫秒
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<124;j++);
}
?
中断控制移灯:
//按钮控制发光二极管,每按一次按钮,按顺序循环移动点亮一位
#include<reg51.h> //引用库定义
unsigned char temp;//临时变量
void main()
{
EA=1;//cpu开中断
EX0=1;//外部中断0开中断
IT0=1;//外部中断0设置为下降沿触发方式
P0=0xff;//开始全都不亮
temp=0xfe;//初始值
while(1);//等待中断
}
void ext0(void )interrupt 0 using 0 //外部中断0
{
P0=temp;
temp=temp<<1|1;//修改灯状态
if(temp==0xff)
temp=0xfe;
}
?
?
扩展外部中断:
?
|