51开发板:STC89C52最小系统开发板(原理图见附件http://files.cnblogs.com/sunhuijian/Y-33%E6%9C%80%E5%B0%8F%E7%B3%BB%E7%BB%9F%E5%8E%9F%E7%90%86%E5%9B%BE.pdf)
开发工具:Keil uVersion4
操作系统:Win7
开发板是一个最小系统,不能够直接支持外部中断实验。因为INT0(P32),INT1(P33)引脚都未连接任何可用的器件。因此,我们需要自己做些连线。
分析一下原理图找找可用的资源:
P10: 连接一个LED,可以让ISP(中断例程)来控制该LED的亮灭;
P11:连接一个独立开关Key1,但是P11非外部中断引脚INT0或INT1,无法直接使用;Key4,Key5也是如此。
INT0(P3.2):引脚上没有连接任何器件,INT1同样。
以上的资源已经足够做一个中断实验了。外部中断引脚没有连接触发器件怎么办?这里我们将Key1对应的P11和INT0对应的P32使用杜邦线直接连起来。这样,Key1按下时,会同时将P11和INT0拉成低电平,这样我们就可以在INT0上检测到中断的发生了。
中断实验代码——C语言实现:
#include<reg52.h> //包含特殊功能寄存器的定义 #define LED P1 //宏定义LED代表P1 /******************************************************** 主程序 *********************************************************/ main() { LED=0xff; //P1口初始值,关闭led灯(这里其实只需要将控制P10的P1.0位置为1就可以了,但为了方便我们将整个P1的8bit全部置位了) EA=1; //全局中断开 EX0=1; //外部中断0开 IT0=0; //电平触发 while(1) { //在此添加其他程序,中断程序可以跟此处的程序同步执行 } } /**************************************************** 外部中断程序 *****************************************************/ void Key_INT(void) interrupt 0 using 1 { LED =~LED; //同样,这里只需要将P1.0清零即可点亮LED,但是为了方便,我们将整个P1的8bit全部清零了 }
中断实验代码——汇编实现实现:
ORG 0000H LJMP START ORG 0003H AJMP INT_0 ORG 0030H SETB P1.0 ;turn off led START: SETB EA ;enable interrupt SETB EX0 ;enavle INT0 CLR IT0 ;trigger by low level MAIN: ;Do what you want here AJMP MAIN INT_0: PUSH ACC PUSH PSW CPL P1.0 ;turn off/on led POP PSW POP ACC RETI END