• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

    MSC-51中斷綜合應用

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

    源程序如下:

    本文引用地址:http://www.czjhyjcfj.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中

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 墨脱县| 新和县| 灵台县| 黄冈市| 齐河县| 轮台县| 疏勒县| 昌平区| 南漳县| 加查县| 抚宁县| 松潘县| 获嘉县| 方城县| 雷山县| 永丰县| 中山市| 高尔夫| 西昌市| 平山县| 宝丰县| 宁强县| 绥阳县| 汤原县| 贡觉县| 威宁| 威海市| 永城市| 扶沟县| 东明县| 正蓝旗| 黎川县| 漯河市| 鄱阳县| 府谷县| 蒙城县| 阜新| 曲沃县| 赤城县| 桃江县| 济宁市|