新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)課程設(shè)計(jì)(籃球記分器)

        單片機(jī)課程設(shè)計(jì)(籃球記分器)

        作者: 時(shí)間:2016-11-29 來源:網(wǎng)絡(luò) 收藏

        /*******************設(shè)置場(chǎng)次比賽時(shí)間********************/
        void Key_Y(void)
        {
        if(YK1==0) //初始狀態(tài),分鐘的十位為0
        {
        delay(1); //延時(shí)去抖動(dòng)
        fs=fs+1; //分十位加1分
        fy=fs*10+fg; //求出預(yù)置時(shí)間的分鐘值
        f=fy;
        while(YK1==0); //中間變量
        }
        if(YK2==0) //初始狀態(tài),分鐘的個(gè)位為0
        {
        delay(1); //延時(shí)去抖動(dòng)
        fg=fg+1; //分個(gè)位加1分
        fy=fs*10+fg; //求出預(yù)置時(shí)間的分鐘值
        f=fy; //中間變量
        while(YK1==0);
        }
        Js_Jf_Scan();
        }
        /********T0中斷服務(wù)函數(shù),每隔50ms產(chǎn)生一次中斷********/
        void Js_50ms(void)interrupt 1 using 1 //定時(shí)器T0中斷,用工作寄存器組1
        {
        TH0=(65535-50000)/256; //定時(shí)器T0的高8位
        TL0=(65535-50000)%256; //定時(shí)器T0的低8位
        num++; //每50ms累加一次
        Ptime(num); //調(diào)用時(shí)間處理函數(shù)
        }
        /**********************時(shí)間處理函數(shù)********************/
        void Ptime(uchar time)
        {
        if(time==20) //如果為1s(50ms*20=1s)
        {
        num=0;
        m--; //每到1s,計(jì)時(shí)器累加1次
        ms=m/10; //秒的十位
        mg=m%10; //秒的個(gè)位
        if(m<0) //如果為1min
        {
        m=59; //秒鐘置0
        mg=m%10; //秒鐘的個(gè)位置0
        ms=m/10; //秒鐘的十位置0
        f--; //分鐘開始在預(yù)設(shè)的比賽時(shí)間基礎(chǔ)上倒計(jì)時(shí)
        fs=f/10; //分鐘的十位
        fg=f%10; //分鐘的個(gè)位
        if(f==0) //分鐘數(shù)倒計(jì)時(shí)到0
        {
        TR0=0; //時(shí)間到,停止計(jì)時(shí)
        }
        }
        }
        }
        /******************數(shù)碼管動(dòng)態(tài)掃描顯示******************/
        void Js_Jf_Scan(void)
        {
        uchar j;
        for(j=0;j<=5;j++)
        {
        KL4=0;P0=LED_Num[g1];delay(1);KL4=1; /*將A隊(duì)分?jǐn)?shù)的個(gè)位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        KL3=0;P0=LED_Num[s1];delay(1);KL3=1; /*將A隊(duì)分?jǐn)?shù)的十位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        KL2=0;P0=LED_Num[b1];delay(1);KL2=1; /*將A隊(duì)分?jǐn)?shù)的百位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        KL1=0;P0=LED_Num[q1];delay(1);KL1=1; /*將A隊(duì)分?jǐn)?shù)的千位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        CL4=0;P0=LED_Num[g];delay(1);CL4=1; /*將B隊(duì)分?jǐn)?shù)的個(gè)位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        CL3=0;P0=LED_Num[s];delay(1);CL3=1; /*將B隊(duì)分?jǐn)?shù)的十位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        CL2=0;P0=LED_Num[b];delay(1);CL2=1; /*將B隊(duì)分?jǐn)?shù)的百位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        CL1=0;P0=LED_Num[q];delay(1);CL1=1; /*將B隊(duì)分?jǐn)?shù)的千位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        S4=0;P0=LED_Num[mg];delay(1);S4=1; /*將秒鐘的個(gè)位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        S3=0;P0=LED_Num[ms];delay(1);S3=1; /*將秒鐘的十位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        S2=0;P0=LED_Num[fg];delay(1);S2=1; /*將分鐘的個(gè)位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        S1=0;P0=LED_Num[fs];delay(1);S1=1; /*將分鐘的十位傳遞給譯碼器,通過按鍵,實(shí)現(xiàn)邊沿跳變,并把結(jié)果譯成相應(yīng)的段碼顯示出來*/
        }
        }
        /*****************判斷是哪個(gè)隊(duì)加分或者減分*****************/
        void Key_if(void)
        {
        if(Key1==0) //當(dāng)按鍵按下時(shí)
        {
        delay(1); //延時(shí)去抖動(dòng)
        sum=sum+1; //B隊(duì)加1分
        }
        if(Key2==0 && sum>=1) //減分按鍵按下并且中得分不得少于1分
        {
        delay(1); //延時(shí)去抖動(dòng)
        sum=sum-1; //B隊(duì)減1分
        }
        if(Key3==0) //當(dāng)按鍵按下時(shí)
        {
        delay(1); //延時(shí)去抖動(dòng)
        sum1=sum1+1; //A隊(duì)加1分
        }
        if(Key4==0 && sum1>=1) //減分按鍵按下并且中得分不得少于1分
        {
        delay(1); //延時(shí)去抖動(dòng)
        sum1=sum1-1; //A隊(duì)減1分
        }
        q=0; // A隊(duì)分值的千位默認(rèn)為0
        b=sum/100; //求出A隊(duì)分值的百位
        s=sum/10-b*10; //求出A隊(duì)分值的十位
        g=sum%10; //求出A隊(duì)分值的個(gè)位
        q1=0; // B隊(duì)分值的千位默認(rèn)為0
        b1=sum1/100; //求出B隊(duì)分值的百位
        s1=sum1/10-b1*10; //求出B隊(duì)分值的十位
        g1=sum1%10; //求出B隊(duì)分值的個(gè)位
        }
        /***********************鳴笛處理***********************/
        void sound(void) interrupt 0 using 0 //外部中斷0(),用工作寄存器組0
        {
        uchar i,j;
        if(Int_Key==0) //判斷鳴笛鍵是否按下,有按下就鳴笛
        {
        for(i=0;i<8;i++) //控制一種發(fā)音的時(shí)間
        {
        for(j=0;j<250;j++) //控制發(fā)音的頻率,延時(shí)長,頻率低,音低
        {
        music=~music; //取反
        delay1(1); //延時(shí)去抖動(dòng)
        }
        Js_Jf_Scan();
        }
        for(i=0;i<16;i++) //控制另一種發(fā)音的時(shí)間
        {
        for(j=0;j<250;j++) //控制發(fā)音的頻率,延時(shí)短,頻率高,音高
        {
        music=~music; //取反
        delay(1); //延時(shí)去抖動(dòng)
        }
        Js_Jf_Scan();
        }
        }
        else
        music=0; //喇叭不響
        }
        /*******************場(chǎng)地交換函數(shù)*******************/
        void jiaohuan(void)
        {
        int t;
        if(JH==0)
        {
        sum=t;
        t=sum1;
        sum1=t;
        }

        }

        /*******************延時(shí)1.8ms的子程序*******************/
        void delay1(uchar x)
        {
        uchar k;
        while(x--)
        for(k=0;k<215;k++); //延時(shí)長
        }
        /*******************延時(shí)1.0ms的子程序*******************/
        void delay(uchar x)
        {
        uchar k;
        while(x--)
        for(k=0;k<120;k++); //延時(shí)短
        }

        本文引用地址:http://www.104case.com/article/201611/323575.htm

        上一頁 1 2 下一頁

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 香港| 凤台县| 安化县| 蛟河市| 广宗县| 汶上县| 喀喇沁旗| 陇川县| 永胜县| 桂东县| 龙陵县| 鞍山市| 宜城市| 彰化市| 磐石市| 钟祥市| 鹰潭市| 松溪县| 大洼县| 灵丘县| 东阳市| 长治市| 商洛市| 信阳市| 扎兰屯市| 台东县| 阿合奇县| 沐川县| 沈阳市| 囊谦县| 临邑县| 大兴区| 阆中市| 仪征市| 丽江市| 藁城市| 怀宁县| 平潭县| 海丰县| 渭源县| 抚宁县|