单片机学习(2)------中断操作

1、按钮S0接在51单片机的 P3.3(INT1)引脚上,P1口接了8个发光二极管,编程实现:初始状态时,LED0灯亮,其它灯灭,利用S0按钮控制P1口的灯(中断方式),要求每按一下就点亮一盏灯( 前面点亮的保持点亮的状态 )
代码:

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar ledstatus_1;
uchar ledstatus_2;
bit flag;                  //标志位,中断后赋予1
uint i=0;
void wint1() interrupt 2
{
	flag=1;
}	
void main()
{
	/*中断初始化*/
	IT1=1;
	EX1=1; EA=1;
	ledstatus_1=0xfe;           //开始LED灯的状态
	P1=ledstatus_1;
	while(1)
	{
		if(flag)
		{
			if(i<7)																		//用于判断是否是否进行了一轮
			{																					//即当灯全亮后恢复开始的状态
				ledstatus_2=_crol_(ledstatus_1,1);      //ledstatus_2保存ledstatus_1循环左移后的数
				ledstatus_2=ledstatus_2&ledstatus_1;		//进行相与,这样就可以保持低位灯不灭
				P1=ledstatus_2;
				ledstatus_1=ledstatus_2;
				flag=0;
				i=i+1;																	
			}
			else
			{
				ledstatus_1=0xfe;
				P1=ledstatus_1;
				flag=0;                                 //这个恢复后需要将标志位设位0
				i=0;																		//否则一轮后的初始状态就会出现两个灯亮
			}
		}	
	}
}

电路图:
在这里插入图片描述
2、按钮S0接在51单片机的 P3.3(INT1)引脚上,P1口接了8个发光二极管,编程实现:初始状态时,P1口控制的灯按一定的频率闪烁;按一下S0,触发 外部中断1(INT1),实现单灯 右移 (即按LED7至LED0的顺序依次点亮)3圈结束,恢复初始状态。

代码:

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define LED P1	
void delay(int xms)        //延时函数
{
	uint i,j;
	for(i=0;i<xms;i++)
	for(j=0;j<120;j++);
}
void right(int x)      		//右移
{
	int i,j;
	for(i=0;i<x;i++)
	{
		LED=0x7f;
		for(j=0;j<7;j++)
		{
			delay(250);
			LED=_cror_(LED,1);       //循环右移
		}
		delay(250);
	}
}
void my_interrupt() interrupt 2     //中断函数
{
	unsigned saveLED=LED;  		//储存中断前LED状态
	right(3);									//调用单灯右移3圈
	LED=saveLED;							//写回中断前LED状态
}
void main()
{
	/*中断初始化*/
	IT1=1;
	EX1=1; EA=1;
	LED=0X00;
	while(1)
	{
		delay(250);
		LED=~LED;            //开始LED等闪烁
	}
}

电路图:
在这里插入图片描述
3、51单片机的P1.7引脚外接一个发光二极管D1,P3.2(INT0)引脚外接信号发生器(Single generator)。编程实现:首先通过P1.7口点亮发光二极管D1,然后信号发生器每输入10个脉冲触发一次中断,使D1灯亮、灭交替一次。
代码:

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define LED P1
void delay(int xms)        //延时函数
{
	uint i,j;
	for(i=0;i<xms;i++)
	for(j=0;j<120;j++);
}
void left(int x)      		//左移
{
	int i,j;
	for(i=0;i<x;i++)
	{
			LED=0xfe;
			for(j=0;j<7;j++)
			{
				delay(250);
				LED=(LED<<1)|0x01;       //左移
			}
			delay(250);
	}
}
void right(int x)      		//右移
{
	int i,j;
	for(i=0;i<x;i++)
	{
			LED=0x7f;
			for(j=0;j<7;j++)
			{
				delay(250);
				LED=(LED>>1)|0x80;       //右移
			}
			delay(250);
	}
}
void my_int_right(void) interrupt 2     //中断函数
{
	unsigned saveLED=LED;  		//储存中断前LED状态
	right(3);									//调用单灯右移3圈
	LED=saveLED;							//写回中断前LED状态
}
void my_int_left(void) interrupt 0     //中断函数
{
	unsigned saveLED=LED;  		//储存中断前LED状态
	left(3);									//调用单灯右移3圈
	LED=saveLED;							//写回中断前LED状态
}
void main()
{
	/*中断初始化*/
	IT1=1;
	EX1=1; 
	IT0=1;
	EX0=1;
	EA=1;
	IP=0x04;
	LED=0X00;
	while(1)
	{
		delay(250);
		LED=~LED;            //开始LED等闪烁
	}
}

电路图:
在这里插入图片描述
4、P1口接8个发光二极管,P3.2和P3.3接两个按钮开关模拟两个外部中断源。平常8个灯以一定频率闪烁,按键S0按下触发中断,控制8个灯左移(即按D1至D8的顺序依次点亮)3圈,按键S1按下触发中断,控制8个灯右移(即按D8至D1的顺序依次点亮)3圈(右移的中断优先级高于左移)。

代码:

#include<reg51.h>
#define uint unsigned int
sbit P1_7=P1^7;
uint i = 0;							//脉冲计数
void interrupt0() interrupt 0 using 2
{	
	i++;
	if(i==10)   //10个脉冲亮灭循环一次
	{
		i=0; 
		P1_7=~P1_7;	
	}
}
void main()
{
	EA=1;   //中断允许
	IT0=1;	//脉冲触发
	EX0=1;  //外部中断0
	P1_7=0; //led灯初始状态
	do{}while(1);
}

电路图:
在这里插入图片描述
所有代码和电路图:https://download.youkuaiyun.com/download/qq_43556844/15087408

实验三 中断实验 一、实验内容 1.当单片机的INT0端出现负脉冲时,进入相应的中断服务程序,P1口做输出口,接 8只发光二极管,通过程序控制发光二极管依次点亮。 2.选择外部中断0(P3.2)接按键INTO到地,按下出现负脉冲时,进入相应的中断服 务程序,在中断服务程序中,数码管显示加1,在0-9之间循环。 二、实验目的 1、学习外部中断技术的基本使用方法。 2学习中断处理程序的编程方法。 三、实验原理 (中断原理部分参考教材填写) 本实验中断处理程序的应用,最主要的地方是如何保护进入中断前的状态,使得中断 程序执行完毕后能回到交通灯中断前的状态。要保护的地方,除了累加器ACC、标志寄存 器PSW外,还要注意。一是主程序中的延时程序和中断处理程序中的延时程序不能混用, 本实验中,主程序延时用的寄存器和中断延时用的寄存器应不相同。 四、实验电路 (参考学习板说明书Page11) 五、接线方式 (参考学习板说明书Page11) P1口接发光二极管的L1—L8;单脉冲输出端" "接INI0,即接89C51的P3.2管脚。 六、参考程序 "程序一、 " "ORG 0030H " "tmpdate: DB 01H,02H,04H,08H,10H,20H,40H,80H " "/*定义常量做为输出*/ " "ORG 0000H " "LJMP MAIN " "ORG 0003H " "LJMP INT " " " "MAIN: SETB EA /*首先开启总中断 */ " "SETB EX0 /*开启外部中断 0 */ " "SETB IT0 /* 设置成 下降沿触发方式*/ " "MOV R7,#8 " "MOV DPTR,#TMPDATE " "L0: SJMP L0 //等待中断 " " " " " "INT: DJNZ R7,L1 /*外部中断 0 每按一次主板上的"INT0"键,中 " "断响应,调用该函数,我们从P1口输出点亮发光二极管*/ " "MOV R7,#8 " "L1: MOV A,R7 " "MOVC A,@A+DPTR " "CPL A " "MOV P1,A " "RETI " "END " " " "程序二、/***************************************************" "************ " "功能:按下按键,数码管加1,用中断的方法 " "作者:txl " "时间:2009-04 " "版本:V1.0 " "************************************************************" "***/ " " " "#include<reg52.h> " "#define uint unsigned int " "#define uchar unsigned char " " " " " "sbit wei1=P2^0; " "sbit key1=P3^2; " " " "uchar code table[]={0xC0,0xF9,0xA4,0xB0, " "0x99,0x92,0x82,0xF8, " "0x80,0x90,0x88,0x83, " "0xC6,0xA1,0x86,0x8E};//共阳数码管码表 " "//全局变量 " "uchar num; " "//函数声明 " "void delay(uint z); " "void led_show(uchar temp); " " " "void main() " "{ " "num=0; " "// IT0=1; //中断以下降沿方式触发 " "IT0=0; //中断以低电平方式触发 " "EX0=1; //允许外部中断0中断 " "EA=1; //总中断开 " " " "wei1=0; " " " "while(1) " "{ " "led_show(num); //显示 " "} " " " "} " " " "/***********************************************************" "**** " "功能:外部中断0入口 " "************************************************************" "***/ " "void EX0_Int() interrupt 0 " "{ " "EX0 = 0; //关中断 " "num++; " "if(num==10) " "num=0; " " " "while(!key1);//消除抖动 " "delay(5); " "while(!key1); " "// for(;!key1;); //等待
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值