新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSC-51中斷綜合應用

        MSC-51中斷綜合應用

        作者: 時間:2016-11-13 來源:網絡 收藏
        定時中斷和外部中斷都用上了。

        源程序如下:

        本文引用地址: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;//數碼管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中

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 昌吉市| 台北市| 鄂伦春自治旗| 新民市| 治县。| 呼图壁县| 桃源县| 东乌| 东乡族自治县| 安岳县| 轮台县| 理塘县| 南丰县| 石首市| 阜康市| 叶城县| 外汇| 英山县| 资兴市| 丹阳市| 肥城市| 晋城| 石嘴山市| 伊宁市| 嘉黎县| 崇州市| 长治县| 安康市| 新昌县| 巴青县| 册亨县| 津市市| 旬阳县| 车险| 锡林浩特市| 江城| 西乌珠穆沁旗| 清远市| 澄江县| 白银市| 雷山县|