stc89c52的中断系统系列之——外部中断

项目需求

使用外部中断实现使用独立按键控制led的亮灭
一、需求分析
1、三个关键词
  • 外部中断
  • 独立按键
  • led亮灭
2、要实现一个中断系统如何做?
  • 初始化外部中断系统INT0/INT1
 void init()
 {
 	EA=1;	//打开单片机总中断允许位
 	IT0=1;	//设置外部中断触发方式为跳变沿(下降沿)
 	EX0=1;	//打开外部中断INT0的中断允许
 }
  • 给定一个空的空载主程序
void main()
{
	while(1)
	{
	}
}
  • 设置中断子程序(本项目需求)
void int0() interrupt 0
{
	delay(1000);	//延时消除按键机械抖动
	if(k3==0)
	{
		led=~led;	//led取反
	}
}
二、如何将以上的三个关键词整合
1、完成以上三个关键词所需要的辅助函数
  • delay软件延时函数
void delay(u8 i)
{
	while(i--);
}
2、完成本程序所需要的预处理过程
  • 类型声明
    在delay函数中用到数据类型u8,所以要在程序开头声明u8类型
typedef unsigned char u8;
  • 端口位定义
    在本程序中一共用到两个单片机I/O口
    1、led电平控制端口:P2^0;
    2、INT0和k3按键电平控制端口:P3^2
sbit led = P2^0;
sbit k3 = P3^2;
三、完整程序如何写?
#include<reg52.h>
typedef unsigned char u8;	//u8类型声明
sbit led=P2^0;	//led定义
sbit k3=P3^2;	//k3定义

void delay(u8 i)	//延时函数在这里
{
	while(i--);
}

void init()	//中断系统初始化部分在这里
{
	EA=1;
	IT0=1;
	EX0=1;
}

void main()	//主程序在这里
{
	init();
	while(1)
	{}
}

void int0() interrupt 0	//中断子程序在这里
{
	delay(1000);
	if(k3==0)
	{
		led=~led;
	}
}
四、难点讨论(答案下期更新)
1、为什么INT0外部中断系统使用跳变沿(下降沿)触发方式?
2、为什么在中断子程序中led取反后不用延时就可以看到效果?
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值