新聞中心

MSC-51中斷綜合應(yīng)用

作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò) 收藏
定時(shí)中斷和外部中斷都用上了。

源程序如下:

本文引用地址:http://www.butianyuan.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;/*定義時(shí)間變量*/

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;//數(shù)碼管1

sbit P2_7 = P2^7;//數(shù)碼管2

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

函數(shù)功能:延時(shí)程序

入口參數(shù):延遲時(shí)間

出口參數(shù):無(wú)

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

void Delay(byte time)

{

byte i;

for(;time > 0;time--)

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

}

/*LED數(shù)碼管顯示程序****************************************************

入口函數(shù):要顯示的值

出口函數(shù):無(wú)

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

void xianshi(byte xs)//輸入要顯示的值

{

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

P0=0xff;//顯示個(gè)位

P2_7=1;

P2_6=0;

P0=Seg[xs%10];

Delay(10);//延時(shí)程序

P0=0xff;//顯示十位

P2_6=1;

P2_7=0;

P0=Seg[xs/10];

Delay(10);//延時(shí)程序

}

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

函數(shù)功能:掃描鍵盤

函數(shù)入口:無(wú)

函數(shù)出口:有/無(wú)鍵按下1/0

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

byte keyfun(void)

{

byte P2copy;

P2 &= 0xfc;

P2copy = P2;

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

else

{

EA = 0;

return 1;

}

}

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

函數(shù)功能:外部中斷服務(wù)程序

入口參數(shù):無(wú)

出口參數(shù):無(wú)

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

void STOP1() interrupt 2/*當(dāng)ITN0中斷時(shí)執(zhí)行此函數(shù)*/

{

ET0 = 1;

xs_en = 1;

}

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

函數(shù)功能:外部中斷服務(wù)程序

入口參數(shù):無(wú)

出口參數(shù):無(wú)

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

void STOP0() interrupt 0/*當(dāng)ITN0中斷時(shí)執(zhí)行此函數(shù)*/

{

if(xs_en)

{

xs_en = 0;

ms = 0;

sec = 0;

}

else

{

ET0 = 0;

}

}

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

函數(shù)功能:定時(shí)器中斷函數(shù)(掃描鍵盤)(10ms 16位定時(shí))

入口參數(shù):無(wú)

出口參數(shù):無(wú)

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

void Time0_Func() interrupt 1/*當(dāng)定時(shí)器中斷時(shí)執(zhí)行此函數(shù)*/

{

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

TL0=(0xffff-9259)%256;

ms++;

if(keyfun())//當(dāng)有鍵時(shí),P2低四位置1,定時(shí)器中斷禁止

{

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;

}

}

}

}

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

函數(shù)功能:上電初始化函數(shù)

入口參數(shù):無(wú)

出口參數(shù):無(wú)

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

void Power_Up(void)

{

TMOD = 0x01;/*Time0為16計(jì)數(shù)器*/

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

TL0=(0xffff-9259)%256;

TR0=1;//T0啟動(dòng)

IT0 = 1;//外部中斷為邊沿觸發(fā)

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

P1=0xff;

P2=0xff;

}

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

函數(shù)功能:鍵值掃描

入口參數(shù):無(wú)

出口參數(shù):鍵值

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

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;

}

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

函數(shù)功能:時(shí)間調(diào)整

入口參數(shù):無(wú)

出口參數(shù):無(wú)

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

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 ://退出調(diào)整

sp=0;

while(Keyc == keyscan());

Power_Up();

break;

}

Keyl = Keyc;

}

}

}

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

函數(shù)功能:主函數(shù)

入口參數(shù):無(wú)

出口參數(shù):無(wú)

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

void main()

{

sec=0;//初始化

ms=0;

xs_en=1;

shic=10;//初始時(shí)長(zhǎng)10秒

Power_Up();//初始化

while(1)

{

if(EA == 0)TiaoZ();

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

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

}

}



關(guān)鍵詞: MSC-51中

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉