///////////////////////////////////////////////////////////////////////
实现功能: 测试外部中断0和外部中断1下降沿触发,因为实验板上的K3键与外部
中断0的引脚相连,K4与单片机的外部中断1相连,本实验要完成的测
试结果是,按下K3键时,即外部中断0触发,实验板上所以数码管上的
数加1,而按K4按下时,即外部中断1触发,数码管上的数值减1
实验板型号:BS-XYD-C52
实验名称: 外部中断0和外部中断1的应用
编写人: 谢应东
编写日期: 2012-4-27
///////////////////////////////////////////////////////////////////////
#include
#include
#define uchar unsigned char //定义unsigned char 为 uchar
#define uint unsigned int
uchar cCounter; //记录外部中断次数的变量
sbit Duan=P2^6;//定义数码管的段选使能端
sbit Wei =P2^7; //定义数码管的位选使能端
#define Digital_tube_Wei_Enable Wei=1;//开启控制数码管的位选使能端
#define Digital_tube_Wei_Disable Wei=0; //关闭控制数码管的位选使能端
#define Digital_tube_Duan_Enable Duan=1;//开启控制数码管的段选使能端
#define Digital_tube_Duan_Disable Duan=0;//关闭控制数码管的段选使能端
#define Digital_tube_Duan P0 //定义数码管数据端口
uchar code Dis_table[]= //将BCD码转换成数码管扫描码的数组
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code Dis_Position[]=//定义数码管位选的数组
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
///////////////////////////////////////////////////////////////////////
函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍:Delay_MS: 定义需要延时的毫秒的数值
iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
返回值: 无
注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
式完成,所以如果改变了晶振的频率,请做相应的改变
///////////////////////////////////////////////////////////////////////
void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber //用for语句实现单片机的延时
{
iValue=107; //107这个数值是通过测定而得
while(iValue--);
}
}
///////////////////////////////////////////////////////////////////////
函数名称:Init_INT0
函数功能:设置单片机的外部中断0和中断1,具体的设置状态都为外部低电平触发,并
且开总中断
参数介绍:无
返回值: 无
注意事项:无
///////////////////////////////////////////////////////////////////////
void Init_INT0()
{
EX0=1; //开启外部中断 0
IT0=1; //设置成低电平触发,1为下降沿触发
EX1=1; //开启外部中断 0
IT1=1; //设置成低电平触发,1为下降沿触发
EA=1;//开启总中断
}
///////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:完成外部中断0和中断1的初始化设置,然后系统完全进入等待状态,直到有
外部中断被触发
参数介绍:无
返回值: 无
注意事项:无
///////////////////////////////////////////////////////////////////////
void main()
{
Init_INT0(); //初始化外部中断0和外部中断1
cCounter=0;
Digital_tube_Wei_Enable;
Digital_tube_Duan=0x00;
Digital_tube_Wei_Disable;
while(1)
{
Digital_tube_Duan_Enable;
Digital_tube_Duan=Dis_table[cCounter];//送入要显示的cCounter的数值
Digital_tube_Duan_Disable;
}
}
///////////////////////////////////////////////////////////////////////
函数名称:Interrupt0_handler
函数功能:进入中断服务函数,当cCounter小于10时,其加1,当大于0时,加1
参数介绍:无
返回值: 无
注意事项:关总中断和延时函数是为了消除抖动从而产生的再次中断
///////////////////////////////////////////////////////////////////////
void Interrupt0_handler() interrupt 0
{
EA=0;//首先关闭总中断,以消除按键出现的抖动所产生的干扰
DelayMs(200);//同样是为了消除抖动而产生新的中断
if(++cCounter>=10)
{
cCounter=0;
}
EA=1; //恢复中断
}
///////////////////////////////////////////////////////////////////////
函数名称:Interrupt1_handler
函数功能:进入中断服务函数,当cCounter大于0,其减1,小于0时,赋值为10
参数介绍:无
返回值: 无
注意事项:关总中断和延时函数是为了消除抖动从而产生的再次中断
///////////////////////////////////////////////////////////////////////
void Interrupt1_handler() interrupt 2
{
EA=0;//首先关闭总中断,以消除按键出现的抖动所产生的干扰
DelayMs(200);//同样是为了消除抖动而产生新的中断
if(cCounter)
{
--cCounter;
}
else
cCounter=10;
EA=1; //恢复中断
}