【51单片机】外部中断控制LED和数码管

目录

一、外部中断控制LED

1、main.c

2、Delay.c

3、Delay.h

二、外部中断控制数码管加减

1、main.c

2、Nieix.c

3、Nixie.h

4、Delay.c

5、Delay.h

仿真 

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。

一、外部中断控制LED

程序一开始一直在while中执行,每当按下一次按键便会执行一次中断,执行中断中的程序。

1、main.c
#include <REGX52.H>
#include "Delay.h"

sbit Led1 = P2^0;
sbit K3 = P3^2;

void Int0(void)
{ 
	IT0=1;								//设置Int0 边沿触发
	EX0=1;								//开放外部Int0中断允许
    EA=1;								//开放CPU中断允许;
}


void main(void)
{
    Int0();						  	    //中断初始化
	while(1);
}

void Timer0_Routine(void) interrupt 0   //中断函数,外部中断0
{	
	Delay(20);
	if(K3 == 0){Delay(20); while(K3 == 0); Led1 =~ Led1;}//延时消抖,检测松手
}
2、Delay.c
void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms--)
	{
	i = 2;
	j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}
3、Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

二、外部中断控制数码管加减

51单片机的K3、K4按键分别对应INT0(外部中断0)、INT1(外部中断1)引脚,通过按键向单片机申请中断,每中断一次实现变量加1或减1,并将结果显示在数码管上。

1、main.c
#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"

unsigned char Number = 0;

void Int(void)
{ 	
	IT0=1;								//设置Int0 边沿触发
	EX0=1;								//开放外部Int0中断允许
	IT1=1;								//设置Int1 边沿触发
	EX1=1;								//开放外部Int1中断允许
	EA=1;								//开放CPU中断允许;
}

void main(void)
{
    Int();					  	   //中断初始化
	while(1)
	{
		Nixie(1, Number / 10);//显示十位	
		Delay(1);
		Nixie(2, Number % 10);//显示个位
	}
}

void Init0(void) interrupt 0  //中断函数,外部中断0
{	
	if(Number != 99)
	{
		Number++;		
	}	
	else 
	{
		Number = 0;
	}
}

void Init1(void) interrupt 2  //中断函数,外部中断1
{	
	if(Number != 0)
	{ 
		Number--;		
	}		
	else
	{
		Number = 99;
	}
}
2、Nieix.c
#include <REGX52.H>
#include "Delay.h"


unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//阴极数码管段码:0--9

void Nixie(unsigned int Location, Number)//位码
{
	switch(Location)
	{
		case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	P0 = NixieTable[Number];
	Delay(1);//稳定清零
	P0 = 0x00;//消影:将上一位数据清零
}
3、Nixie.h
#ifndef __NIXIE_H__
#define __NIXIE_H__

void Nixie(unsigned int Location, Number);

#endif
4、Delay.c
void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms--)
	{
	i = 2;
	j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}
5、Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

仿真 

(有点乱,能用就行)

此文为个人笔记,如有错漏还请各位看官指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值