新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > MSC-51中斷綜合應(yīng)用

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

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

        源程序如下:

        本文引用地址:http://www.104case.com/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;//數(shù)碼管1

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

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

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

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

        出口參數(shù):無

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

        void Delay(byte time)

        {

        byte i;

        for(;time > 0;time--)

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

        }

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

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

        出口函數(shù):無

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

        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);//延時程序

        }

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

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

        函數(shù)入口:無

        函數(shù)出口:有/無鍵按下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ù):無

        出口參數(shù):無

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

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

        {

        ET0 = 1;

        xs_en = 1;

        }

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

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

        入口參數(shù):無

        出口參數(shù):無

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

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

        {

        if(xs_en)

        {

        xs_en = 0;

        ms = 0;

        sec = 0;

        }

        else

        {

        ET0 = 0;

        }

        }

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

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

        入口參數(shù):無

        出口參數(shù):無

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

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

        {

        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;

        }

        }

        }

        }

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

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

        入口參數(shù):無

        出口參數(shù):無

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

        void Power_Up(void)

        {

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

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

        TL0=(0xffff-9259)%256;

        TR0=1;//T0啟動

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

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

        P1=0xff;

        P2=0xff;

        }

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

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

        入口參數(shù):無

        出口參數(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ù)功能:時間調(diào)整

        入口參數(shù):無

        出口參數(shù):無

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

        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ù):無

        出口參數(shù):無

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

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

        }

        }



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

        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 达尔| 林西县| 疏勒县| 诏安县| 莱州市| 平泉县| 临沧市| 都江堰市| 博白县| 陈巴尔虎旗| 仲巴县| 仙游县| 宁陕县| 普洱| 宁陵县| 龙山县| 四川省| 江华| 民丰县| 库尔勒市| 云霄县| 齐河县| 泰和县| 桐乡市| 望都县| 南华县| 崇州市| 长兴县| 永清县| 织金县| 汝南县| 富裕县| 类乌齐县| 东乡族自治县| 华坪县| 新宾| 温州市| 株洲县| 万山特区| 张北县| 鸡东县|