久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3949|回復: 6
打印 上一主題 下一主題
收起左側

求一個8人搶答器,有原理圖+PCB圖+源程序!

[復制鏈接]
跳轉到指定樓層
樓主
ID:226108 發表于 2017-8-29 00:09 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
20黑幣
要求:
1.        搶答器具有定時搶答功能.且一次搶答的時間可由主持人設定.當節目主持人啟動”開始”鍵后,要求定時器立即開始減計時,并用顯示器顯示,同時揚聲器發出短暫的聲響,聲響持續時間0.5S左右.
2.        參賽選手在設定的時間內搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答時刻的時間,并保持到主持人將系統消零為止.
~ 2 / 6 ~
3.        如果定時搶答器時間已到,卻沒有選手搶答時,本次搶答無效,系統短暫報警,并封鎖輸入電路,禁止選手超時后搶答,時間顯示器顯示00.

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:82765 發表于 2017-8-29 08:23 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:105206 發表于 2017-8-29 09:10 | 只看該作者
這個網上好象有例程。百度。。。。。。
回復

使用道具 舉報

地板
ID:226108 發表于 2017-8-29 10:56 來自手機 | 只看該作者
百度的都不是很理想,總是有一部分是沒有的....
回復

使用道具 舉報

5#
ID:226108 發表于 2017-8-30 14:03 來自手機 | 只看該作者
有沒有大神幫幫忙。抗蚯罅!
回復

使用道具 舉報

6#
ID:82765 發表于 2017-8-30 16:38 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

7#
ID:105206 發表于 2017-8-31 14:49 | 只看該作者
看看這個別人寫的程序

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit fmq=P3^6;
sbit Key_Start=P3^4;//開始鍵,時間設置時+
sbit Key_Stop=P3^5;//停止鍵,時間設置時-
sbit Key_Restart=P3^0;//復位鍵
sbit Key_set_Q=P3^2;//搶答時間設置鍵
sbit Key_set_H=P3^3;//回答時間設置鍵
sbit led=P3^7;//搶答LED提示
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0xf0,0xb6};//段碼表
uchar code table_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc7,0xc0,0x92,0x86,0xbf,0xb7,0xff,0xb9,0x8f};//0-9 L O S E -
uchar  table_score[9]={0,50,50,50,50,50,50,50,50};//記分數組,初設值50分
void delay(uint z);//延時函數聲明
void init();//初始化函數聲明
void display(uchar XuanShou,uchar time);//顯示數字函數聲明
void display_char(uchar char_1,uchar char_2,uchar char_3,uchar char_4 );//顯示字符函數聲明
void display_set(uchar char_1,uchar time,uchar char_2);//時間設置閃動顯示函數聲明
void display_score(uchar xs_num);//分數查詢顯示函數
void beep();//蜂鳴器函數
void beep_last();//蜂鳴器特殊報警
void LED();//提示燈函數
uchar QiangDa_time,HuiDa_time,QiangDa_time_temp=20,HuiDa_time_temp=30;//搶答時間、回答時間變量
uchar count_0,count_1;//定時中計數用的
uint shan_count=0;//閃動顯示計數用
void main()
{
        uchar AnJian,ShuJu,XuanShou_num;
Top:init();//初始化
        XuanShou_num=1;//為分數查詢做好準備
        while(1)
        {
                display(10,0);//顯示一杠
                ShuJu=P1;
                if(ShuJu!=0xff)//犯規搶答。
                {
//                        delay(10);
//                        if(ShuJu!=0xff)
//                        {
                                AnJian=ShuJu;
                                switch(AnJian)//取出選手編號
                                {
                                        case 0xfe :        XuanShou_num=1;break;//1111 1110
                                        case 0xfd :        XuanShou_num=2;break;//1111 1101
                                        case 0xfb :        XuanShou_num=3;break;//1111 1011
                                        case 0xf7 :        XuanShou_num=4;break;//1111 0111
                                        case 0xef :        XuanShou_num=5;break;//1110 1111
                                        case 0xdf :        XuanShou_num=6;break;//1101 1111
                                        case 0xbf :        XuanShou_num=7;break;//1011 1111
                                        case 0x7f :        XuanShou_num=8;break;//0111 1111
                                        default : goto LOSE;//無法顯示了,有兩個以上的鍵同時按下了!!不過這種概率相當小
                                }
                                while(1)
                                {
                                        display_char(13,14,14,XuanShou_num);//閃動顯示犯規選手并且報警
                                        if(shan_count==50)
                                        {
                                                beep();
                                        }
                                        if(Key_Stop==0)
                                        {
                                                delay(10);
                                                if(Key_Stop==0)
                                                {
                                                        beep();
                                                        table_score[XuanShou_num]--;//扣分
                                                }
                                        }
                                        while(!Key_Stop)
                                        {
                                                display_char(14,14,1,16);//按鍵不放開的情況下顯示-1
                                                shan_count=1;//調用的是閃動顯示函數,但是不讓其閃動
                                        }
                                        if(Key_Restart==0)
                                        {
                                                delay(10);
                                                if(Key_Restart==0)
                                                {
                                                        beep();
                                                        goto Top;//熱復位
                                                }
                                        }
                                }
//                        }
                }
                if(Key_Start==0)
                {
                        delay(10);
                        if(Key_Start==0)//主持人按下搶答鍵,搶答正式開始!
                        {
                                QiangDa_time=QiangDa_time_temp;
                                HuiDa_time=HuiDa_time_temp;
                                beep();
                                TR1=1;//搶答時間開始倒計時
                                break;//跳出犯規搶答查詢循環
                        }
                }
//一下為查分程序測試
                 if(Key_Stop==0)
                 {
                         delay(10);
                        if(Key_Stop==0)//進入分數查詢顯示
                        {
                                beep();
                                while(!Key_Stop);
                                while(1)
                                {
                                        display_score(XuanShou_num);
                                        if(Key_Start==0)
                                        {
                                                delay(10);
                                                if(Key_Start==0)
                                                {
                                                        XuanShou_num++;
                                                        if(XuanShou_num==9) XuanShou_num=1;
                                                }
                                        }
                                        while(!Key_Start);//等待按鍵釋放
                                        if(Key_Stop==0)
                                        {
                                                delay(10);
                                                if(Key_Stop==0)
                                                {
                                                        XuanShou_num--;
                                                        if(XuanShou_num==0) XuanShou_num=8;
                                                }
                                        }
                                        while(!Key_Stop);//等待按鍵釋放
                                   if(Key_Restart==0)
                                        {
                                                delay(10);
                                                if(Key_Restart==0)
                                                {
                                                        beep();
                                                        goto Top;//熱復位
                                                }
                                        }
                                }
                        }
                 }
        }
        while(1) //查詢是否有按鍵按下,進入搶答循環
        {
                display(10,QiangDa_time);//顯示搶答倒計時
                if(QiangDa_time==0)
                {
//                        beep();
                        TR1=0;//關閉定時器1
LOSE:                while(1)
                        {
                                display_char(10,11,12,13); //顯示lose 字符
                                if(Key_Restart==0)
                                {
                                        delay(10);
                                        if(Key_Restart==0)//熱復位鍵,從頭開始下一輪
                                        {
                                                beep();
                                                goto Top;
                                        }
                                }
                        }
                }
                ShuJu=P1;//把P1口的數據送給變量
                if(ShuJu!=0xff)//有按鍵按下
                {
//                        delay(10);
//                        if(ShuJu!=0xff)//確定有按鍵按下
//                        {
                                 AnJian=ShuJu;//傳遞數據掃描值
//                                 TR0=1;//啟動定時器0
                                 TR1=0;//關閉定時器1
                                 break;//不再進行查詢是否有按鍵按下了
//                        }
                }
        }
        switch(AnJian)//取出選手編號
        {
                case 0xfe :        XuanShou_num=1;beep();LED();break;//1111 1110
                case 0xfd :        XuanShou_num=2;beep();LED();break;//1111 1101
                case 0xfb :        XuanShou_num=3;beep();LED();break;//1111 1011
                case 0xf7 :        XuanShou_num=4;beep();LED();break;//1111 0111
                case 0xef :        XuanShou_num=5;beep();LED();break;//1110 1111
                case 0xdf :        XuanShou_num=6;beep();LED();break;//1101 1111
                case 0xbf :        XuanShou_num=7;beep();LED();break;//1011 1111
                case 0x7f :        XuanShou_num=8;beep();LED();break;//0111 1111
                default : goto LOSE;//無法顯示了,有兩個以上的鍵同時按下了!!不過這種概率相當小
        }
        TR0=1;//啟動定時器0(在這里啟動比在前面好)
        while(1)
        {
                display(XuanShou_num,HuiDa_time);//顯示選手編號和回答倒計時
                if(HuiDa_time==0)
                {
                        TR0=0;//關閉定時器0
                        goto LOSE;//跳到顯示lose字符那里
                }
                if(Key_Stop==0)
                {
                        delay(30);
                        if(Key_Stop==0)//停止鍵按下
                        {
                                beep();
                                TR0=0;//關閉定時器0,選手開始回答
                                while(!Key_Stop);
                                while(1) //在顯示選手回答倒計時時只有在stop按鍵按下時,才可按復位鍵
                                {
                                        display(XuanShou_num,HuiDa_time);//顯示選手編號和回答倒計時
                                        if(Key_Start==0)
                                        {
                                                delay(10);
                                                if(Key_Start==0)
                                                {
                                                        beep();
                                                        table_score[XuanShou_num]++;//加分
                                                }
                                        }
                                        while(!Key_Start)
                                        {
                                                display_char(17,18,1,16);//按鍵不放開的情況下顯示+1
                                                shan_count=1;//調用的是閃動顯示函數,但是不讓其閃動
                                        }
                                        if(Key_Stop==0)
                                        {
                                                delay(10);
                                                if(Key_Stop==0)
                                                {
                                                        beep();
                                                        table_score[XuanShou_num]--;//扣分
                                                }
                                        }
                                        while(!Key_Stop)
                                        {
                                                display_char(14,14,1,16);//按鍵不放開的情況下顯示-1
                                                shan_count=1;//調用的是閃動顯示函數,但是不讓其閃動
                                        }
                                        if(Key_Restart==0)
                                        {
                                                delay(10);
                                                if(Key_Restart==0)//熱復位鍵,從頭開始下一輪
                                                {
                                                        beep();
                                                        goto Top;
                                                }
                                        }
                                }
                        }
                }
//                else
/*                if(Key_Restart==0)
                {
                        delay(10);
                        if(Key_Restart==0)//熱復位鍵,從頭開始下一輪
                        {
                                beep();
                                goto Top;
                        }
                } */
        }
       
}

void delay(uint z)//1ms基準延時
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void init()//初始化函數
{
//        P1=0xff
        EA=1;//開總中斷;
        TMOD=0x11;//定時器工作方式1,16位定時計數器
        TH0=(65536-50000)/256;//50us
        TL0=(65536-50000)%256;
        ET0=1;//開定時器0中斷(暫時不啟動定時器)

//        TMOD=0x01;//定時器工作方式1,16位定時計數器
        TH1=(65536-50000)/256;//50us
        TL1=(65536-50000)%256;
        ET1=1;//開定時器0中斷(暫時不啟動定時器)

        EX0=1;//啟動外中斷0
        EX1=1;//啟動外中斷1

        P1=0xff;//讀P1口的數據要先置1準備
        count_0=0;//定時器中的計數清零
        count_1=0;
        shan_count=0;
}

void display(uchar XuanShou,uchar time)//顯示數字的函數
{

                P2=0x7f;//0111 1111最后一位數碼管亮
                P0=table[XuanShou];//選手編號
                delay(1);
                P2=0x7f;//0111 1111
                P0=0xff;//消余輝
                delay(1);
       
                P2=0xdf;//1101 1111
                P0=table[time%10];//時間的個位
                delay(1);
                P2=0xdf;//0111 1111
                P0=0xff;//消余輝
                delay(1);
       
                P2=0xef;// 1110 1111
                P0=table[time/10];//時間的十位
                delay(1);
                P2=0xef;//0111 1111
                P0=0xff;//消余輝
                delay(1);
}

void display_char(uchar char_1,uchar char_2,uchar char_3,uchar char_4 )//閃動!顯示字符的函數
{
        shan_count++;
        if(shan_count==150)        shan_count=0;
         if(shan_count>0&&shan_count<50)
         {
                P2=0x7f;//0111 1111
                P0=table_char[char_4];
                delay(1);
                P2=0x7f;//0111 1111
                P0=0xff;
                delay(1);
       
                P2=0xbf;//1011 1111
                P0=table_char[char_3];
                delay(1);
                P2=0xbf;//1011 1111
                P0=0xff;
                delay(1);
       
                P2=0xdf;//1101 1111
                P0=table_char[char_2];
                delay(1);
                P2=0xdf;//1101 1111
                P0=0xff;
                delay(1);
       
                P2=0xef;//1110 1111
                P0=table_char[char_1];
                delay(1);
                P2=0xef;//1110 1111
                P0=0xff;
                delay(1);
        }
        else
        {
                 P2=0x7f;//0111 1111
                P0=0xff;
                delay(1);

                P2=0xbf;//
                P0=0xff;
                delay(1);

                P2=0xdf;//
                P0=0xff;
                delay(1);

                P2=0xef;//
                P0=0xff;
                delay(1);
        }

}
void display_set(uchar char_1,uchar time,uchar char_2)//時間設置的閃動顯示
{
        shan_count++;
        if(shan_count==120)        shan_count=0;
         if(shan_count>0&&shan_count<40)
         {
                 P2=0x7f;//0111 1111最后一位數碼管亮
                P0=table[char_2];//顯示一個符號
                delay(1);
                P2=0x7f;//0111 1111
                P0=0xff;//消余輝
                delay(1);

                P2=0xbf;//1011 1111
                P0=table[time%10];//時間的個位
                delay(1);
                P2=0xbf;//1011 1111
                P0=0xff;//消余輝
                delay(1);
       
                P2=0xdf;//1101 1111
                P0=table[time/10];//時間的十位
                delay(1);
                P2=0xdf;//1101 1111
                P0=0xff;//消余輝
                delay(1);
       
                P2=0xef;// 1110 1111
                P0=table[char_1];//顯示一個符號
                delay(1);
                P2=0xef;//1110 1111
                P0=0xff;//消余輝
                delay(1);
         }
         else
         {
                 P2=0x7f;//0111 1111
                P0=table[char_2];
                delay(1);

                P2=0xbf;//
                P0=0xff;
                delay(1);

                P2=0xdf;//
                P0=0xff;
                delay(1);

                P2=0xef;//
                P0=table[char_1];
                delay(1);
         }
}
void display_score(uchar xs_num)//分數查詢顯示函數
{
                P2=0x7f;//0111 1111最后一位數碼管亮
                P0=table[(table_score[xs_num]%10)];//分數的個位
                delay(1);
                P2=0x7f;//0111 1111
                P0=0xff;//消余輝
                delay(1);

                P2=0xbf;//1011 1111
                P0=table[(table_score[xs_num]/10)];//分數的十位
                delay(1);
                P2=0xbf;//1011 1111
                P0=0xff;//消余輝
                delay(1);
       
                P2=0xdf;//1101 1111
                P0=table_char[15];//間隔符號
                delay(1);
                P2=0xdf;//1101 1111
                P0=0xff;//消余輝
                delay(1);
       
                P2=0xef;// 1110 1111
                P0=table[xs_num];//選手編號
                delay(1);
                P2=0xef;//1110 1111
                P0=0xff;//消余輝
                delay(1);
}
void beep()        //有源蜂鳴器函數
{
         fmq=0;
         delay(80);
         fmq=1;
}
void beep_last()//最后一聲特殊聲調
{
         fmq=0;
         delay(300);
         fmq=1;
}
void LED()
{
        led=0;
        delay(150);
        led=1;
}
void T0_time() interrupt 1//定時器0中斷函數_回答時間
{
        TH0=(65536-50000)/256;//50ms
        TL0=(65536-50000)%256;//馬上重裝初值,以免有誤差
        if(count_0==20)
        {
                count_0=0;
                HuiDa_time--;
                if(HuiDa_time<=5)
                {
                        if(HuiDa_time==0)
                        {
                                beep_last();//最后一聲特殊警告
                        }
                        beep();
                }

        }
        count_0++;
       
}

void T1_time() interrupt 3//定時器1中斷函數_搶答時間
{
        TH1=(65536-50000)/256;//50us
        TL1=(65536-50000)%256;//馬上重裝初值,這樣在后面調用beep()函數時就不會影響定時器的準確計時了
        if(count_1==20)
        {
                count_1=0;
                QiangDa_time--;
                if(QiangDa_time<=5)
                {
                        if(QiangDa_time==0)
                        {
                                beep_last();//最后一聲警告
                        }
                        else
                        beep();
                }
        }
        count_1++;       
}

void EX0_set_QiangDa_time()        interrupt 0 //外中斷0,設置搶答時間
{
        delay(10);//消抖一下
        if(Key_set_Q==0)
        {
                beep();
                while(1)
                {
//                        display(11,QiangDa_time_temp);
//                        delay(100);//閃動效果
                        display_set(12,QiangDa_time_temp,13);//調用時間設置閃動顯示函數,效果為 [時間]
                        if(Key_Start==0)//時間+1鍵
                        {
                                 delay(10);
                                 if(Key_Start==0)
                                 {
                                         QiangDa_time_temp++;
                                        if(QiangDa_time_temp==100)
                                        {
                                                QiangDa_time_temp=1;
                                        }
                                 }
                        }
                        while(!Key_Start);//等待按鍵釋放
//                        else
                        if(Key_Stop==0)//時間-1鍵
                        {
                                 delay(10);
                                 if(Key_Stop==0)
                                 {
                                         QiangDa_time_temp--;
                                        if(QiangDa_time_temp==0)
                                        {
                                                QiangDa_time_temp=99;
                                        }
                                 }
                        }
                        while(!Key_Stop);//等待按鍵釋放
//                        else
                        if(Key_Restart==0)
                        {
                                if(Key_Restart==0)
                                {
                                        beep();
                                        break;
                                }
                        }
                }
        }
}

void EX1_set_HuiDa_time()        interrupt 2 //外中斷1,設置回答時間
{
        delay(10);//消抖一下
        if(Key_set_H==0)
        {
                beep();
                while(1)
                {
                        display_set(12,HuiDa_time_temp,13);//調用時間設置閃動顯示函數,效果為 [時間]
                        if(Key_Start==0)//時間+1鍵
                        {
                                 delay(10);
                                 if(Key_Start==0)
                                 {
                                         HuiDa_time_temp++;
                                        if(HuiDa_time_temp==100)
                                        {
                                                HuiDa_time_temp=1;
                                        }
                                 }
                        }
                        while(!Key_Start);//等待按鍵釋放
//                        else
                        if(Key_Stop==0)//時間-1鍵
                        {
                                 delay(10);
                                 if(Key_Stop==0)
                                 {
                                         HuiDa_time_temp--;
                                        if(HuiDa_time_temp==0)
                                        {
                                                HuiDa_time_temp=99;
                                        }
                                 }
                        }
                        while(!Key_Stop);//等待按鍵釋放
//                        else
                        if(Key_Restart==0)
                        {
                                if(Key_Restart==0)
                                {
                                        beep();
                                        break;
                                }
                        }
                }
        }
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人高清在线 | 久久精品免费 | 免费在线观看黄色av | 久久久精品一区二区三区 | 日本91av视频| 午夜不卡福利视频 | 三级黄片毛片 | 国产高清精品一区二区三区 | 美美女高清毛片视频免费观看 | 欧美成人aaa级毛片在线视频 | 国产九一精品 | 欧美一区二区在线播放 | 国产一区二区三区免费观看在线 | 日本aaaa| 日韩av一区在线观看 | 亚洲国产一区二区视频 | 日韩精品在线观看一区二区三区 | 久久综合国产 | 草比av| 久久精品一区二区三区四区 | 日本中文字幕日韩精品免费 | 亚洲高清一区二区三区 | 亚洲在线免费观看 | 国产精品亚洲成在人线 | 久草中文在线 | 亚洲成人一区二区在线 | 国产综合精品 | 热99视频| 成人欧美一区二区三区黑人孕妇 | 欧美日韩精品影院 | 日韩一区中文字幕 | 欧美中文字幕 | 韩国精品一区二区三区 | 成人欧美| 欧美在线视频一区二区 | 欧美理论| 一区二区三区亚洲 | 在线观看国产精品一区二区 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 欧美一区二区三区四区五区无卡码 | 亚洲精品一区中文字幕乱码 |