找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1903|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

有沒有大佬幫忙指點(diǎn)一下,單片機(jī)四人搶答器 這個(gè)程序跑的很奇怪

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
要求:
一、 任務(wù)描述
設(shè)計(jì)一種4人搶答器?刂埔笕缦:
(1)設(shè)主持人1名,選手4名。
(2)1、2、3、4號(hào)搶答臺(tái)上均有藍(lán)色指示燈、搶答按鈕。
(3)主持人臺(tái)上有綠色開始指示燈、紅色犯規(guī)指示燈、黃色報(bào)警燈,開始按鈕和復(fù)位按鈕。開始前,所有燈全滅。
(4)主持人按開始按鈕后,開始指示燈亮,并開始9S倒計(jì)時(shí),以數(shù)碼管顯示,選手9S內(nèi)可以按搶答按鈕搶答,最先按搶答按鈕的選手指示燈亮,
后按搶答按鈕的選手指示燈不亮,9S內(nèi)如果無(wú)人搶答,黃色報(bào)警燈點(diǎn)亮。

(5)若主持人還未按開始按鈕,就有選手按了搶答按鈕,主持人臺(tái)上的犯規(guī)指示燈點(diǎn)亮(閃爍),同時(shí)所有犯規(guī)選手指示燈點(diǎn)亮(閃爍),(閃爍頻率均為1HZ)。
(6)任何情況下,主持人按復(fù)位按鈕都可以熄滅所有指示燈。
程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char

uchar code q[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//倒計(jì)時(shí)數(shù)組

uchar flag;
uchar count=0;  //中斷進(jìn)入次數(shù)
uchar num=9;  //倒計(jì)時(shí)

sbit kai=P3^2;//主持人開始 set
sbit fu=P3^3;     //reset

sbit b1=P1^6;  //主持人開始燈
sbit b2=P1^5;  //犯規(guī)燈  
sbit b3=P1^4;  //報(bào)警燈

sbit a=P2^0;//選手按鍵        KEY_1
sbit b=P2^1;   
sbit c=P2^2;
sbit d=P2^3;

sbit a1=P1^0;//選手燈  LED_1
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;

void delay10()//10ms
{
        uchar i,k;
        for(i=20; i>0; i--)
                for(k=250; k>0; k--);
}

void delay1s()                //1s
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 46;
        j = 153;
        k = 245;
        do
        {
                do
                {
                        while (--k);
                }
                while (--j);
        }
        while (--i);
}

void init()  //初始化
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;         //定時(shí)器T0中斷啟動(dòng)
        EA=1;         //總中斷啟動(dòng)
        EX0=1;         //外部中斷啟動(dòng)
        IT0=1;         //下降沿啟動(dòng)

}

void daojishi()//主持人開始后倒計(jì)時(shí)
{
        while(kai==0)
        {
                TR0=1;
                P0=q[num];
                delay10();
                P0=0x01;  //0xff
        }
}

void qiangda()//選手搶答
{
        if(a==0)        //搶答
        {
                delay10();        //去抖
                if(a==0)        //判斷是否進(jìn)入搶答狀態(tài)
                {
                        if(P2==0x01)  //別人搶答狀態(tài)
                        {
                                a1=1;
                                a2=0;
                                a3=0;
                                a4=0;
                        }
                }
        }
        if(b==0)        //搶答
        {
                delay10();        //去抖
                if(b==0)        //判斷是否進(jìn)入搶答狀態(tài)
                {
                        if(P2==0x02)  //別人搶答狀態(tài)
                        {
                                a2=1;
                                a1=0;
                                a3=0;
                                a4=0;
                        }
                }
        }
        if(c==0)        //搶答
        {
                delay10();        //去抖
                if(c==0)        //判斷是否進(jìn)入搶答狀態(tài)
                {
                        if(P2==0x03)  //別人搶答狀態(tài)
                        {
                                a3=1;
                                a2=0;
                                a1=0;
                                a4=0;
                        }
                }
        }
        if(d==0)        //搶答
        {
                delay10();        //去抖
                if(d==0)        //判斷是否進(jìn)入搶答狀態(tài)
                {
                        if(P2==0x04)  //別人搶答狀態(tài)
                        {
                                a4=1;
                                a2=0;
                                a3=0;
                                a1=0;
                        }
                }
        }
}
void hong()//紅燈亮
{
        qiangda();
        if(TR0==1)
        {
                b2=1;
                delay1s();
                b2=0;
                while(TR0==1);
        }
}
void huang()//黃燈亮
{
        while(P0==0xff)
        {
                b3=1;
        }
}
void fuwei()//復(fù)位按鈕
{
        if(fu==0)
        {
        /*
                TMOD=0x01;



               
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                ET0=1;
                EA=1;
                EX0=1;
                IT0=1;
        */
            TR0=0;
                num=9;
                P1=0X00;
                P0=0;
                P2=0xff;
        }
}
void main()
{
        P1=0X00;
        init();
        while(1)
        {
                daojishi();
                qiangda();
                hong();
                huang();
                fuwei();

        }
}
void time0() interrupt 1
{
        TH0=(65536-50000)/256;  //10ms
        TL0=(65536-50000)%256;
        count++;
        if(count==20)
        {
                count=0;
                num--;
        }
        if(num==0)
        {
                P0=0x00;
        }
}
void anjian() interrupt 0//按鍵去抖
{
        delay10();
        if(fu==0)
        {
                TR0=1;
        }
        while (fu==0);


51hei圖片20220507203739.png (76.19 KB, 下載次數(shù): 51)

仿真圖片

仿真圖片
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:999824 發(fā)表于 2022-5-7 20:38 | 只看該作者
大家?guī)兔χ更c(diǎn)一下,這個(gè)程序跑的很奇怪
回復(fù)

使用道具 舉報(bào)

板凳
ID:262 發(fā)表于 2022-5-7 22:03 | 只看該作者
什么問題都沒有說(shuō)?
回復(fù)

使用道具 舉報(bào)

地板
ID:584814 發(fā)表于 2022-5-8 09:40 | 只看該作者
是很奇怪,我看了半天它都沒跑走
回復(fù)

使用道具 舉報(bào)

5#
ID:161164 發(fā)表于 2022-5-8 09:58 來(lái)自觸屏版 | 只看該作者
復(fù)位鍵按下,先進(jìn)外中斷,直到復(fù)位鍵放開才離開中斷,結(jié)果主循環(huán)里的fuwei()里的if(fu==0)永遠(yuǎn)不會(huì)成立
回復(fù)

使用道具 舉報(bào)

6#
ID:61140 發(fā)表于 2022-5-8 14:32 | 只看該作者
這種用什么中斷,用匯編幾個(gè)FLAG就可以搞定了.
回復(fù)

使用道具 舉報(bào)

7#
ID:999824 發(fā)表于 2022-5-8 19:26 | 只看該作者
heicad 發(fā)表于 2022-5-7 22:03
什么問題都沒有說(shuō)?

他沒有報(bào)錯(cuò),程序能運(yùn)行,就是跑的很奇怪
回復(fù)

使用道具 舉報(bào)

8#
ID:999824 發(fā)表于 2022-5-8 19:27 | 只看該作者
lkc8210 發(fā)表于 2022-5-8 09:58
復(fù)位鍵按下,先進(jìn)外中斷,直到復(fù)位鍵放開才離開中斷,結(jié)果主循環(huán)里的fuwei()里的if(fu==0)永遠(yuǎn)不會(huì)成立

那應(yīng)該怎么改,大佬
回復(fù)

使用道具 舉報(bào)

9#
ID:999824 發(fā)表于 2022-5-8 19:27 | 只看該作者
xiaoyuxinke 發(fā)表于 2022-5-8 14:32
這種用什么中斷,用匯編幾個(gè)FLAG就可以搞定了.

嗚嗚嗚,木得辦法,得用編程
回復(fù)

使用道具 舉報(bào)

10#
ID:123289 發(fā)表于 2022-5-9 14:22 | 只看該作者
1、對(duì)選手的鍵要一次性讀入,不能分前后。
2、對(duì)按鍵不能消抖(逮著一次即認(rèn)可),否則影響搶答的“搶”字。
3、無(wú)選手鍵入一直讀,有選手鍵入按命題邏輯進(jìn)行分析判定。
6#樓的建議是正確的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表