×
单片机 > 单片机程序设计 > 详情

Interrupt(单片机中断)

发布时间:2020-06-22 发布时间:
|

    所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。 

   proteus原理图:


1.外部中断:

 代码:

#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp;                     //声明一个全局变量
void delay(uint delay_time);
void main()
{
 EA=1;    //开总中断
 EX0=1;   //开外部中断0
 IT0=0;   //设置有效方式为低电平有效
 while(1)
 {
  uint i;
  P0=0XFE;
  delay(1000);
  for(i=0;i<7;i++)
  {
   P0=P0<<1;
   delay(1000);
  }
  P0=0xff;
  delay(1000);
 }
}

void delay(uint delay_time)
{
 uint x,y;
 for(x=delay_time;x>0;x--)
  for(y=112;y>0;y--)
  {;}
}

void INTERRUPT() interrupt 0  //中断后执行内容(这个不用声明)
{
 EA=0;
 temp=P0;             //temp做传递变量,保证中断结束后继续中断发生时的操作
 P0=0xff;
 delay(1000);
 P0=temp;
 EA=1;
}
proteus仿真结果:





    

2.定时器中断

代码:

#include
#include
#define uint unsigned int
#define uchar unsigned char
uint n;                           //全局变量
uchar code table_led[]={         //这个亮灯的16进制码
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xff};
void main()
{
 n=0;
 TH0=(65536-20000)/256;          //赋初值
 TL0=(65536-20000)%6;
 TMOD=0X01;                     //设置工作方式为工作方式1(16位计数器) 

 EA=1;                          //开总中断
 ET0=1;                        //开定时器中断0
 TR0=1;                         //启动定时器中断0
 while(1)
 {
  switch(n/50)                   //没20ms一次中断,20*50=1s
  {
   case 0: P0=table_led[8]; break;
   case 1: P0=table_led[0]; break;
   case 2: P0=table_led[1]; break;
   case 3: P0=table_led[2]; break;
   case 4: P0=table_led[3]; break;
   case 5: P0=table_led[8]; break;
   case 6: P0=table_led[4]; break;
   case 7: P0=table_led[5]; break;
   case 8: P0=table_led[6]; break;
   case 9: P0=table_led[7]; break;
  } 
 }
}

 

void INTERRUPT( ) interrupt 1
{
 TH0=(65536-20000)/256;
 TL0=(65536-20000)%6;
 n++;
 if(n==500)
 n=0;
}


关键字:Interrupt  单片机中断

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式