外部中断0的应用案例(代码注释详细,适合51单片机初学者)

一、案例要求:

有8个LED小灯,默认状态下小灯全亮,编写程序通过单一外部中断0控制LED灯,每按一次按键,中断服务程序内容为低4位led和高4位led交替闪烁3次,中间间隔1s;松开按键后,恢复常亮状态。注:本小题只用一个按键,定时器用T1工作方式1。

二、案例分析:

本案例需用到定时器精准定时1s,要求为T1工作方式1,假定晶振频率为12MHZ,则方式1的最大定时时间为65536us,可以定时50000us,即50ms,循环20次即是1000ms=1s,就可以满足题目的时间要求;其次要用到外部中断0,由于51单片机外部中断0的信号是从P3.2进入,所以按键应该接到P3.2口,按下一次按键,便进入到中断服务程序,执行高四位和低四位LED交替闪烁的程序,执行完中断服务程序后,恢复到原始状态(全亮)。

三、案例代码:

#include<reg51.h>
//定时器1工作方式1,定时1s函数
void time1s()
{
	unsigned int i;
	      
	for(i=0;i<20;i++)    //每次定时50ms,循环20次便是1s
	{
		TH1=(65536-50000)/256;        //定时器初值高8位
		TL1=(65536-50000)%256;      //定时器初值低8位
		TR1=1;                                    //开启T1
		while(!TF1);                             //查询T1是否溢出
		TF1=0;                                    //T1溢出后将标志位TF1清零
	} 
}


void main()
{	
	TMOD=0x10;  //设置工作方式为T1工作方式1
	
	EX0=1;      //外部中断0允许
	EA=1;       //总中断允许
	IT0=0;      //外部中断0为下降沿触发方式
	while(1)   //默认状态(未中断时),所有灯常亮
	{
		P1=0;   
	}
}

void int0() interrupt 0    //外部中断0中断服务函数
{	
	unsigned char m,n;          
	n=P1;                    //保护现场,将常亮的状态暂存n
	for(m=0;m<3;m++)         //执行中断的功能,高四位低四位灯交替闪烁,中间间隔1s
	{	
		P1=0x0f;             
		time1s();
		P1=0xf0;             
		time1s();
	}   
	P1=n;              //恢复现场,将上述暂存的状态还给P1,继续执行中断前的效果
}

三、案例仿真:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值