1单片机外部中断应用

#include "reg51.h"

typedef unsigned int u8;

#define led P2   //整个P2口都被定义为led

sbit k3=P3^2;
sbit k4=P3^3;

void yanshi(u8 z)
{
     while(z--);
}

void Int_Init()////外部中断配置
{
    EA=1;         //打开中断允许总控制位
	  EX0=1;        //外部中断0中断允许位 
 	  IT0=1;        //设置为脉冲触发,下降沿有效 
}

void main()             //主函数执行
{
	  led=0xff;           //设置状态为全亮
   Int_Init();
	 while(1);            //while(1);是一条指令,它让单片机停在这个位置道
	                      //一般用来检测中断,只有cpu收到中断指令,才会跳出while(1)
	                      //进入中断服务子程序;
}

void int0 () interrupt 0 using  0//2.写此程序的时候要注意中断标准和中断号是否是对应的
{                                //这里为外部中断0的中断函数
	   yanshi(1000);
     if(k3==0)
     {
		 led=~led;                   //这里将小灯的状态反转
		 }
}

写外部中断时应该看清楚电路图 P32,P33口是外部中断0和1的位置

2蜂鸣器

#include "reg51.h"

sbit fen=P1^5;
sbit k2=P3^0;

void dealy(int x)
{
  while(x--);
}

void main()
{
 while(1)
 {
	 if(k1==0)//判断按键是否按下
	 {
	    dealy(100);
	    if(k1==0)//判断按键是否按下
	      {
	       fen=~fen;//执行蜂鸣器状态的反转,如果按键一直按,那么一直延时反转,就会响
	       dealy(10);
	      }
	 }
 }
}

按照开发板的图片来蜂鸣器接的口为p1.5;

1.此时将外部中断与蜂鸣器连起来综合运用

#include "reg51.h"

typedef unsigned int u8;

sbit fen=P1^5;
sbit led=P2^0;
sbit k3=P3^2;
u8 z=0;

void dealy(u8 x)
{
  while(x--);
}

void Int_Init()
{
    EA=1;         //打开中断允许总控制位
	  EX0=1;        //外部中断0中断允许位 
 	  IT0=1;        //设置为脉冲触发,下降沿有效 
}

void main()
{
	led=0;
	Int_Init();     //调用外部中断的函数
 while(1);
}

void int0 () interrupt 0
{      	
	   dealy(1000);
     if(k3==0)
     {	
			 for(z=0;z<10000;z++)
			 {
        fen=~fen;
				dealy(10);
			 }
		 }

}

此时只需要按下k3将会有大约1s的蜂鸣器的叫声

3.按下k3闪烁不按高四位亮的中断应用

#include "reg51.h"

typedef unsigned int u8;

#define led P2 //定义整个2脚
sbit key=P3^2;
u8 z;

yanshi(u8 x)
{
 while(x--);
}

void Int_Init()
{
    EA=1;         
	  EX0=1;        
 	  IT0=1;        
}

void main()
{
	led=0xf0;
	Int_Init();
	while(1); 
		
}

void int0 () interrupt 0 using  0
{                                
	   yanshi(1000);
     if(key==0)
     {               
			  for(z=0;z<8;z++)
			 {
				yanshi(5000);
                led=~led;
				yanshi(5000);
			 }		 
		 }
}
4.定时器的 一些用法解析

4.定时器中断的一些详解(带程序)

#include "reg52.h"

 typedef unsigned char u8;
 typedef unsigned int u16;
 u8 wei[3];

   sbit LSA = P2^2;//138译码器端口定义
   sbit LSB = P2^3;
   sbit LSC = P2^4;
	 
	 u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c,
					0x39, 0x5e, 0x79, 0x71}; //0~F数码
	 
	 u8 ge,shi=0,bai=0,c,z=1;
					
	 
void delay(u8 x){while(x--);}

void Timer0_Init() //初始化定时器
{
   TMOD = 0x01;		//定时器0方式1
   TH0 = 0;
   TL0 = 0;	  //定时器的计数起点为0
   TR0 = 1;	//启动定时器0
}

void weishu()//各个位的位数显示
 {
  wei[0]=smgduan[ge];
	wei[1]=smgduan[shi];
	wei[2]=smgduan[bai];	
 }
 
void xs()//数字显示
 {
          u8 i;
					for(i=0;i<z;i++)
           {
							switch(i)
								{
								case 0:
										LSC = 0;LSB = 0;LSA = 0;break; //显示第1个数码管
								case 1:
										LSC = 0;LSB = 0;LSA = 1;break; //显示第2个数码管
								case 2:
									LSC = 0;LSB = 1;LSA = 0;break; //显示第3个数码管
								}
					 
			P0=wei[i];//显示0-9的数值
	    delay(10); //延时,造成视觉暂留现象
	    P0 = 0x00; //数码管消隐
	}
 }
 
void main()
 {
  Timer0_Init();
	 while(1)
   {
	 if(TF0 == 1) //检测定时器0是否溢出,每到65535次
		{
			TF0=0;
			c++;
			if(c==14)	 //71ms乘以14为1s
			{
				c=0;
			  ge++;
				if(ge==10){ge=0;shi++;z=2;}//3个判断分别包含开启3个数码管显示
				if(shi==10){shi=0;bai++;}
				if(bai>0){z=3;}
			}
		}
	 weishu();//调用位数数字
				 xs();//显示数字
	 }
 
 }

一个0-999的一秒加数器。

5.利用定时器中断调制输出占空比为0.3的pwm波

#include "reg52.h"

typedef unsigned int u8;
u8 z=0,x=0;

sbit pwm=P2^0;//定义pwm输出口

void Timer1Init()
{
	TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

	TH1 = 0xFF; 
	TL1 = 0xff;   //1us
		
	ET1=1;//打开定时器1中断允许
	EA=1;//打开总中断
	TR1=1;//打开定时器			
}


void main()
{
 Timer1Init();
 while(1)
 {
   if(z>10000)//一个周期
   {
			z=0;
		  x=0;
   }
	  if(x<=3000)//高电平的持续时间
		 {
			pwm=1;
		 }else//低电平的持续时间
		 {
			pwm=0;
		 }
 }
}

void Time1(void) interrupt 3    //3 为定时器1的中断号
{
	TH1 = 0xFF; 
	TL1 = 0xff;   //1us
	z++; 
  x++;
	
}