求一个单片机外部中断程序,要求用按键模拟单片机外部中断输入源,当按键按下时产生中断,进行中断处理 15
1、打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并添加STARTUP.A51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。
2、首先要导入51单片机的头文件,否则后续使用的端口都会出现未定义的情况,然后在主函数中,使得EA=1,即总中断允许,打开中断的总开关。
3、然后分别打开外部中断0和外部中断1的分开关,即EX0=1和EX1=1。
4、编写完主函数后,我们要为两个中断分别编写对应的中断服务函数,才能在中断发生后产生相应的响应,注意外部中断0和外部中断1的中断号分别是0和2。
5、然后到Project菜单中的output项目中勾选Create Hex File,OK后点击编译按钮,如果没有错误,即可生成可以烧录或者仿真的.hex文件。
6、最后把生成出的.hex烧入进51单片机进行运行或者装载入Proteus仿真系统进行仿真。
你要的连接在P1口上,写的时候没注意,用了p2口,不过都是一样。如果有什么不明白的地方,可以再问。
/*P2口连接8个发光二极管,用来反映中断程序处理过程.
中断未发生时,LED做闪烁状态,当有中断产生,LED呈流水灯操作
*/
#include<reg52.h> //52单片机头文件
#include<intrins.h> //单片机内部子函数
#define uint unsigned int //定义uint为无符号整型
#define uchar unsigned char
//延时函数
void delay()
{
uint a=30000;
while(a--)_nop_();
}
//主函数
void main()
{
P2=0xff; //P2口初始化
do
{
P2=~P2; //让LED闪烁
delay(); //调用延时函数
}while(INT0==1);
EA=1; //开总中断
EX0=1; //允许外部中断0
}
//中断服务程序
void srv_INT0() interrupt 0
{
uchar a=0xfe; //定义中间变量
while(INT0==0) //开关闭合,产生中断
{
P2=a;
a=_crol_(a,1); //循环左移
delay();
}
P2=0xff; //关闭所有的led,避免干扰
}
void main()
{
EX0=1;
EA=1;
IT0=1;
while(1)
{
P1=0x00;
//延时
P=0xff;
//延时
}
}
void T() interrupt 0
{
P=0xfe;延时;P=0xfd;延时;P=0xfb;延时;P=0xf7;延时;P=0xef;延时;P=0xdf;延时;P=0xbf;延时;P=0x7f;延时;
}
延时程序自己写一个。