高分!急求89C51单片机外部中断程序。有三个外部中断源,控制3个IO口的输出。C语言编写。随时在线可在线聊

3个外部中断是一个一个来的,第1个为低电平有效,后面两个为负跳变有效,当进入第一个中断,P0.0口输出低电平,P0.1口输出高电平,延时1.5S后P0.0口输出高电平。当进入第二个中断,延时1.11S后P0.2口输出低电平,然后高0.15S,低0.3S,高0.3S,低0.58S,高0.12S,低1.08S,高2.55S,低0.47S,高0.075S,高低电平很多次这样。当进入第三个中断,P0.1口输出低电平。如此循环。还有一点需要说明的是。第一个中断低电平有效,会有好几次低电平。而中断只能第一次低电平时进入。后面再有低电平不能再进入中断。如果说进入第一次中断时就关闭第一个中断,那什么时候再打开?是循环的。如不打开,下次又怎么进入第一个中断?QQ:229809984
还是麻烦哪位高手帮我编好这个程序发给我吧!我是初学者,根本就不会编这样的程序,先谢过了。程序可用,再加分!

//下列程序基本正确,剩下一些脉冲宽度定时,可自行完成。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;

sbit k_1 = P3^0; //第一个输入

uchar t_10ms, k3;
//--------------------------------------
DL_x_10ms(uchar x)
{
t_10ms = 0;
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256; //定时10ms@12MHz
TR0 = 1; //启动定时.
while(t_10ms < x); //不到x*10ms,原地等待.
TR0 = 0; //关闭定时.
}
//--------------------------------------
void main(void)
{
TMOD = 01; //T0定时方式1
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256; //定时10ms@12MHz
TR0 = 0; //暂时不启动.
ET0 = 1;

IT0 = 1;
IT1 = 1;
EX0 = 0;
EX1 = 0;

EA = 1;
k3 = 1;
while(1) { //
//--------------------------------------
while((k_1 == 1) || (k3 == 0));//K1没有按,或者 K3尚未执行 原地等待.
//K1按了一次,就往下执行.
while(k_1 == 0); //等待K1释放.
k3 = 0; //以后K1按下两次、三次...,也不会执行.

//进入第一个中断,P0.0口输出低电平,P0.1口输出高电平,延时1.5S后P0.0口输出高电平。.
P00 = 0; P01 = 1;
DL_x_10ms(150);
P00 = 1;
EX0 = 1; //开放INT0(K2)中断
//循环到前面,等待(K1按下且K3=1)
}
}
//--------------------------------------
T0_INT() interrupt 1
{
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256; //定时10ms@12MHz
t_10ms++;
}
//--------------------------------------
X0_INT() interrupt 0 //K2输入下降沿,将进入本函数
{
//进入第二个中断,延时1.11S后P0.2口输出低电平,然后.
DL_x_10ms(111);
P02 = 0; //P0.2口输出低电平
//输出低电平多少时间?题目没有说。
//---------------------
//高0.15S,
P02 = 1; //P0.2口输出高.
DL_x_10ms(15);
//---------------------
//低0.3S,
P02 = 0; //P0.2口输出低电平.
DL_x_10ms(30);
//下面的定时,可以自行编写
//高0.3S,
//低0.58S,
//高0.12S,
//低1.08S,
//高2.55S,
//低0.47S,
//高0.075S,高低电平很多次这样。.
EX0 = 0;
EX1 = 1; //开放INT1(K3)中断
}
//--------------------------------------
X1_INT() interrupt 2
{
//当进入第三个中断,P0.1口输出低电平。.
P01 = 0;
EX1 = 0;
k3 = 1; //=1,将在主函数中有用
}
//--------------------------------------追问

您的程序我下到开发板里试了第一个中断是进入了没问题,我再按K2 K3按键LED灯都没反应,应该是没有进入中断吧!第三个中断执行完了第一个中断源还会最后发生一次,这次也是不能进入中断的。看能不能就是第三个中断执行完了,第一个中断源发生的时候只是打开第一个中断,而不是进入第一个中断,这样就可以循环了我是这样想的。三个中断也不是要全部只执行一次,只是第一个中断只能执行一次。直到又重新开始时第一个中断才再次执行

追答

添上一行:
void main(void)
{
TMOD = 01; //T0定时方式1
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256; //定时10ms@12MHz
TR0 = 0; //暂时不启动.
ET0 = 1;
PT0 = 1; //在这里加上这一句
…… //后面的不变
另外,你说:第一个中断只能执行一次。直到又重新开始时第一个中断才再次执行....
请说明:什么是重新开始?
还有:第二个,第三个,是先后发生吗?,是各出现一次吗?

追问

重新开始是这样的,就是第三个中断执行完了,第一个中断源过几S或几十S还会最后发生一次,而这最后一次也不能进入中断的,我们可以把这最后一次做结束的标志,如第一个中断源最后发生一次之后,过段时间又发生了第一个中断源,那就是重新开始了。第一中断也可以负跳变有效的。

第二个 第三个是先后发生的。是各出现一次。

追答

再稍做修改即可。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-08
程序还是你自己写吧,给你一些提示:
1、定义三个函数,在中断程序处面实现三个任务功能,万万不能在中断函数中实现。
2、定义三个开关量,分别用来控制三个函数。
3、在中断函数里面增加一个计数器,区别三个中断。
4、在中断里面关闭中断,在三个任务函数中再开启中断,也就任务函数完成任务之后设置中断、开启中断,关闭开启此任务函数的开关量。追问

不是很明白,我是初学者,这个程序我也根本就不会写。

追答

那你就坐等人给人发程序吧!我已经不用单片机好长时间了,电脑上也没有装这些软件了。

追问

那也谢您了,我再等等吧!

第2个回答  2011-03-08
低电平中断,在进入后就要关掉它,等它电平变为高的时候再打开喽,可以在主循环中判断。如果主程序事情多,也可以开个定时中断来判断电平变高。(电平的高低变化不是us级的吧)
为啥一定要用低电平中断呢,那个口不支持边沿中断?还是设计要求必须低电平中断。追问

高电平再打开,那当他又进入低电平了,那不是又要进入第一个中断了,那个口也支持边沿中断,问题就是3个中断的工作过程当中,第一个中断源的电平是经常高低变化的,当进入第三个中断,P0.1口输出低电平,过几S后,也有时十几S第一个中断源还会低电平一次。最后才结束,再重新开始。如此循环的。

追答

你是想,一个循环三个中断都只能分别中断一次吗?那你就在每次循环结束后再打开嘛。

追问

第三个中断程序结束后,过几S,也有时十几S,第一个中断还会低电平一次,才再次循环的,可在没循环之前第一个中断是不能再次进入的。如在第三个中断程序结束后第一个中断打开,那不是第一个中断又进入了。

追答

如果说,第三个中断完成后,过几或十几S 第一个中断口上必定会低电平一次,那么你可以做个标志位把这必来一次中断放弃,就是进入后,标志为1则把标志清零后,直接跳出来。(中断还是设成边沿的好)等下次再来低电平就可以正常运行了,也就再次进入一次循环。

第3个回答  2011-03-08
楼主的要求,并不是中断。
只是顺序控制器而已,用C编程,很简单的。
只是一些定时时间的规定,很是麻烦。
楼主的三个输入,用的是什么引脚?追问

也可以这么说,收到哪个信号再控制哪个输出,按顺序来。可收到哪个信号再控制,应该是要进入中断的吧!我只知道两个外部中断,INT0, INT1.而输入有三个,还有一个引脚我也不知道怎么弄,该用什么引脚。

相似回答