图5-28外部中断子情境原理图
5.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图
开始 中断子程序 声明变量 流水灯左移7, 右移7次 中断设定 no 数码管顺序显示 3次? yes 继续执行主程序 主程序 中断子程序
图5-29 外部中断流程图
(2)源程序设计 #include
#include
#define uchar unsigned char #define uint unsigned int
sbit d1=P1^0; //定义P1口的第一个引脚 char i,j,m,n,temp,k; uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x98,0x88,0x83,
0xa7,0xa1,0x06,0x8e};//共阳极数码管编码 void delay(int z); void main() { }
void my_int0() interrupt 0 //外部中断0的中断服务程序:中断后流水灯上
下循环三次
{
temp=0xfe; //给流水灯赋初值 P1=temp; // 让第一个灯点亮 for(k=0;k<3;k++)// 实现循环三次的功能 {
EA=1; //中断总允许 EX0=1; //允许外部中断0中断
IT0=0; //外部中断0的触发方式为低电平触发 while(1) { }
for(i=0;i<16;i++) //主程序一直在从事顺序显示数字的工作 { }
P0=table[i]; //将段码逐个送至P0口 delay(500); //延时500ms
for(m=0;m<7;m++)//左移7次
{
delay(200);
temp=_crol_(temp,1);//库函数里面的循环左移函数,将
temp的值左移一位后重新赋给temp
}
P1=temp; //将左移一位后的temp值送P1口显示
for(n=0;n<7;n++)//右移7次
{
delay(200);
temp=_cror_(temp,1);//库函数里面的循环右移函数,将
temp的值右移一位后重新赋给temp
}
}
}
P1=temp;//将右移一位后的temp值送P1口显示
delay(200); d1=1;
void delay(int z)//延时子函数 { }
5.4.3 步骤三:PROTEUS仿真
加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮
,出现文件浏览对话框,找到
,启动
int x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--);
zhongduan.hex文件,单击“打开”按钮,完成添加文件。单击按钮仿真,仿真运行片段如图5-30、5-31、5-32所示。
图5-30中是主程序的运行片段,主程序中数码管从0至F顺序显示
图5-31中,按下按钮后,在单片机P3.2引脚上有低电平,立即产生中断,数码管从0至F顺序显示的工作停下来,流水灯上下循环移动三次。
图5-32中,完成中断服务程序后,返回主程序原断点处继续执行,数码管接着原来的数字继续顺序显示。
图5-30主程序中数码管从0至F顺序显示
图5-31按下按钮后数码管停下来,流水灯上下循环移动三次
图5-32完成中断服务程序后,返回主程序原断点处继续执行,数码管接着
原来的数字继续顺序显示。
5.5 扩展练习
主程序中数码管从0至9顺序显示数字,中断发生后(在单片机P3.2引脚上有低电平),数码管从9至0反序显示。