中断是单片机中很重要的一部分,很多外部响应都要通过中断来告知CPU,从而做出相应的处理。






 
编程实验:六位数码管从0~F循环显示,当P3.2口有低电平时,执行中断程序使P1.0口发光二极管亮。中断程序执行完后继续执行主程序,六位数码管从0~F循环。</STRONG>
程序:
#include              //定义头文件
#define uint unsigned int     
#define uchar unsigned char    //宏定义变量类型
void delay (uint);             //子程序声明
sbit dula=P2^6;
sbit wela=P2^7;                              //定义位选 段选
sbit d1=P1^0;                  //定义d1=P1.0口
uchar num;                                   //定义num为uchar类型
uchar code table[]={           //定义数组 0~16
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};
 
void main()                    //主函数开始
{    
      
       EA=1;                                    //开总中断
       EX0=1;                                  //开外部中断0
       IT0=1;                     //中断为边沿触发方式
       wela=1;                                  //位选开
       P0=0xc0;                               //让6位数码管全亮
       wela=0;                    //位选关
              while(1)
                     {
                     for(num=0;num                             {
                            d1=1;
                            dula=1;
                            P0=table[num];  //num从0开始数码管累加显示
                            dula=0;
                            delay(1000);    //延时
                            }
                     }    
}
void delay(uint z)              //延时子程序
{
       uint x,y;
       for(x=z;x>0;x--)
              for(y=110;y>0;y--);      
}
void exter() interrupt 0       //中断函数 exter为函数名可以自己起
{                                                      //interrupt 0代表中断类型为外部中断0
       d1=0;                          //中断子程序 让P1.0亮
delay(2000);                    
}
PROTEUS仿真结果
 
 
下面来看定时器中断







 
编程实验1:让6位数码管按照定时器中断设定的时间从0~F循环变化</STRONG>
程序:
#include//定义头文件
#define uint unsigned int//宏定义       
#define uchar unsigned char 
sbit dula=P2^6;//定义段选
sbit wela=P2^7;//定义位选
uchar num,tt;//num,tt为uchar型变量
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};//数组
 
void main()
{    
       num=0;
       tt=0;
       TMOD=0x01; //规定定时器T0的工作方式
       TH0=(65536-50000)/256;
       TL0=(65535-50000)%256;//给定时器装入初值
    EA=1;//总中断允许开  
       ET0=1; //T0中断允许开
       TR0=1;//定时器T0开始工作
      
       wela=1;  //位选开
    P0=0xc0;//给P0口送11000000
       wela=0; //位选锁存
       dula=1; //段选开
       P0=0x3f;//给P0口送0
       dula=0;//段选锁存
 
       while(1)
       {
              if(tt==20)                 //tt从0开始累加,加10次后tt回零
                     {   tt=0;
                            num++;             //num从零开始累加,变到16回零
                            if(num==16)
                              num=0;
                            dula=1;
                            P0=table[num];     //每次循环显示table数组中的值
                            dula=0;
                    
                     }
      }
 
 
 
}
 
void exter0() interrupt 1    
{
       TH0=(65536-50000)/256;       //计数器初值设定为500MS,20个500毫秒为2秒
       TL0=(65535-50000)%256;       //每500毫秒触发一次中断,20次后num+1
       tt++;                                          //中断子程序运行tt次
}
 
PROTEUS仿真结果:

 
编程实验2 :用延时程序让发光二极管间隔1秒流水灯变化,用定时器中断让数码管间隔2秒从0~F静态显示变化。</STRONG>
程序:
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num;
sbit dula=P2^6;
sbit wela=P2^7;
void delay(uint z);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
 
 
void main()
{
       num=0;
       aa=0;
       TMOD=0x01;
       TH0=(65536-50000)/256;
       TL0=(65536-50000)%256;
    EA=1;
       ET0=1;
       TR0=1;
 
       temp=0xfe;
       P1=temp;
       dula=1;
       P0=table[0];
       dula=0;
       wela=1;
       P0=0xc0;
       wela=0;
 
       while(1)
       {
              delay(1000);
              temp=_crol_(temp,1);
              P1=temp;
       }
}
void delay (uint z)
{
       uint x,y;
       for(x=z;x>0;x--)
              for(y=130;y>0;y--);
}
void time0() interrupt 1
{
       TH0=(65536-50000)/256;
       TL0=(65536-50000)%256;
       aa++;
              if(aa==40)
              {
                     aa=0;
                     num++;
                     if(num==16)
                            num=0;
                            dula=1;
                            P0=table[num];
                            dula=0;
 
              }
}
 
我这个人比较懒,这篇日志中大量引用了郭天翔视频教程中的图片,图片版权归郭天翔所有。
第二个实验我录了一段实验视频,可是传到优酷后该视频违反相关规定被屏蔽了。可能教程类的视频管理比较严吧。如果有人想看请留邮箱地址。
 阅读全文>>