一、要求
在CT107D单片机综合训练平台上,先将J5处的跳线帽接到2~3引脚,使S5按键接到单片机P3.2口(P3.2功能复用时是外部中断0触发端口)。定义一个working()函数,使L1不断闪烁。将P3.2引脚定义为外部中断功能,按下S5就会产生外部中断0信号,进而触发外部中断0.在中断响应函数中,点亮L8,延时较长一段时间后熄灭。
二、外部中断
外部中断相关概念参考:
??????【蓝桥杯—单片机学习笔记(七)】什么是中断_Backlight__的博客-CSDN博客
三、硬件电路分析
如图所示按键S5直接接在单片机P3.2,所以在程序中可以直接将P3.2口定义为外部中断功能即实现上述要求。
?本次实验中还涉及到使用LED,LED相关硬件电路分析可以参考:
【蓝桥杯—单片机学习笔记(一)】LED指示灯的基本控制_Backlight__的博客-CSDN博客
四、程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit L1 = P0^0;
sbit L8 = P0^7;
void delay_ms(uchar xms) //@11.0592MHz
{
uchar i,j;
while(xms)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
xms--;
}
}
void channel_select(uchar n) //开启LED数码管的译码器通道
{
switch(n)
{
case 4 :
P2 = (P2 & 0x1f) | 0x80;
break;
case 5 :
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6 :
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7 :
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void led_working() //LED不断闪烁
{
channel_select(4);
L1 = 0;
delay_ms(1000);
L1 = 1;
delay_ms(1000);
}
void int0_init() //初始化外部中断0
{
IT0 = 1; //设置外部中断0是下降沿触发
EA = 1; //开总中断
EX0 = 1; //使能外部中断0
}
void system_init() //系统初始化
{
channel_select(5); //关闭蜂鸣器和继电器
P0 = 0x00;
channel_select(4); //关闭LED
P0 = 0xff;
}
void main()
{
system_init();
int0_init();
while(1)
{
led_working();
}
}
void service_int0() interrupt 0 //外部中断0服务函数
{
L8 = 0;
delay_ms(3000); //让L8点亮久一些
delay_ms(3000);
delay_ms(3000);
delay_ms(3000);
L8 = 1;
}
|