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

2024-11-26 05:25:37
推荐回答(4个)
回答1:

//下列程序基本正确,剩下一些脉冲宽度定时,可自行完成。
#include
#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,将在主函数中有用
}
//--------------------------------------

回答2:

程序还是你自己写吧,给你一些提示:
1、定义三个函数,在中断程序处面实现三个任务功能,万万不能在中断函数中实现。
2、定义三个开关量,分别用来控制三个函数。
3、在中断函数里面增加一个计数器,区别三个中断。
4、在中断里面关闭中断,在三个任务函数中再开启中断,也就任务函数完成任务之后设置中断、开启中断,关闭开启此任务函数的开关量。

回答3:

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

回答4:

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