標(biāo)題: 基于單片機(jī)的6路搶答器的設(shè)計報告+源碼+仿真 [打印本頁]

作者: luxuana    時間: 2018-12-30 16:15
標(biāo)題: 基于單片機(jī)的6路搶答器的設(shè)計報告+源碼+仿真
實(shí)訓(xùn)題目:基于單片機(jī)的搶答器的設(shè)計
1 系統(tǒng)設(shè)計
1.1 設(shè)計要求
1.1.1設(shè)計任務(wù)  
基于單片機(jī)的搶答器的設(shè)計
1.1.2性能指標(biāo)要求
① 需要自己設(shè)計電路并焊接電路板。
② 基本要求:有一個主持人控制開關(guān)和6路搶答按扭,當(dāng)主持人允許搶答時才能進(jìn)行搶答操作,并用一個數(shù)碼管顯示搶答選手的號碼,同時其他選手不能再搶答。
③ 當(dāng)主持人允許搶答后倒計時5秒時間,在這5秒內(nèi)搶答有效,過后就不能進(jìn)行搶答了。
④ 電路上要加個蜂鳴器的電路,當(dāng)有選手搶答時蜂鳴器響一下。
⑤ 當(dāng)有選手搶答后,進(jìn)行倒計時20秒作為選手回答問題時間,用兩個數(shù)碼管顯示,倒計時時間到時有聲光提示。
⑥ 畫電路板時要增加下載接口,方便調(diào)試程序。
⑦ 擴(kuò)展功能(選做):
用按鍵可設(shè)置倒計時的時間,范圍在5秒到30秒之間。
1.2 設(shè)計思路及設(shè)計框圖
1.2.1設(shè)計思路
設(shè)計思路如下:
電路通電后,LED閃爍三次,表示電路各功能正常。搶答之前必須由主持人控制,所以在芯片的P1^0腳處接入開始按鍵。搶答時必須有選手搶答電路,因?yàn)轭}目要求6位選手搶答,所以分別在P1^1~P1^6設(shè)置了從1~6號選手的搶答按鍵。當(dāng)主持人按下開始搶答鍵時,6位選手連接的單片機(jī)從P1^1~P1^6的任意1位選手都可以進(jìn)行搶答,搶答時間為5s。主持人按下開始搶答按鍵以后,會進(jìn)入5s倒計時搶答時間,如若在5s之內(nèi),有選手搶答成功,則數(shù)碼管顯示搶答選手的號數(shù),搶答成功后燈光提示0.5秒,系統(tǒng)開始自動設(shè)定回答問題時間為20s,倒計結(jié)束時LED燈亮,并且蜂鳴器響1s,1秒后重新等待主持人控制。
拓展功能利用三個按鍵來實(shí)現(xiàn)控制回答問題的時間的增減,有1號和6號選手按鍵同時按下開啟回答時間調(diào)整功能,時間加計數(shù)的設(shè)置控制鍵為P1^1,每當(dāng)按鍵按下并松開,則倒計時加一。時間減計數(shù)的設(shè)置控制按鍵為P1^6,每當(dāng)按鍵按下并松開,則倒計時減一,主持人按鍵P1^0按下來確定回答問題的時間,而且加減計時時間的范圍在5s~30s內(nèi),主持人確定時間后會有1s的燈光提示,表示調(diào)整完成。P0口接的是一個四位一體共陰數(shù)碼管,P2.0~P2.3作為數(shù)碼管的位選。三極管8050在電路當(dāng)中起了開關(guān)的作用,當(dāng)控制三極管開關(guān)狀態(tài)的管腳P3^3輸出高電平時,蜂鳴器響,反之蜂鳴器停。

1.2.2總體設(shè)計框圖


2 各個模塊程序的設(shè)計
2.1 單片機(jī)


STC89C52RC是以51為內(nèi)核的8位單片機(jī),芯片總共有40個引腳。
P0~P3:總共占32個引腳,其中P0是低8位地址線/數(shù)據(jù)線的端口,P1是數(shù)據(jù)線端口,P2是高8位地址線/數(shù)據(jù)線端口,P3是數(shù)據(jù)線/第二功能線端口。P0口內(nèi)部沒有上拉電阻,所以在P0用作輸出時必須外加上拉電阻。
EA~ /VPP:片外程序ROM有效編程電源,作EA~用時為輸出信號,EA~=0片外程序ROM有效,EA~=1片內(nèi)ROM有效,作VPP用時為電源輸入。
XTAL1和XTAL2:外部時鐘震蕩輸入端
RST/VPD:復(fù)位/備用電源接入。正常工作時作復(fù)位信號引入,當(dāng)VCC失電時,此腳接入備用電源,使片內(nèi)RAM中的數(shù)據(jù)處于底功能保護(hù)。
2.2 最小系統(tǒng)


這兩部分電路分別為晶振電路和復(fù)位電路,這兩塊電路與單片機(jī)的電源電路共同組成了單片機(jī)的最小系統(tǒng)。
晶振電路由晶振和兩個瓷片電容組成,本實(shí)訓(xùn)采用晶振為12MHZ,瓷片電容的容量為22PF,瓷片電容是沒有正負(fù)極之分的。
本次實(shí)訓(xùn)采用的復(fù)位電路是手動復(fù)位方式,當(dāng)復(fù)位鍵按下,RST由低電平變?yōu)楦唠娖,RST引腳獲得2個機(jī)器周期的脈沖后,實(shí)現(xiàn)手動硬件復(fù)位,使單片機(jī)重新開始執(zhí)行程序。
2.3 按鍵模塊電路


按鍵一端接地,一端接單片機(jī)I/O口。當(dāng)按鍵按下時,電平狀態(tài)因一端接地被拉低。
2.4 數(shù)碼管顯示模塊電路


本次實(shí)訓(xùn)用的是四位共陰數(shù)碼管,A,B,C,D,E,F,G,DP控制段選;1,2,3,4控制位選。
2.5 蜂鳴器與LED燈模塊電路

在本次實(shí)訓(xùn)中,蜂鳴器電路材料有8050(NPN)三極管,一個限流電阻,一個蜂鳴器,此時電路中的三極管充當(dāng)開關(guān)作用,當(dāng)P3^3=1時三極管導(dǎo)通,則蜂鳴器響,反之不響。
LED負(fù)極端通過限流電阻接地,正極接入I/O口,當(dāng)P3^4=1時,LED亮,反之滅。
3  調(diào)試過程
焊完板子后用下載線接通電源,觀察電源指示燈是否正常,指示燈閃爍后停止工作,斷電檢查電路,發(fā)現(xiàn)有一接地端未聯(lián)通,接通后發(fā)現(xiàn)電源指示燈不在工作。
軟件燒錄時一直在檢測單片機(jī),在嘗試斷電重連,讀寫反接后燒錄成功。
在驗(yàn)證功能期間發(fā)現(xiàn)“選手回答問題結(jié)束”后,蜂鳴器和LED一直處在開啟狀態(tài),需要復(fù)位按鍵復(fù)位后才能使用;電源指示燈不工作(可能燒壞了),無法判斷電路是否正常;修改代碼將聲光提醒改為1s,1s后自動恢復(fù)等待主持人操作;通電后LED閃爍三次,閃爍結(jié)束后等待主持人操作。
在硬件不改變的前提增加擴(kuò)展功能,使用1號和6號選手按鍵同時按下開啟回答時間調(diào)整功能,時間加計數(shù)的設(shè)置控制鍵為P1^1,每當(dāng)按鍵按下并松開,則倒計時減1。時間減計數(shù)的設(shè)置控制按鍵為P1^6,每當(dāng)按鍵按下并松開,則倒計時加1,或者一直按著加(減)按鍵,倒計時會每個0.5s實(shí)現(xiàn)自加(減)1,主持人按鍵P1^0按下來確定回答問題的時間,加減計時時間的調(diào)整范圍在5s~30s內(nèi),主持人確定時間后會有1s的燈光提示,表示調(diào)整完成。
4  功能測試
4.1 測試儀器與設(shè)備
電腦 :一臺
萬用表 :一臺
燒錄器 :一個
4.2 性能指標(biāo)測試
1.總共有六路搶答,在主持人允許搶答才可以開始搶答,倒計時5秒。
2.一個搶答后,其他選手不能再搶答,可以設(shè)定時間來限制回答問題的時間。
3.當(dāng)有選手開始搶答時,蜂鳴器響一聲。
4.選手回答時間結(jié)束時有聲光顯示
5.可以通過按鍵來設(shè)置回答問題時間(5-30秒)。
4.3 誤差分析
有時候按鍵不防抖或無反應(yīng)
5  實(shí)訓(xùn)心得體會
經(jīng)過這一周的單片機(jī)實(shí)訓(xùn),結(jié)合之前的單片機(jī)理論課和實(shí)驗(yàn)課,各個書本與老師的答疑解惑下,我終于完成了本次實(shí)訓(xùn),在單片機(jī)電路連接中只需要把單片機(jī)最小系統(tǒng)做出來然后把IO口接各個外圍器件,寫好程序進(jìn)行操控就可以了,但是也非?疾烊说募(xì)心和焊功是否牢固。
在這學(xué)習(xí)的過程中,我通過網(wǎng)上查了許多單片機(jī)的資料,讓我明白了51單片機(jī)的I/0的作用,由于P0口與P1\P2\P3口不同,因?yàn)槠鋬?nèi)部沒有上拉電阻,如果不加上拉電阻,會呈現(xiàn)高阻狀態(tài),所以當(dāng)我們需要用P0口給數(shù)碼管進(jìn)行段選時,P0口必須外加上拉電阻,通常為10K的排阻。通過分析網(wǎng)上列出的幾種不同的蜂鳴器控制電路,我懂得了本次實(shí)訓(xùn)蜂鳴器控制電路中的三極管在電路中充當(dāng)著開關(guān)作用,電阻充當(dāng)著限流作用,保護(hù)電路。51單片機(jī)I/O口充當(dāng)控制作用。
在此,我感謝指導(dǎo)我的老師們,通過本次實(shí)訓(xùn)學(xué)習(xí)到的知識是從理論課本上獲取不到的,這些調(diào)試電路的經(jīng)驗(yàn),調(diào)試代碼的經(jīng)驗(yàn),51單片機(jī)的原理,統(tǒng)統(tǒng)需要實(shí)踐的積累。在今后遇到使用單片機(jī)所做的項(xiàng)目,我都會通過這次的實(shí)訓(xùn)的經(jīng)驗(yàn)來擬定好一個方案,并能夠設(shè)計基礎(chǔ)電路,在軟件方面還需多加練習(xí),多寫程序,吸收別人的思維方式,腦海中要構(gòu)造好流程圖,流程圖做好,每一步需要怎么寫怎么做就一目了然了。

附錄1:仿真圖

附錄2:程序

  1. #include <reg52.h>
  2. /*******定 義 參 數(shù)*******/
  3. unsigned char xianshi, kaishi=5, daojishi=20, haoma=0, bitdisplay=0, k=0;
  4. unsigned int i,n=0,  bittime=0;
  5. sbit d1=P1^1;      //選手1
  6. sbit d2=P1^2;      //選手2
  7. sbit d3=P1^3;      //選手3
  8. sbit d4=P1^4;      //選手4
  9. sbit d5=P1^5;      //選手5
  10. sbit d6=P1^6;      //選手6
  11. sbit start=P1^0;   //主持人
  12. sbit LED=P3^4;
  13. sbit fmq=P3^3;     //蜂鳴器
  14. unsigned char Tab[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
  15. /*******延 時 計 數(shù)*******/
  16. void delay (unsigned int t) //t=1時,延時1ms
  17. {
  18.               unsigned int a,b;
  19.               for(a=0;a<t;a++)
  20.                             for(b=0;b<120;b++);
  21. }
  22. /*******中斷函數(shù)*******/
  23. void timer0(void)interrupt 1  //5ms中斷一次
  24. {
  25.               TH0 = (65536-5000)/256;
  26.               TL0 = (65536-5000)%256;
  27.               switch(bitdisplay)   //動態(tài)顯示
  28.               {
  29.               case 0:P2=0xFE;P0=Tab[xianshi/10];break;
  30.               case 1:P2=0xFD;P0=Tab[xianshi%10];
  31. break;
  32.               case 2:P2=0xF7;P0=Tab[haoma];break;
  33.               case 3:P2=0xFB;P0=0x40; break;
  34.               }
  35.               bitdisplay++;                 
  36.               bittime++;                                         
  37.               if(bitdisplay==4)
  38.                             bitdisplay=0;
  39.               if(bittime==200)               //5*200=1000ms
  40.               {
  41.                             bittime=0;
  42.                             xianshi--;
  43.               }
  44.               if(xianshi==0) /*如果倒計時結(jié)束則蜂鳴器與LED顯示*/
  45.               {
  46.                             P2=0xff;
  47.                             fmq=1;
  48.                             LED=1;              
  49.                             delay(1000);
  50.                             fmq=0;
  51.                             LED=0;
  52.                             TR0=0;
  53.               }
  54. }
  55. void djtime() //倒計時間修改
  56. {
  57. if(d1==0&&d6==0)
  58.               {
  59.                             n=1;
  60.               }
  61.               while(n)
  62.                             {
  63.                                           for(i=0;i<50;i++)
  64.                                           {
  65.                                           P2=0xFB;P0=Tab[daojishi/10];
  66.                                                         delay(5);
  67.                                P2=0xF7;P0=Tab[daojishi%10];
  68.                                                         delay(5);
  69.                                           }
  70.                                           if(d1==0)
  71.                                           delay(33);
  72.                                           if(d1==0)
  73.                                           daojishi--;
  74.                                           if(d6==0)
  75.                                           delay(33);
  76.                                           if(d6==0)
  77.                                           daojishi++;
  78.                                           if(daojishi>30)
  79.                                           daojishi=30;
  80.                                           if(daojishi<5)
  81.                                           daojishi=5;
  82.                                           if(start==0)
  83.                                           delay(33);
  84.                                           if(start==0)
  85.                                           {
  86.                                           n=0;
  87.                                           LED=1;
  88.                                           for(i=0;i<100;i++)
  89.                                           {
  90.                                           P2=0xFB;P0=Tab[daojishi/10];
  91.                                                         delay(5);
  92. P2=0xF7;P0=Tab[daojishi%10];
  93.                                                         delay(5);
  94.                                           }
  95.                                           P2=0xff;                                                                     
  96.                                           LED=0;
  97.                                           }
  98.                             }
  99. }
  100. /*******主  函  數(shù)*******/
  101. void main()
  102. {            
  103.               TMOD=0X01;                           
  104.               TH0 = (65536-5000)/256;
  105.               TL0 = (65536-5000)%256;
  106.               EA=1;                           
  107.               ET0=1;                 //定時器中斷
  108.               TR0=0;              //定時器,等待手動開啟
  109.               fmq=0;
  110.               for(i=0;i<6;i++)
  111.                             {
  112.                                           LED=~LED;
  113.                                           delay(500);
  114.                             }
  115.               LED=0;  
  116.               while(1)
  117.               {  
  118.                             djtime();
  119.                             if(start==0)      
  120.                                           delay(33);
  121.                             if(start==0)
  122.                             {
  123.                                           k=1;
  124.                                           haoma=0;                 
  125.                                           xianshi=kaishi;               
  126.                                           TR0=1;
  127.                             }                                         
  128.                             while(k)
  129.                             {
  130.                                           while(xianshi)
  131.                                           {
  132.                                                         if(d1==0)
  133.                                                                       delay(33);
  134.                                                         if(d1==0)
  135.                                                         {            
  136.                                                                       haoma=1;
  137.                                                                       break;            
  138.                                                         }
  139.                                                         if(d2==0)
  140.                                                                       delay(33);
  141.                                                         if(d2==0)
  142.                                                         {                                                      
  143.                                                                       haoma=2;
  144.                                                                       break;                                         
  145.                                                         }
  146.                                                         if(d3==0)              
  147.                                                                       delay(33);
  148.                                                         if(d3==0)
  149.                                                         {                                                      
  150.                                                                       haoma=3;
  151.                                                                       break;                                         
  152.                                                         }                           
  153.                                                         if(d4==0)                                          
  154.                                                                       delay(33);
  155.                                                         if(d4==0)
  156.                                                         {                                                      
  157.                                                                       haoma=4;
  158.                                                                       break;                                         
  159.                                                         }                                         
  160.                                                         if(d5==0)                                          
  161.                                                                       delay(33);
  162.                                                         if(d5==0)

  163.                                                         {                                                      
  164. ……………………

  165. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


全部資料51hei下載地址:
搶答器.7z (445.8 KB, 下載次數(shù): 230)



作者: 18378601027    時間: 2019-6-5 12:49
后面為啥看不見
作者: niubi    時間: 2019-6-6 13:59
求一個三路搶答器帶液晶屏的仿真和源代碼
作者: 行者黑夜    時間: 2019-6-13 14:01
厲害~~~~~
作者: 秦晨猛    時間: 2019-6-24 09:39
太厲害了吧
作者: 秦晨猛    時間: 2019-6-24 09:41
厲害厲害 太愛樓樓了
作者: zjc1914709110    時間: 2019-11-14 10:52
后面的沒有了嗎

作者: 961960754    時間: 2019-11-18 11:30
也太厲害了吧
作者: linnyshow    時間: 2019-11-19 14:14
看不到了。

作者: gyugfggfj    時間: 2019-12-30 03:02
有12個按鍵的嘛

作者: 845356005    時間: 2019-12-31 22:43
寫的很好,也很對,里面通過1和6按鍵修改倒計時,而且還能實(shí)現(xiàn)搶答的功能,k用來控制搶答,n用來控制修改時間,多謝樓主幫助。
作者: c0f9a4    時間: 2023-11-23 20:59
用不了
作者: 1854124262    時間: 2023-11-28 21:09
還不錯的程序,值得借鑒
作者: TGP麟    時間: 2024-9-22 14:19
c0f9a4 發(fā)表于 2023-11-23 20:59
用不了

確定是用不了嗎?





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