51单片机中断例1

写中断之前 我们先要了解 中断在哪
常用的有外部中断 计时器中断 串行口中断

这里我们用外部中断

1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。

2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。

3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。

4、TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。

5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

EA: 总中断允许。 EA=0;CPU屏蔽所有中断的请求 EA=1;开放所有中断。
ES:串行口中断允许位。ES=0; 禁止串行中断。ES=1; 允许串口中断。
ET0、ET1: 定时器/计数器0 和 定时器/计数器 1 中断允许位 =0时 禁止相应的定时器中断。 =1 允许相应的定时器中断。
EX0、EX1: 外部中断0 和 外部中断 1 中断允许位。=0时 禁止相应的外部中断。 =1时 允许相应的外部中断。

(1:代表允许中断 0 :代表禁止中断)

51单片机中断例1_第1张图片
常用原件图示和名称

中断程序

void check(){
		int i;
		beep=0;
		P0=num[0];
		P2=~(0x02);
		P1=~(0x01);
		for(i=0;i<=10;i++){
			dalay(1000);
			
		}
		beep=1;
}
void int0rupt() interrupt 0 //P3^2==0
{
	beep=1; //关闭蜂鸣器
	while(P3_2!=1);
	check();
	
}

较上一个红绿灯 我这个多了一个中断程序

这个·中断是 在按下按钮之后 进入中断 然后 进入10s的东西通行 南北禁止通行

倒计时秒表设为0 同时蜂鸣器响起

这个中断可以用在 一路放绿灯

整个proteus图片如下

51单片机中断例1_第2张图片

蜂鸣器响应电压应设置为2v 否则没有响应

演示视频

主要功能跟我上一个红绿灯差不多 只多了一个中断
七段码实现红绿灯

主程序

#include<reg51.h>
unsigned char num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit P3_2=P3^2;
sbit beep=P3^3;	
void dalay(unsigned int n){
	int i=0,j=0;
	for(i=0;i<n;i++)
			for(j=0;j<120;j++);
}


void solve(){
	int i=0;
	for(i=0;i<8;i++){
			P0=~(0x01<<i);
			dalay(1000);
	}
}

void leftgreen(){
	int i=0;
	P2=~(0x01);
	P1=~(0x04);
	
	for(i=0;i<10;i++){
			P0=num[9-i];
			dalay(1000);
	}
}

void leftred(){
	int i=0;
		P2=~(0x02);
		P1=~(0x01);
		
		for(i=0;i<10;i++){
				P0=num[9-i];
				dalay(1000);
		}
		
}
void yellow(){
	
	int i=0;
	for(i=0;i<4;i++){
			P0=num[3-i];
			P2=~(0x04);
			P1=~(0x02);
			dalay(500);
			P2=0xFF;
			P1=0xFF;
			dalay(500);
	}
}
void check(){
		int i;
		beep=0;
		P0=num[0];
		P2=~(0x02);
		P1=~(0x01);
		for(i=0;i<=10;i++){
			dalay(1000);
			
		}
		beep=1;
}
void int0rupt() interrupt 0 //P3^2==0
{
	beep=1;
	while(P3_2!=1);
	check();
	
}
void main(){
		EA=1;//
  	EX0=1;//
		IT0=0;//
		while(1){	
			P0=num[0];
			dalay(1000);
			leftgreen();
			P2=0xFF;P1=0xFF;
			P0=num[0];
			dalay(1000);
			yellow();
			P0=num[0];
			P2=0xFF;P1=0xFF;
			dalay(1000);
			leftred();
			P0=num[0];
			P2=0xFF;P1=0xFF;
			yellow();
			P0=num[0];
			P2=0xFF;P1=0xFF;

		}
}

你可能感兴趣的:(单片机,单片机,51单片机)