89C51共有5个中断源,中断入口地址如下:
外部中断0:0x0003
定时/计数器中断0:0x000B
外部中断1:0x0013
定时/计数器中断1:0x001B
串行口中断:0x0023
//下列程序基本正确,剩下一些脉冲宽度定时,可自行完成。
#include <reg51h>
#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); //不到x10ms,原地等待
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按下两次、三次,也不会执行
//进入第一个中断,P00口输出低电平,P01口输出高电平,延时15S后P00口输出高电平。
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输入下降沿,将进入本函数
{
//进入第二个中断,延时111S后P02口输出低电平,然后
DL_x_10ms(111);
P02 = 0; //P02口输出低电平
//输出低电平多少时间?题目没有说。
//---------------------
//高015S,
P02 = 1; //P02口输出高
DL_x_10ms(15);
//---------------------
//低03S,
P02 = 0; //P02口输出低电平
DL_x_10ms(30);
//下面的定时,可以自行编写
//高03S,
//低058S,
//高012S,
//低108S,
//高255S,
//低047S,
//高0075S,高低电平很多次这样。
EX0 = 0;
EX1 = 1; //开放INT1(K3)中断
}
//--------------------------------------
X1_INT() interrupt 2
{
//当进入第三个中断,P01口输出低电平。
P01 = 0;
EX1 = 0;
k3 = 1; //=1,将在主函数中有用
}
//--------------------------------------
以上就是关于89C51单片机的中断系统共有几个中断源全部的内容,包括:89C51单片机的中断系统共有几个中断源、高分!急求89C51单片机外部中断程序。有三个外部中断源,控制3个IO口的输出。C语言编写。随时在线可在线聊、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)