新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > MSC-51中断综合应用

MSC-51中断综合应用

作者:时间:2016-11-13来源:网络收藏
定时中断和外部中断都用上了。

源程序如下:

本文引用地址:http://www.eepw.com.cn/article/201611/316242.htm

#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;

}

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

函数功能:时间调整

入口参数:无

出口参数:无

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

void TiaoZ(void)

{

byte sp=1,Keyc,Keyl;

while(sp)

{

xianshi(shic);

Delay(20);

Keyc = keyscan();

while(Keyc != Keyl)

{

xianshi(shic);

Delay(20);

switch(Keyc)

{

case 3 ://显示值加1

shic++;break;

case 2 ://显示值减1

shic--;break;

case 4 ://退出调整

sp=0;

while(Keyc == keyscan());

Power_Up();

break;

}

Keyl = Keyc;

}

}

}

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

函数功能:主函数

入口参数:无

出口参数:无

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

void main()

{

sec=0;//初始化

ms=0;

xs_en=1;

shic=10;//初始时长10秒

Power_Up();//初始化

while(1)

{

if(EA == 0)TiaoZ();

if(ET0 == 0){P1 = ~sec;xianshi(ms);}

if(xs_en == 1)xianshi(ms);

}

}



关键词: MSC-51中

评论


相关推荐

技术专区

关闭