微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MSC-51中断综合应用

MSC-51中断综合应用

时间:11-13 来源:互联网 点击:
定时中断和外部中断都用上了。

源程序如下:

#pragma REGPARMS CD DB SB OE OT(5)

#include

typedef unsigned char byte;

typedef unsigned int word;

typedef unsigned long dword;

byte sec,ms,xs_en,shic;/*定义时间变量*/

sbit P2_0 = P2^0;//键盘输出1

sbit P2_1 = P2^1;//键盘输出2

sbit P2_2 = P2^2;//键盘输入1

sbit P2_3 = P2^3;//键盘输入2

sbit P2_4 = P2^4;//蜂鸣器

sbit P2_5 = P2^5;//继电器

sbit P2_6 = P2^6;//数码管1

sbit P2_7 = P2^7;//数码管2

/**********************************************************************

函数功能:延时程序

入口参数:延迟时间

出口参数:无

***********************************************************************/

void Delay(byte time)

{

byte i;

for(;time > 0;time--)

for(i=10;i > 0;i--);

}

/*LED数码管显示程序****************************************************

入口函数:要显示的值

出口函数:无

**********************************************************************/

void xianshi(byte xs)//输入要显示的值

{

byte code Seg[10]={0x28,0xf9,0x4c,0x58,0x99,0x1a,0x0a,0xf8,0x08,0x18};

P0=0xff;//显示个位

P2_7=1;

P2_6=0;

P0=Seg[xs%10];

Delay(10);//延时程序

P0=0xff;//显示十位

P2_6=1;

P2_7=0;

P0=Seg[xs/10];

Delay(10);//延时程序

}

/**********************************************************************

函数功能:扫描键盘

函数入口:无

函数出口:有/无键按下1/0

**********************************************************************/

byte keyfun(void)

{

byte P2copy;

P2 &= 0xfc;

P2copy = P2;

if((P2copy & 0x04) && (P2copy & 0x08))return 0;

else

{

EA = 0;

return 1;

}

}

/**********************************************************************

函数功能:外部中断服务程序

入口参数:无

出口参数:无

***********************************************************************/

void STOP1() interrupt 2/*当ITN0中断时执行此函数*/

{

ET0 = 1;

xs_en = 1;

}

/**********************************************************************

函数功能:外部中断服务程序

入口参数:无

出口参数:无

***********************************************************************/

void STOP0() interrupt 0/*当ITN0中断时执行此函数*/

{

if(xs_en)

{

xs_en = 0;

ms = 0;

sec = 0;

}

else

{

ET0 = 0;

}

}

/**********************************************************************

函数功能:定时器中断函数(扫描键盘)(10ms 16位定时)

入口参数:无

出口参数:无

***********************************************************************/

void Time0_Func() interrupt 1/*当定时器中断时执行此函数*/

{

TH0=(0xffff-9259)/256;/*10ms*/

TL0=(0xffff-9259)%256;

ms++;

if(keyfun())//当有键时,P2低四位置1,定时器中断禁止

{

P2 |= 0x0f;

}

else

{

if(ms == 99){ms = 0;sec++;}

if(ms % 5 == 0 && xs_en)

{

switch(ms / 5)

{

case 1 : P1 = 0x7f;break;

case 2 : P1 = 0x3f;break;

case 3 : P1 = 0x1f;break;

case 4 : P1 = 0x8f;break;

case 5 : P1 = 0xc7;break;

case 6 : P1 = 0xe3;break;

case 7 : P1 = 0xf1;break;

case 8 : P1 = 0xf8;break;

case 9 : P1 = 0xfc;break;

case 10: P1 = 0xfe;break;

default: P1 = 0xff;

}

}

}

}

/**********************************************************************

函数功能:上电初始化函数

入口参数:无

出口参数:无

***********************************************************************/

void Power_Up(void)

{

TMOD = 0x01;/*Time0为16计数器*/

TH0=(0xffff-9259)/256;/*10ms*/

TL0=(0xffff-9259)%256;

TR0=1;//T0启动

IT0 = 1;//外部中断为边沿触发

IE=0x87;/*EA=1 ET0=1 EX0=1 EX1=1*/

P1=0xff;

P2=0xff;

}

/**********************************************************************

函数功能:键值扫描

入口参数:无

出口参数:键值

***********************************************************************/

byte keyscan(void)

{

byte i,j;

P2 |= 0x0f;

P2 &= 0xfe;//Key_1低电平

for(i=0;i<2;i++)

{

if(i)

{

P2 |= 0x0f;

P2 &= 0xfd;//Key_2低电平

}

j = P2 & 0x0c;

j >>= 1;

if(j != 6){return (i+j-1);break;}

}

return 0;

}

/**********************************************************************

函数功能:时间调整

入口参数:无

出口参数:无

*********************************

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top