標(biāo)題: 有沒(méi)有大佬幫忙指點(diǎn)一下,單片機(jī)四人搶答器 這個(gè)程序跑的很奇怪 [打印本頁(yè)]

作者: XCYYLX    時(shí)間: 2022-5-7 20:38
標(biāo)題: 有沒(méi)有大佬幫忙指點(diǎn)一下,單片機(jī)四人搶答器 這個(gè)程序跑的很奇怪
要求:
一、 任務(wù)描述
設(shè)計(jì)一種4人搶答器。控制要求如下:
(1)設(shè)主持人1名,選手4名。
(2)1、2、3、4號(hào)搶答臺(tái)上均有藍(lán)色指示燈、搶答按鈕。
(3)主持人臺(tái)上有綠色開(kāi)始指示燈、紅色犯規(guī)指示燈、黃色報(bào)警燈,開(kāi)始按鈕和復(fù)位按鈕。開(kāi)始前,所有燈全滅。
(4)主持人按開(kāi)始按鈕后,開(kāi)始指示燈亮,并開(kāi)始9S倒計(jì)時(shí),以數(shù)碼管顯示,選手9S內(nèi)可以按搶答按鈕搶答,最先按搶答按鈕的選手指示燈亮,
后按搶答按鈕的選手指示燈不亮,9S內(nèi)如果無(wú)人搶答,黃色報(bào)警燈點(diǎn)亮。

(5)若主持人還未按開(kāi)始按鈕,就有選手按了搶答按鈕,主持人臺(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;//主持人開(kāi)始 set
sbit fu=P3^3;     //reset

sbit b1=P1^6;  //主持人開(kāi)始燈
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()//主持人開(kāi)始后倒計(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)

仿真圖片

仿真圖片

作者: XCYYLX    時(shí)間: 2022-5-7 20:38
大家?guī)兔χ更c(diǎn)一下,這個(gè)程序跑的很奇怪
作者: heicad    時(shí)間: 2022-5-7 22:03
什么問(wèn)題都沒(méi)有說(shuō)?
作者: man1234567    時(shí)間: 2022-5-8 09:40
是很奇怪,我看了半天它都沒(méi)跑走
作者: lkc8210    時(shí)間: 2022-5-8 09:58
復(fù)位鍵按下,先進(jìn)外中斷,直到復(fù)位鍵放開(kāi)才離開(kāi)中斷,結(jié)果主循環(huán)里的fuwei()里的if(fu==0)永遠(yuǎn)不會(huì)成立
作者: xiaoyuxinke    時(shí)間: 2022-5-8 14:32
這種用什么中斷,用匯編幾個(gè)FLAG就可以搞定了.
作者: XCYYLX    時(shí)間: 2022-5-8 19:26
heicad 發(fā)表于 2022-5-7 22:03
什么問(wèn)題都沒(méi)有說(shuō)?

他沒(méi)有報(bào)錯(cuò),程序能運(yùn)行,就是跑的很奇怪
作者: XCYYLX    時(shí)間: 2022-5-8 19:27
lkc8210 發(fā)表于 2022-5-8 09:58
復(fù)位鍵按下,先進(jìn)外中斷,直到復(fù)位鍵放開(kāi)才離開(kāi)中斷,結(jié)果主循環(huán)里的fuwei()里的if(fu==0)永遠(yuǎn)不會(huì)成立

那應(yīng)該怎么改,大佬
作者: XCYYLX    時(shí)間: 2022-5-8 19:27
xiaoyuxinke 發(fā)表于 2022-5-8 14:32
這種用什么中斷,用匯編幾個(gè)FLAG就可以搞定了.

嗚嗚嗚,木得辦法,得用編程
作者: yzwzfyz    時(shí)間: 2022-5-9 14:22
1、對(duì)選手的鍵要一次性讀入,不能分前后。
2、對(duì)按鍵不能消抖(逮著一次即認(rèn)可),否則影響搶答的“搶”字。
3、無(wú)選手鍵入一直讀,有選手鍵入按命題邏輯進(jìn)行分析判定。
6#樓的建議是正確的。





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1