实验六外部中断实验一
一、实验要求
1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2.P1口上拉接8个LED;
3.在Keil软件中编写程序,对LED显示进行控制,显示方式有两种:(1)0、7亮,1、
6亮,2、5亮,3、4亮,0、7亮循环;(2))3、4亮,2、5亮,1、6亮,0、7亮,
3、4亮循环。
4.在P3.2连接一个按键,当按键弹起时引脚为高电平,当按键按下时引脚为低时平
5.编写程序:系统对LED显示进行控制,一开始显示方式为(1),当按下P3.2连接
的按键时,系统在(1)和(2)之间切换显示方式
二、实验目的
1.学习端口输入输出的高级应用
2.掌握LED查表显示法
3.掌握外部中断的工作原理
4.掌握外部中断程序设计
三.实验说明
(条理清晰,含程序的一些功能分析计算)
1.程序中void my_int(void) interrupt 0 using 1
{ flag=!flag;} //中断子程序是中断子程序,就是按键按下中断一次。
2.以下是灯亮的方式改变,即flag取反一次就改变一次。
通过i++或i—实现
变化。
while(1)
{ P1=LED[i]; //在P1口显示灯亮的方式
delay_ms(500); //延时0.05s
if(flag) //判断P3^2开关是否按下
{i++;
if(i>=4) //如果灯显示从两边到中间要在回到两边
i=0;}
else{i--;
if(i<0)//同上
i=3;}
四、硬件原理图及程序设计
(一)硬件原理图设计
(二)程序流程图设计
是
开始
定义变量
i=0;flag=1;
P0=LED[i];
Flag ?
i++; 否 i--;
P3.3按下时进行中
断
Flag=flag!;
(三)程序设源代码
#include<reg51.h>
#define led P0
//1MS延时子程序
void delay_ms(int x){ //延时程序
int i,j;
for(i=0;i<x;i++){
for(j=0;j<120;j++);}
}
char i=0,flag=1; //设定整体变量
char LED[4]={0X7E,0XBD,0XDB,0XE7}; //查表显示的LED代码
void delay_ms(int i);
main(){
EA=1; //开总开关
EX0=1;//开中断小开关
IT0=1;
while(1)
{ P1=LED[i]; //在P1口显示灯亮的方式
delay_ms(500); //延时0.05s
if(flag) //判断P3^2开关是否按下
{i++;
if(i>=4) //如果灯显示从两边到中间要在回到两边
i=0;}
else{i--;
if(i<0)//同上
i=3;}
}
}
void my_int(void) interrupt 0 using 1
{ flag=!flag;} //中断子程序
五.实验总结
3.当我们没用外部中断实现灯亮方式变化时,要判断P3.3口是否按下。
这种
方法比较不好,按键要按就点才可以改变。
4.我们仿真图中灯管脚要与程序中的对应。
5.灯亮的间隔时间要设置合适。
实验七外部中断实验二
一、实验要求
1.在数码管动态显示实验中的电路图基础上,绘制两个按钮K1和K2,一端分别与单
片机P3.2和P3.3引脚,当按键弹起时引脚为高电平,当按键按下时引脚为低时平
2.在Keil软件中编写程序, 采用动态显示法,主程序让实现数码管分别显示数字1,
2,3,4,当K1按下时数字顺序向右移一位显示,当K2按下时数字顺序向左移一
位显示
二、实验目的
1.掌握7段数码管的连接方式和动态显示法
2.巩固中断的知识,学会外部中断的使用
3.掌握查表程序、中断服务子程序和延时等子程序的设计
三.实验说明
1.对程序的用查表法显示1234.当要移位时用中断对j++,就是每按下按键就
加一,而另外一个中断j--。
2.查表时我们的表数据是1,2,3,4,1,2,3,4这样就可以实现移位,这
种方法比较简单。
四、硬件原理图及程序设计
(一)硬件原理图设计
(二)程序流程图设计
(三)程序设源代码
#include<reg51.h>
sbit P3_2=P3^2;
sbit P3_3=P3^3;
//1MS延时子程序
void delay_ms(int x){ //延时子程序(x)ms
int i,j;
for(i=0;i<x;i++){
for(j=0;j<120;j++);}
}
char TAB[8]={0XF9,0Xa4,0Xb0,0X99,0XF9,0Xa4,0Xb0,0X99}; void delay_ms(int i);
char j=0,a=0,b=0,c=0;
main(){
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
a=j+1;
b=j+2;
c=j+3;
while(1)
{
a=j+1;
b=j+2;
c=j+3;
P2=TAB[j];//P2口显示数据1
P0=0X01; //P0口选择显示第一个数码管
delay_ms(5);//延时0.005s
P0=0X00;
P2=TAB[a];//P2口显示数据2
P0=0X02; //P0口选择显示第一个数码管
delay_ms(5);//延时0.005s
P0=0X00;
P2=TAB[b]; //P2口显示数据3
P0=0X04; //P0口选择显示第一个数码管
delay_ms(5);//延时0.005s
P0=0X00;
P2=TAB[c]; //P2口显示数据4
P0=0X08; //P0口选择显示第一个数码管
delay_ms(5);//延时0.005s
P0=0X00;
if(j>3)j=0;
if(j<0)j=3;
}
}
void zd0() interrupt 0 using 1
{ j++;}
void zd1() interrupt 2 using 1
{ j--;}
五.实验总结
1.在写程序时我是用了查表法,这样比静态显示1234程序比较简单。
2.而我的两个按键刚好放在P3_2和P3_3,这样我们就可以用到两个中断判断
按键是否按下。
中断比按键去抖动好。