实验3 单片机外部中断及应用

本次的内容是关于51单片机的简单中断的代码。

!!!理解51单片机中断是最为基本的,51单片机中断的简单应用只包括三步:

第一步:设置中断;第二步:允许中断;第三步:判断哪个中断优先允许;

以上三步分别对应三个寄存器区,分别是TCON,IE,和IP,这三类寄存器的定义和内容请查课本或者直接百度,网上有非常多的解释和应用。

下面是代码区:

1.按键K1按下后8LED灯能够立即呈现全亮状态。

2. 实现按键K1按下不松开的情况下,LED灯持续闪烁。(备注:这里我使用了中断1和按键k2,并没有严格按照要求,但是效果相同);

3. 中断嵌套实验

当独立按键K1K2都未按下时,P1口的8LED全亮;仅K1按下一次(按下后立即松开)时,上下各4LED交替闪烁10次,然后再回到8LED全亮状态;如果在LED交替闪烁期间按下K2时,LED暂停闪烁,同时蜂鸣器鸣叫,直到K2松开后,蜂鸣器停止鸣叫,且LED继续闪烁。

void main(void)
{

	TCON=0x05;//两个外部中断全开
	EX1=0;//打开中断0允许
	EX0=1;	//在主函数初始化处禁止中断1,这是为了满足实验要求,没有特殊含义。
	IT1=1;//IT1 IT0是设置触发模式的,1为电平触发。
	IT0=1;
	PX1=1;//中断优先级设置,为1的是高优先级
	PX0=0;//如果不进行设置的画,中断是有默认优先级的
	//默认优先级是中断0高于中断1;
	EA=1;//打开总中断允许
	p1=0xff;
	p3=0xff;//p2和p1无所谓要不要赋值0xff,但是p3或者说按键k1和k2一定要设置为输入模式,即0xff
	p2=0xff;
	while(1)
	{
		p1=0x00;
	}
}
//中断函数设置为  void intn() interrupt1 n using1 x
//interrupt1 后的n为中断号,0-5,0是外部中断0,2是外部中断1,其他为定时器与串行口;
//using1  后的x为寄存器区号,有0-4个区。
/* 	void int0() interrupt 0 using 0
	{
		EX0=0;
		p1=0x00;
		delay(1000);
		EX0=1;
	}
 */

void int0() interrupt 0 using 0
{	
		uchar m;
	EX0=0;//ban int0
	for(m=0;m<5;m++)
	{
		p1=0x0f;
		delay(500);
		p1=0xf0;
		delay(500);
		EX1=1;//保证随时能够在循环中跳出
	}
	p1=0;
	EX1=0;//禁止led闪烁结束后再用中断1跳出
	EX0=1;
} 
void int1() interrupt 2 using 1
{
	EX1=0;
	p1=0xff;
	delay(10);
	while(k2!=1)//按键按住的情况下p2持续闪烁,提供频率给蜂鸣器
	{

		delay(10);
 		p2=0;
		delay(10);
		p2=0xff;
		delay(10); 
	}
	EX1=1;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值