单片机c语言写两个中断,两个中断怎么写

设计实现多优先级中断嵌套下的小灯变化。输入为开关S0、S1,分别接INT0、INT1引脚。要求外部中断1优先级高,外部中断0优先级低。输出用P0接8盏小灯。用S0控制小灯D0-D3,用S1控制D4-D7。主程序循环控制8盏小灯流水变化。若有S0按下,则小灯同时闪烁10下。若有S1按下,则小灯实现3次跑马灯变化。

下面是我写的,运行错了。不是太懂中断。谁能帮我改进

//任务6 显示按键按下的次数(中断方式)
//任务6 显示按键按下的次数(中断方式)
#include <reg51.h> //1 包含特殊功能寄存器定义头文件reg51.h
#define ledport P2 //2 宏定义:ledport代表P2(发光二极管接P2口)
#define uchar unsigned char //3 宏定义:uchar代表unsigned char
#define ulong unsigned int //3 宏定义:ulong代表unsigned long
#define unsigned int j;
uchar m=0xef; //5 定义变量m:m用来保存显示控制数据,初值为0xfe
ulong i;
sfr p1=0x90;
sbit led1=P1^0; //led引脚定义
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;

void fun1_int() interrupt 0 using 1//5 定义中断服务函数:中断号为0,用第1组寄存器组
{
while(1) //while循环(永远为真,死循环)
{ //循环体开始
led1=~led1; //发光二级管的显示状态取反
led2=~led2;
led3=~led3;
led4=~led4;

for(j=0;j<12500;j++); //for循环,循环体为空,耗时 //延时500ms
}
} //循环体结束

void fun2_int() interrupt 1 using 2//5 定义中断服务函数:中断号为0,用第1组寄存器组
{

while(1) //7 while循环,条件表达式为1,永远为真,死循环
{ //8 while循环体开始
P1=m; //9 P1口输出当前显示控制数据
m=(m<<1)|(m>>7); //10 显示数据m向左循环移1位,为下次显示输出作准备
for(i=0;i<60000;i++); //11 for循环实现1s延时,循环体为空语句
} //12 while循环体结束
}

//8 中断服务函数结束
void main(void) //9 main函数
{
EA=1;
EX0=0; //12 开外部中断0
EX1=0;
IT1=1;
IT0=1; //11 设置外部中断0的触发方式:下降沿触发。见代码说明

while(1)
; //14 死循环,循环体为空语句
} //15 main函数结束
//任务1 控制1只发光二极管闪烁显示
上面的注释可以省略不看,

//任务6 显示按键按下的次数(中断方式)
//任务6 显示按键按下的次数(中断方式)
#include <reg51.h> //1 包含特殊功能寄存器定义头文件reg51.h
#define ledport P2 //2 宏定义:ledport代表P2(发光二极管接P2口)
#define uchar unsigned char //3 宏定义:uchar代表unsigned char
#define ulong unsigned int //3 宏定义:ulong代表unsigned long
#define unsigned int j;
uchar m=0xef; //5 定义变量m:m用来保存显示控制数据,初值为0xfe
ulong i;
sfr p1=0x90;
sbit led1=P1^0; //led引脚定义
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;

void fun1_int() interrupt 0 using 1//5 定义中断服务函数:中断号为0,用第1组寄存器组
{
while(1) //while循环(永远为真,死循环)
{ //循环体开始
led1=~led1; //发光二级管的显示状态取反
led2=~led2;
led3=~led3;
led4=~led4;

for(j=0;j<12500;j++); //for循环,循环体为空,耗时 //延时500ms
}
} //循环体结束

void fun2_int() interrupt 1 using 2//5 定义中断服务函数:中断号为0,用第1组寄存器组
{

while(1) //7 while循环,条件表达式为1,永远为真,死循环
{ //8 while循环体开始
P1=m; //9 P1口输出当前显示控制数据
m=(m<<1)|(m>>7); //10 显示数据m向左循环移1位,为下次显示输出作准备
for(i=0;i<60000;i++); //11 for循环实现1s延时,循环体为空语句
} //12 while循环体结束
}

//8 中断服务函数结束
void main(void) //9 main函数
{
EA=1;
EX0=0; //12 开外部中断0
EX1=0;
IT1=1;
IT0=1; //11 设置外部中断0的触发方式:下降沿触发。见代码说明

while(1)
; //14 死循环,循环体为空语句
} //15 main函数结束
//任务1 控制1只发光二极管闪烁显示上面的注释可以省略不看,

这个需要设置不同的寄存器,注意依稀俺这里就可以了的,然后查一下数据手册。追问

能不能详细点我中断才学,不太懂

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-05-18
用S0控制小灯D0-D3,用S1控制D4-D7。
主程序循环控制8盏小灯流水变化。

--------
楼主把主程序,先编好。
之后,再加上中断部分。追问

就是不懂怎么编,我们老师从来不讲为什么,直接让编程序。

追答

主程序循环控制8盏小灯流水变化。
----
这还不会呀?

http://blog.163.com/asm_c/blog/static/2482031132013118115304/

参考。
以后,你再加上中断。

本回答被网友采纳
相似回答