新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用51單片機制作4路搶答器

        用51單片機制作4路搶答器

        作者: 時間:2016-11-18 來源:網絡 收藏
        此搶答器具有限時搶答,超時無效的特點,并可以對主持人未喊開始而提前搶答的犯規情況作出判斷。

        由于用了單片機,所以電路很簡單。懶得寫譯碼程序,也不想做驅動電路。干脆直接用了一片74LS48譯碼驅動器來驅動數碼管。

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

        呵呵,面包板上插一下,由于之前在Proteus中仿真過,所以直接就正常運行了~上一張實物圖

        左邊的是STC89C52的最小系統版,P1口上接了8個LED,當時做流水燈的。直接拿來用了。P2口是顯示輸出,P3口接受按鍵。那個小的芯片就是74LS48啦~下方的是編程器+電源,STC的芯片就是編程方便,支持在線燒寫,這么小巧的編程器~

        當然最重要的是程序,附上代碼清單。寫的比較爛,竟然上了100行,希望不要被大蝦們罵得太慘>_<

        #include
        #defineuintunsignedchar

        //計時變量
        uints= 0,ms= 0;

        //枚舉類型:記錄搶答器工作狀態
        enumStat
        {
        Idle= 0,//空閑狀態,比如正在讀題
        Ready= 1,//就緒狀態,可以搶答
        Respond= 2,//響應狀態,有人搶到了
        }stat;

        //時鐘中斷服務程序
        voidTimer()interrupt1using1
        {
        TH0=0x3C;
        TL0=0xBD;
        ms++;
        s+=ms/20;
        ms%= 20;
        s%= 60;
        }

        //重置時鐘
        voidResetTimer()
        {
        EA= 1;//允許CPU中斷
        ET0= 1;//定時器中斷打開
        TMOD= 1;//設定時器為方式
        TR0= 0;//關定時器
        ms= 0;
        s= 0;
        }

        //優先編碼(反向輸入)
        uintEncode(uintc)
        {
        uinti,mask= 1;
        if(c== 0)return0;
        for(i= 0;i< 8;i++)
        {
        if((c& (mask< }
        }

        voidmain()
        {
        uintled= 0xff;//對應P1口,指示燈
        uintdisp= 15;//對應P2口,數碼管
        uintbutton;//對應P3口,按鍵
        uintisFoul= 0;//是否犯規(或超時)
        constuinttimeout= 5;//超時時間
        ResetTimer();
        while(1)
        {
        //設置狀態指示燈,用于調試,實際應用中可以去掉
        if(stat==Idle)P0= (~1);
        elseif(stat==Ready)P0= (~2);
        elseif(stat==Respond)P0= (~4);
        elsestat= 0;

        //超時判斷
        if(timeout-s== 0)
        {
        isFoul= 1;
        disp= 15;
        stat=Idle;
        ResetTimer();
        }

        //讀按鍵
        button=P3;

        //P3.5復位鍵按下
        if((button& 32) == 0)
        {
        disp= 15;
        led= 0xff;
        stat=Idle;
        isFoul= 0;
        ResetTimer();
        }

        //P3.4開始鍵按下
        if((button& 16) == 0)
        {
        stat=Ready;
        P1= 0;//所有選手的燈閃爍,提示可以開始搶答
        TR0= 1;//開始計時
        }

        //P3.0-P3.3搶答鍵按下
        if((button& 15) != 15)
        {
        if(stat==Idle)isFoul= 1;//提前搶,犯規
        if(stat!=Respond)//正常搶答
        {
        led= (button& 15) + 240;
        disp=Encode(button& 15);
        stat=Respond;
        }
        ResetTimer();
        }

        //顯示
        if(isFoul)led&= 127;//犯規則點亮
        if(stat==Ready)disp=timeout-s;
        P1=led;
        P2=disp;
        }
        }



        關鍵詞: 51單片機4路搶答

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 句容市| 岑巩县| 高邮市| 永福县| 南川市| 阿拉善盟| 洮南市| 姚安县| 珲春市| 云阳县| 安徽省| 金山区| 尉氏县| 竹溪县| 蓬莱市| 大石桥市| 巢湖市| 临海市| 娱乐| 长沙县| 福鼎市| 泊头市| 博客| 建瓯市| 台山市| 泽州县| 志丹县| 登封市| 克拉玛依市| 台湾省| 石首市| 独山县| 宜丰县| 芦山县| 城步| 上虞市| 河南省| 武城县| 巨野县| 南昌县| 台安县|