高分!急求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.而输入有三个,还有一个引脚我也不知道怎么弄,该用什么引脚。

89c51单片机的数字钟程序?
\/\/启动外部中断 SETB IT0 SETB IE0 SETB EX0 SETB PX0 SETB IT1 SETB IE1 SETB EX1 SETB PX1 SETB EA CLR 00H \/\/没有调整中断 CLR 01H \/\/闪空 MOV 4DH,#04H \/\/0xFC MOV P3,#0FH MOV 62H,46H \/\/从分开始闪 MOV 63H,47H \/\/十位数*** MOV 50H,#3FH MOV 51H,#06H MOV 52H,#5BH ...

急求51单片机c语言简易程序:二个输入口,分别控制三个输出口
sbit Key1=P3^2;\/\/输入1,不能更改 sbit Key2=P3^3;\/\/输入2,不能更改,因为 51外部中断就这两个IO口是 sbit Out1=P0^0;\/\/输出1 sbit Out2=P0^1;\/\/输出2 void Delay(uint del){ uint i,j;for(i=0; i<del; i++)for(j=0; j<1827; j++);} void INT_Init(){ EX0 = ...

89C51单片机外部中断按键的中断程序 帮忙做一个外部中断子程序,谢谢
P1.0,P1.1并不是中断引脚,你如何让其触发中断?P3.2,P3.3才是中断引脚

at89c51单片机对应高低电平的电压值
能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。EA\/VPP:访问外部程序存储器控制信号。为使能从0000H 到...

89c51单片机有几组I\/O口,请简单介绍其主要功能
4组,P0可以作普通IO口,也可以在读写外部存储器作低8位的地址总线和8位的数据总线;P1口只作为一般IO口;P2作为一般IO口还在在读写外部存储器作高8位的地址总线;P3口除作为一般IO口还为第二输入\/输出功能(P3.0 串行数据接入端;P3.1 串行数据发送端;P3.2 外中断0输入端 ;P3.3 外中断1输入...

51单片机有几个中断源?
TCON)---定时器和外部中断的控制 4)串行口控制寄存器(SCON)---串行中断的控制 中断类型分为三类:1)T0、T1是2个定时器\/计数器中断,由片内定时器提供;2)INT0、INT1是2个外部中断,由引脚P3.2和P3.2提供;3)RX、TX为串行口中断所用,由片内串口提供。

8051单片机三种状态输出的程序
单个IO口不能控制电压。所以可以这样:找一个三端电位器,固定端接在两个IO口上,可变端引出作输出。然后让两个IO分别输出1和0,再调节电位器使输出正好为2.5V。只要两口都置1,输出就是5V;都置0,输出就是0V;一个1一个0,就输出2.5V。注意:调节时两口的输出状态不能互换,否则就不是2....

AT89C51和AT89S51的区别?
·5个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路 管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I\/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据\/地址的第八位。在...

试用89c51串行口扩展io口,控制16个发光二极管发光,画出电路并编写显示程...
include #define uchar unsigned char #define uint unsigned int \/\/ 加黑的都是定义头文件sbit led0=P2^0;sbit led1=P2^1;sbit led2=P2^2;sbit led3=P2^3;sbit led4=P2^4;sbit led5=P2^5;sbit led6=P2^6;sbit led7=P2^7;...

单片机89c51与89c52的区别
3、32个双向I\/O口;4、256x8bit内部RAM;5、3个16位可编程定时\/计数器中断;6、时钟频率0-24MHz;7、2个串行中断,可编程UART串行通道;8、2个外部中断源,共8个中断源;9、2个读写中断口线,3级加密位;10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;11、有PDIP、PQFP、TQFP及PLCC等...

相似回答