欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5367|回復(fù): 4
收起左側(cè)

基于單片機(jī)的多路搶答器設(shè)計(jì)

[復(fù)制鏈接]
ID:417590 發(fā)表于 2018-10-29 21:45 | 顯示全部樓層 |閱讀模式
1 課題設(shè)計(jì)內(nèi)容
此次設(shè)計(jì)提出了用AT89C51單片機(jī)為核心控制元件,設(shè)計(jì)一個(gè)簡(jiǎn)易的搶答器,本方案以AT89C51單片機(jī)作為主控核心,與晶振、數(shù)碼管、蜂鳴器等構(gòu)成六路搶答器,利用了單片機(jī)的延時(shí)電路、按鍵復(fù)位電路、時(shí)鐘電路、定時(shí)/中斷等電路,設(shè)計(jì)的六路搶答器具有實(shí)時(shí)顯示搶答選手的號(hào)碼和搶答時(shí)間的特點(diǎn),還有復(fù)位電路,使其再開(kāi)始新的一輪的答題和比賽,同時(shí)還利用C51語(yǔ)言編程,使其實(shí)現(xiàn)搶答器的一些基本的功能。
本設(shè)計(jì)的系統(tǒng)實(shí)用性強(qiáng)、判斷精確、操作簡(jiǎn)單、擴(kuò)展功能強(qiáng)。它的功能實(shí)現(xiàn)是比賽開(kāi)始,主持人讀完題之后按下?lián)尨疰I,聲音提示,提示音結(jié)束后搶答倒計(jì)時(shí)開(kāi)始,此時(shí)數(shù)碼管開(kāi)始進(jìn)行10s的倒計(jì)時(shí),直到有一個(gè)選手搶答,選手按下?lián)尨疰I時(shí)有聲音提示并在對(duì)應(yīng)的數(shù)碼管上顯示出該選手的編號(hào)和搶答所剩的時(shí)間。如果在規(guī)定的10s時(shí)間內(nèi)沒(méi)有做出搶答,鳴笛提示本輪搶答結(jié)束,則此題作廢,即開(kāi)始重新一輪的搶答。下一輪搶答前先將時(shí)間歸零,再按下?lián)尨疰I即開(kāi)始。搶答者回答正確后,主持人可按下加分鍵,對(duì)應(yīng)于選手編號(hào)的數(shù)碼管顯示數(shù)字就增加(按下一次加一分,最高顯示9分),反之,搶答者回答錯(cuò)誤后,在該選手的得分?jǐn)?shù)不為0時(shí),主持人可按下減分鍵(按下一次減一分)。如果支持人要調(diào)整搶答時(shí)間,主持人可按下加時(shí)鍵(按下一次加1s)或減時(shí)鍵(按下一次減1s)。
2 設(shè)計(jì)方案論證
   根據(jù)設(shè)計(jì)內(nèi)容要求,提出了如下兩種方案
方案一:以AT89C51為核心,連接LED數(shù)碼管,晶振電路,開(kāi)關(guān)電路組成。其工作原理圖如下所示:
                                                                        
                                                                           
                        圖1  工作原理圖
圖2.1 方案一:采用RX8 驅(qū)動(dòng)譯碼單片機(jī)設(shè)計(jì)的多路搶答器系統(tǒng)結(jié)構(gòu)框圖
方案二:以AT89C51單片機(jī)作為主控核心,與晶振、數(shù)碼管、蜂鳴器等構(gòu)成六路搶答器,利用了單片機(jī)的延時(shí)電路、按鍵復(fù)位電路、時(shí)鐘電路、定時(shí)/中斷等電路,設(shè)計(jì)的六路搶答器具有實(shí)時(shí)顯示搶答選手的號(hào)碼和搶答時(shí)間的特點(diǎn),還有復(fù)位電路。
兩種方案的特點(diǎn)比較如下:方案一具有電路簡(jiǎn)單,設(shè)計(jì)方便,耗電較少,可靠性高等特點(diǎn);方案二的圖案具備的功能更多,單片機(jī)占用端口資源利用合理,。可見(jiàn)方案二優(yōu)于其他兩種方案,因此本設(shè)計(jì)選用方案二。
3 系統(tǒng)硬件設(shè)計(jì)3.1方框圖
圖3.1  功能模塊圖
第一步按鍵掃描,AT89C51接收到按鍵掃描的信息確定是否開(kāi)始啟動(dòng)本輪搶答,當(dāng)掃描鍵被按下,第二步AT89C51啟動(dòng)聲音模塊,蜂鳴器發(fā)聲一段時(shí)間停止發(fā)聲,與此同時(shí)選手開(kāi)始搶答,第三步AT89C51啟動(dòng)LED顯示模塊,顯示搶答倒計(jì)時(shí),和各選手的的分?jǐn)?shù),整個(gè)過(guò)程按鍵掃描一直執(zhí)行,當(dāng)有選手按下?lián)尨疰I,按鍵掃描終止對(duì)選手按鍵的掃描,AT89C51啟動(dòng)聲音模塊提示有選手按鍵,并將該選手的序號(hào)發(fā)送到LED顯示,第四步,按鍵掃描對(duì)加減分按鍵掃描,按鍵每按下一次對(duì)相應(yīng)的選手對(duì)應(yīng)的數(shù)碼管上顯示的分?jǐn)?shù)加減一,直到搶答復(fù)位鍵的按下,開(kāi)始新的一輪循環(huán)。當(dāng)?shù)褂?jì)時(shí)結(jié)束時(shí)選手仍然沒(méi)有按鍵,AT89C51啟動(dòng)聲音模塊,提示本輪搶答結(jié)束。
3.2搶答器顯示模塊選擇
顯示模塊主要是顯示搶答的時(shí)間,組別號(hào)碼和選手得分情況。
在使用傳統(tǒng)的數(shù)碼管顯示。數(shù)碼管具有:低能耗、低損耗、低壓、壽命長(zhǎng)、耐老化、防曬、防潮、防火、防高(低)溫,對(duì)外界環(huán)境要求低,易于維護(hù),同時(shí)其精度高,稱量快,精確可靠,操作簡(jiǎn)單。數(shù)碼顯示是采用BCD編碼顯示數(shù)字,程序編譯容易,資源占用較少。
顯示功能與硬件關(guān)系極大,當(dāng)硬件固定后,如何在不引起操作者誤解的前提下提供盡可能豐富的信息,全靠軟件來(lái)解決。在這里我們使用的是七段數(shù)碼管顯示,通常在顯示上我們采用的方法一般包括兩種:一種是靜態(tài)顯示,一種是動(dòng)態(tài)顯示。其中靜態(tài)顯示的特點(diǎn)是顯示穩(wěn)定不閃爍,程序編寫簡(jiǎn)單,但占用端口資源多;動(dòng)態(tài)顯示的特點(diǎn)是:顯示穩(wěn)定性沒(méi)靜態(tài)好,程序編寫復(fù)雜,但是相對(duì)靜態(tài)顯示而言占用端口資源少。在本設(shè)計(jì)中根據(jù)實(shí)際情況采用的是動(dòng)態(tài)顯示方法。8位8段數(shù)碼管顯示電路如下圖所示。
圖 3.2 8位七段數(shù)碼管顯示電路圖
上圖中數(shù)碼管采用的是8位一體七段共陽(yáng)數(shù)碼管,其中A~H段分別接到單片機(jī)的P0口,由單片機(jī)輸出的P0口數(shù)據(jù)來(lái)決定段碼值,位選碼COM1,COM2,COM3,COM4,(COM1,COM2,
COM3,COM4)分別接到單片機(jī)的P2^0,P2^1,P2^2 ,P2^3,(P2^4,P2^5,P2^6,P2^7)由單片機(jī)來(lái)決定當(dāng)前該顯示的是哪一位。在圖中還有一個(gè)排阻,連接在P0口上,用作P0口的上拉電阻,保證P0口沒(méi)有數(shù)據(jù)輸出時(shí)候處于高電平狀態(tài)。
通過(guò)查表法,將其在數(shù)碼管上顯示出來(lái),其中P0口為字型碼輸入端,P2口的8位為字選段輸入段。在這里我們通過(guò)查表將字型碼送給8段數(shù)碼管顯示的數(shù)字。
3.3 控制器
控制器主要用于對(duì)顯示、搶答、聲音、計(jì)分等模塊進(jìn)行控制。
采用ATMEL公司的AT89C51作為系統(tǒng)控制器的CPU方案。單片機(jī)算術(shù)運(yùn)算功能強(qiáng),軟件編程靈活、自由度大,可以用軟件編程實(shí)現(xiàn)各種算法和邏輯控制,并且由于其功耗低、體積小、技術(shù)成熟和成本低等優(yōu)點(diǎn),使其在各個(gè)領(lǐng)域應(yīng)用廣泛。
3.4 鍵盤電路
鍵盤是單片機(jī)不可缺少的輸入設(shè)備,是實(shí)現(xiàn)人機(jī)對(duì)話的紐帶。鍵盤按結(jié)構(gòu)形式可以分為非編碼鍵盤和編碼鍵盤,前者用軟件方法產(chǎn)生鍵碼,而后者則用硬件方法來(lái)產(chǎn)生鍵碼。在單片機(jī)中使用的都是非編碼鍵盤,因?yàn)榉蔷幋a鍵盤結(jié)構(gòu)簡(jiǎn)單,成本低廉,非編碼鍵盤的類型很多,常用的有獨(dú)立式鍵盤,行列式鍵盤等。本設(shè)計(jì)采用獨(dú)立式鍵盤:
鍵盤接口中使用多少根I/O線,鍵盤中就有幾個(gè)按鍵,鍵盤接口使用了8根I/O口線,該鍵盤就有8個(gè)按鍵,這種類型的鍵盤,其按鍵比較少,且鍵盤中各按鍵的工作互不干擾。因此可以根據(jù)實(shí)際需要對(duì)鍵盤中的按鍵靈活的編碼。如圖2-2。
最簡(jiǎn)單的編碼方式就是根據(jù)I/O輸入口所直接反映的相應(yīng)按鍵,按下的狀態(tài)進(jìn)行編碼,稱按鍵直接狀態(tài)碼,對(duì)于這樣編碼的獨(dú)立式鍵盤,CPU可以通過(guò)直接讀取I/O口的狀態(tài)來(lái)獲取按鍵的直接狀態(tài)編碼值,根據(jù)這個(gè)值直接進(jìn)行按鍵識(shí)別,這樣形式的鍵盤結(jié)構(gòu)簡(jiǎn)單,按鍵識(shí)別容易。
獨(dú)立式鍵盤的缺點(diǎn)是需要占用比較多的I/O口線,當(dāng)單片機(jī)應(yīng)用系統(tǒng)鍵盤中需要的按鍵比較少或I/O口線比較富余時(shí),可以采用這樣類型的鍵盤。
圖3.3獨(dú)立式鍵盤
3.5 時(shí)鐘頻率電路的設(shè)計(jì)
單片機(jī)必須在時(shí)鐘的驅(qū)動(dòng)下才能工作。在單片機(jī)內(nèi)部有一個(gè)時(shí)鐘振蕩電路,只需要外接一個(gè)振蕩源就能產(chǎn)生一定的時(shí)鐘信號(hào)送到單片機(jī)內(nèi)部的各個(gè)單元,決定單片機(jī)的工作速度。時(shí)鐘電路如下圖所示。
圖3.4外部振蕩源電路
一般選用石英晶體振蕩器。此電路在加電大約延遲10ms后振蕩器起振,在XTAL2引腳產(chǎn)生幅度為3V左右的正弦波時(shí)鐘信號(hào),其振蕩頻率主要由石英晶振的頻率確定。電路中兩個(gè)電容C1,C2的作用有兩個(gè):一是幫助振蕩器起振;二是對(duì)振蕩器的頻率進(jìn)行微調(diào)。
單片機(jī)在工作時(shí),由內(nèi)部振蕩器產(chǎn)生或由外直接輸入的送至內(nèi)部控制邏輯單元的時(shí)鐘信號(hào)的周期稱為時(shí)鐘周期。其大小是時(shí)鐘信號(hào)頻率的倒數(shù)。圖中時(shí)鐘頻率為12MHz。
3.6 復(fù)位電路的設(shè)計(jì)
單片機(jī)的第9腳RST為硬件復(fù)位端,只要將該端持續(xù)4個(gè)機(jī)器周期的高電平即可實(shí)現(xiàn)復(fù)位,復(fù)位后單片機(jī)的各狀態(tài)都恢復(fù)到初始化狀態(tài),其電路圖如下所示:
圖3.5 按鍵復(fù)位電路
3.7 報(bào)警電路
利用程序來(lái)控制單片機(jī)某個(gè)口線的“高”電平或“低”電平,接上蜂鳴器就能發(fā)出聲音,若再利用延時(shí)程序控制“高”或“低”電平的持續(xù)時(shí)間,就能改變蜂鳴器鳴叫的時(shí)間。
本文設(shè)計(jì)如下圖所示。圖中利用單片機(jī)的I/O端口P1^6,單片機(jī)通過(guò)設(shè)定該端口的高、低電平使蜂鳴器發(fā)聲。
  
圖 3.6 發(fā)聲電路
3.8 74LS245引腳及功能
圖 3.7 74LS245引腳圖
74LS245是我們常用的芯片,用來(lái)驅(qū)動(dòng)led或者其他的設(shè)備,它是8路同相三態(tài)雙向總線收發(fā)器,可雙向傳輸數(shù)據(jù)。
74LS245還具有雙向三態(tài)功能,既可以輸出,也可以輸入數(shù)據(jù)。
當(dāng)80C51單片機(jī)的P0口總線負(fù)載達(dá)到或超過(guò)P0最大負(fù)載能力時(shí),必須接入74LS245等總線驅(qū)動(dòng)器。
當(dāng)片選端/E低電平有效時(shí),DIR=“0”,信號(hào)由 B 向 A 傳輸;(接收)
DIR=“1”,信號(hào)由 A 向 B 傳輸;(發(fā)送)當(dāng)/E為高電平時(shí),A、B均為高阻態(tài)。
3.9系統(tǒng)硬件連接原理總圖
圖2-6   系統(tǒng)硬件連接原理圖
3.10元器件清單
8位8段數(shù)碼管
   
1只;
AT89S52芯片
   
1只;
12MHz晶振
   
1只;
30PF瓷片電容
   
2只;
10UF電解電容
   
1只;
電阻1KΩ、200Ω、2.2KΩ
   
各一只;
按鍵BUTTON
   
13只;
三極管PNP
   
1只;
蜂鳴器
   
1只;
排阻471、102
   
各一只;
74LS245
   
一只
4 系統(tǒng)軟件設(shè)計(jì)4.1程序流程圖
               
圖4.1 程序流程圖
4.2源程序
   #include <reg52.h>      
        #define uint unsigned int
        #define uchar unsigned char
        /*-----------------------------------------------------------
                共陽(yáng)極0-9的數(shù)碼管段碼
        ------------------------------------------------------------*/
        unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
        0x92,0x82,0xf8,0x80,0x90,0xc0};
        /*-----------------------------------------------------------
            變量定義
        ------------------------------------------------------------*/
        sbit start=P3^6;
        sbit reset=P3^7;
        sbit key1=P1^0;
        sbit key2=P1^1;
        sbit key3=P1^2;
        sbit key4=P1^3;
        sbit key5=P1^4;
        sbit key6=P1^5;
        sbit key7=P1^6;
        sbit key8=P1^7;
        sbit jia=P3^4;
        sbit jian=P3^5;
    sbit jia0=P3^0;
        sbit jian0=P3^1;
      
        bit action = 0;
               
        uchar second=10,a[7]={0};
        uchar timer0_count = 0;
        uchar number=0;
        uchar number_display = 0;
        uchar k;
        /*-----------------------------------------------------------
                         延時(shí)函數(shù)
        ------------------------------------------------------------*/
        void delay(uint z)
        {
                uint x,y;
                for(x=z;x>0;x--)
                        for(y=120;y>0;y--);
        }
        /*-----------------------------------------------------------
                          顯示函數(shù)
        ------------------------------------------------------------*/
        void display(uchar number,uchar second)
        {                       
                P2 = 0x01;
                P0 = table[second];      
                delay(1);
               
                P2 = 0x02;
                P0 = table[number];
                delay(1);
               
                P2 = 0x04;
                P0 = table[a[0]];
                delay(1);
               
                P2 = 0x08;
                P0 = table[a[1]];
                delay(1);
               
                P2 = 0x10;
            P0 = table[a[2]];
                delay(1);
               
                P2 = 0x20;
                P0 = table[a[3]];
                delay(1);
               
                P2 = 0x40;
                P0 = table[a[4]];
                delay(1);
               
                P2 = 0x80;
                P0 = table[a[5]];
                delay(1);      
        }
        /*-----------------------------------------------------------
                     搶答開(kāi)始按鍵檢測(cè)函數(shù)
        ------------------------------------------------------------*/
        void start_keyscan()
        {
                while(start == 0)
                {
                    key7=0;
                        display(number_display,second);
                        if(start == 1)
                        {
                            key7=1;
                                action  = 1;
                                TR0 = 1;               
                        }
                }      
        }
      
        /*-----------------------------------------------------------
                    搶答者按鍵檢測(cè)函數(shù)
        ------------------------------------------------------------*/
        uchar key_scan8()
        {
                if(key1 == 0)
                {
                        delay(8);
                        if(key1 == 0)
                        {
                                number  = 1;
                                number_display = number;
                        }
                }
               
                if(key2 == 0)
                {
                        delay(8);
                        if(key2 == 0)
                        {
                                number  = 2;
                                number_display = number;
                        }
                }
               
                if(key3 == 0)
                {
                        delay(8);
                        if(key3 == 0)
                        {
                                number  = 3;
                                number_display = number;
                        }
                }
               
                if(key4 == 0)
                {
                        delay(8);
                        if(key4 == 0)
                        {
                                number  = 4;
                                number_display = number;
                        }
                }
               
                if(key5 == 0)
                {
                        delay(8);
                        if(key5 == 0)
                        {
                                number  = 5;
                                number_display = number;
                        }
                }
               
               
                if(key6 == 0)
                {
                        delay(8);
                        if(key6 == 0)
                        {
                                number  = 6;
                                number_display = number;
                        }
                }                                                      
                if(number_display != 0)      
                {
                        return number_display;
                }
                else
                {
                        return 0;
                }               
        }
        /*-----------------------------------------------------------
                        搶答復(fù)位函數(shù)
        ------------------------------------------------------------*/
        void reset_keyscan()
        {
                if(reset == 0)
                {
                        delay(8);
                        if(reset == 0)
                        {
                                number_display = 0;                       
                               second=10;
                }
                }      
        }
        /*-----------------------------------------------------------
                        主函數(shù)
        ------------------------------------------------------------*/
        void main()
        {
                TMOD=0x01;
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                EA=1;
                ET0=1;
                TR0=0;
                P2=0x00;                              
                while(1)
                {
                    reset_keyscan();
                        start_keyscan();
             if(jia0==0)
             {
                delay(10);
                while(jia0==0)
                    display(number_display,second);
                    second=second+1;               
             }
                 if(jian0==0)
             {
                delay(10);
                while(jian0==0)
                    display(number_display,second);
                    second=second-1;               
             }            
                         if(jia==0&&a[number-1]<9)
              {  
                 delay(10);
                 while(jia==0)
                     display(number_display,second);
                     a[number-1]=a[number-1]+1;         
              }
             if(jian==0&&a[number-1]>0)
              {
                 delay(10);
                     while (jian==0)
                     display(number_display,second);
                     a[number-1]=a[number-1]-1;
              }
                        while(action)
                        {
                         while(!key_scan8())                  //無(wú)人搶答
                        {      
                                display(number_display,second);
                                if(second == 0)
                                {
                                        second = 10;
                                        break;
                                }
                        }
                                        TR0 = 0;
                                        key7=0;
                                        delay(80);
                                   display(number_display,second);                                               
                 key7=1;
                                        action = 0;
                                        break;
                        }
                        display(number_display,second);      
                }
        }
      
        /*-----------------------------------------------------------
                        定時(shí)中斷
        ------------------------------------------------------------*/
        void timer0() interrupt 1
        {
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                timer0_count ++;
                if(timer0_count == 20)
                {      
                        second --;
                        timer0_count = 0;
          if(second==0)
                        {
                           key7=0;
                           delay(60);
                           key7=1;
                     }
                 }                       
        }
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2018-10-31 01:06 | 顯示全部樓層
樓主能分享下word嗎?
回復(fù)

使用道具 舉報(bào)

ID:423870 發(fā)表于 2018-11-9 23:24 | 顯示全部樓層
樓主有圖片嗎
回復(fù)

使用道具 舉報(bào)

ID:423756 發(fā)表于 2018-12-29 16:05 | 顯示全部樓層
請(qǐng)問(wèn)你發(fā)表的多路搶答器有實(shí)驗(yàn)原理圖嗎?可以麻煩發(fā)一下嗎
回復(fù)

使用道具 舉報(bào)

ID:651308 發(fā)表于 2019-11-28 08:41 來(lái)自觸屏版 | 顯示全部樓層
有仿真圖嗎?能不能分享一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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