单片机与嵌入式系统-中断实验

  • 实验目的要求

实验目的:

  1. 熟悉、掌握单片机外部中断的基本原理
  2. 掌握单片机中断处理函数的编程方法

  • 实验内容

实验内容:

  1. 调试代码,验证功能
  2. 根据开发板原理图,移植代码
  3. 矩阵按键中断控制电路及编程

  • 实验过程

项目1:

根据下面的的仿真图,调试下面的程序,运行程序,说明程序的功能。

实验代码:

#include<reg51.h>
sbit p0_4=P0^4;
unsigned char count;
//char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
char led_mod[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(unsigned int time){
  unsigned int j=0;
  for(time=time;time>0;time--)
      for(j=0;j<125;j++);
  }
key0() interrupt 0{
  P2 = ~P2;
  p0_4=!p0_4;//中断函数,采用中断源0,当端口P3.2发生脉冲变化时,将二极管点亮
  }
key1() interrupt 2{ 
  P2=led_mod[count];//中断函数,采用中断源2,当端口P3.3发生脉冲变化时,将按键次数输出到P2上。
  count++;
  if(count==16)
     count=0;
  }
void main(){
  count=0; //赋初值
  p0_4=1;
  P2=0xff;   //开机黑屏
  TCON=0X05;//0x05=00000101,IT1=1,IT0=1,脉冲触发方式
  IE=0X85; //EA=1,EX1=1,EX0=1,外部中断允许
  while(1);
  }  

仿真电路:

运行结果:

项目2:

根据普中实验箱原理图,对项目1源程序进行改造,使之在实验板上实现上述代码的功能。实验报告中给出实验箱所用电路的仿真截图,给出移植后的实验代码。(可以自行选择开发板中LED和数码管)

运行代码:

 

#include<reg51.h>
unsigned char count;
//char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
char led_mod[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(unsigned int time){
  unsigned int j=0;
  for(time=time;time>0;time--)
      for(j=0;j<125;j++);
  }
key0() interrupt 0{
  P0 = ~P0;//中断函数,采用中断源0,当端口P3.2发生脉冲变化时,将二极管取反。
  }
key1() interrupt 2{ 
  P0=~led_mod[count];//中断函数,采用中断源2,当端口P3.3发生脉冲变化时,将按键次数输出到P2上。
  count++;
  delay(100);
  if(count==16)
     count=0;
  }
void main(){
  count=0; //赋初值
  P2=0xfe;//赋位码
  P0=0x00;   //开机黑屏
  TCON=0X05;//0x05=00000101,IT1=1,IT0=1,脉冲触发方式
  IE=0X85; //EA=1,EX1=1,EX0=1,外部中断允许
  while(1);
  }  

仿真电路:

运行结果:

项目3:

采用矩阵按键中断的方式在8位数码管前两位显示按键值00-15,要求最初没有键按下时,数码管不亮。请给出设计思路和代码

运行代码:

#include<reg51.h>
#define  GPIO_KEY P1
unsigned char KeyValue = 0xff;
unsigned char code LED_table[10] = {0x3f,0x06,0x5b,0x4f,0x66,
                                        0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int time){
  unsigned int j=0;
  for(time=time;time>0;time--)
      for(j=0;j<125;j++);
  }

char getkey(void){
	char a=0;
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f){//读取按键是否按下
        delay(10);//延时10ms进行消抖 
        if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
 
                        {
                        //测试列
                        GPIO_KEY=0X0f;
                        switch(GPIO_KEY)
                                {
                                case(0X0e):{KeyValue=3;break;}
                                case(0X0d):{KeyValue=2;break;}
                                case(0X0b):{KeyValue=1;break;}
                                case(0X07):{KeyValue=0;break;}                                                      
                                }
                                          
                        //测试行
                        GPIO_KEY=0Xf0;
                        switch(GPIO_KEY)
                                {
                                case(0X70):{KeyValue=KeyValue;break;}
                                case(0Xb0):{KeyValue=KeyValue+4;break;}
                                case(0Xd0):{KeyValue=KeyValue+8;break;}
                                case(0Xe0):{KeyValue=KeyValue+12;break;}
                                }                                          
                         while(a<50) //检测按键松手检测
                        {
                                delay(10);
                                a++;
                        }
                }
        }
}
 
void display(unsigned char key){
        P2 = 0Xff;
        P0 = LED_table[key/10];
        P2 = 0X00;
        delay(10);
        P2 = 0Xff;
        P0 = LED_table[key%10];
        P2 = 0x01;
        delay(10);
}
  
key0() interrupt 0{
		char key = 0;
		P1 = 0xf0;
		while(1){
                getkey();
                if(KeyValue != 0xff)
                        display(KeyValue);
                }
	}
void main(){
  P2=0xff;//赋位码
  P0=0x00;//开机黑屏
  P1=0xf0;
  TCON=0X05;//0x05=00000101,IT1=1,IT0=1,脉冲触发方式
  IE=0X85; //EA=1,EX1=1,EX0=1,外部中断允许
  while(1);
  }  

仿真电路:

与门的作用是为了可以同时监测所有按键的脉冲变化。

运行结果:

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值