- 实验目的要求
实验目的:
- 熟悉、掌握单片机外部中断的基本原理
- 掌握单片机中断处理函数的编程方法
- 实验内容
实验内容:
- 调试代码,验证功能
- 根据开发板原理图,移植代码
- 矩阵按键中断控制电路及编程
- 实验过程
项目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);
}
仿真电路:
与门的作用是为了可以同时监测所有按键的脉冲变化。
运行结果: