標(biāo)題: 單片機(jī)設(shè)計(jì)-八路搶答器(C語(yǔ)言) [打印本頁(yè)]

作者: 51hei團(tuán)團(tuán)    時(shí)間: 2018-7-1 04:37
標(biāo)題: 單片機(jī)設(shè)計(jì)-八路搶答器(C語(yǔ)言)

一  緒論3
二  基本設(shè)計(jì)方案4
三  具體設(shè)計(jì)5
四  電路板的制作7
五  電路功能測(cè)試與調(diào)試7
六  心得體會(huì)8
附錄9
一  緒論
1.1單片機(jī)搶答器的背景
二十世紀(jì)跨越了三個(gè)“電”的時(shí)代,即電氣時(shí)代、電子時(shí)代和現(xiàn)已進(jìn)入的電腦時(shí)代。不過(guò),這種電腦,通常是指?jìng)(gè)人計(jì)算機(jī),簡(jiǎn)稱(chēng)PC機(jī)。它由主機(jī)、鍵盤(pán)、顯示器等組成。還有一類(lèi)計(jì)算機(jī),大多數(shù)人卻不怎么熟悉。這種計(jì)算機(jī)就是把智能賦予各種機(jī)械的單片機(jī)(亦稱(chēng)微控制器)。顧名思義,這種計(jì)算機(jī)的最小系統(tǒng)只用了一片集成電路,即可進(jìn)行簡(jiǎn)單運(yùn)算和控制。因?yàn)樗w積小,通常都藏在被控機(jī)械的“肚子”里。它在整個(gè)裝置中,起著有如人類(lèi)頭腦的作用,它出了毛病,整個(gè)裝置就癱瘓了,F(xiàn)在,這種單片機(jī)的使用領(lǐng)域已十分廣泛,如智能儀表、實(shí)時(shí)工控、通訊設(shè)備、導(dǎo)航系統(tǒng)、家用電器等。各種產(chǎn)品一旦用上了單片機(jī),就能起到使產(chǎn)品升級(jí)換代的功效,常在產(chǎn)品名稱(chēng)前冠以形容詞——“智能型”,如智能型洗衣機(jī)等。現(xiàn)在有些工廠的技術(shù)人員或其它業(yè)余電子開(kāi)發(fā)者搞出來(lái)的某些產(chǎn)品,不是電路太復(fù)雜,就是功能太簡(jiǎn)單且極易被仿制。究其原因,可能就卡在產(chǎn)品未使用單片機(jī)或其它可編程邏輯器件上。
在知識(shí)競(jìng)賽中,特別是做搶答題時(shí),在搶答過(guò)程中,為了更確切的知道哪一組或哪一位選手先搶答到題,必須要有一個(gè)系統(tǒng)來(lái)完成這個(gè)任務(wù)。若在搶答中,只靠人的視覺(jué)(或者是聽(tīng)覺(jué))是很難判斷出哪一組(或哪一個(gè)選手)先搶答到題的。利用單片機(jī)編程來(lái)設(shè)計(jì)搶答器,可以使以上問(wèn)題得以解決,即使兩組的搶答時(shí)間相差幾微秒,也能輕松的分辨出哪一組(或哪個(gè)選手)先搶答到題的。本文主要介紹了搶答器的工作原理及設(shè)計(jì),以及它的實(shí)際用途。  
1.2設(shè)計(jì)要求:
二  基本設(shè)計(jì)方案
2.1  單片機(jī)的選擇
我選擇STC89C52單片機(jī)芯片的理由如下:
1、在設(shè)計(jì)過(guò)程中可能會(huì)出現(xiàn)很多問(wèn)題,89C52可重復(fù)燒程序;
2、是80C51的增強(qiáng)型,功能與我們所學(xué)的51單片機(jī)基本相同;
3、學(xué)校配套發(fā)的單片機(jī)開(kāi)發(fā)板用的就是89C52,有很多相關(guān)教程,程序的測(cè)試與燒寫(xiě)都十分方便;
4、器材室很方便就能領(lǐng)到。
89C52單片機(jī),是增強(qiáng)型RISC內(nèi)載Flash的單片機(jī),芯片上的Flash存儲(chǔ)器附在用戶(hù)的產(chǎn)品中,可隨時(shí)編程,再編程,使用戶(hù)的產(chǎn)品設(shè)計(jì)容易,更新?lián)Q代方便。89C52單片機(jī)采用增強(qiáng)的RISC結(jié)構(gòu),使其具有高速處理能力,在一個(gè)時(shí)鐘周期內(nèi)可執(zhí)行復(fù)雜的指令,每MHz可實(shí)現(xiàn)1MIPS的處理能力。89C52單片機(jī)工作電壓為2.7~6.0V,可以實(shí)現(xiàn)耗電最優(yōu)化。89C52的單片機(jī)廣泛應(yīng)用于計(jì)算機(jī)外部設(shè)備,工業(yè)實(shí)時(shí)控制,儀器儀表,通訊設(shè)備,家用電器,宇航設(shè)備等各個(gè)領(lǐng)域.
2.2單片機(jī)的基本結(jié)構(gòu)  
MCS-52的引腳說(shuō)明:
MCS-52系列單片機(jī)中的8032、8052及8752均采用40Pin封裝的雙列直接DIP結(jié)構(gòu),右圖是它們的引腳配置,40個(gè)引腳中,正電源和地線兩根,外置石英振蕩器的時(shí)鐘線兩根,4組8位共32個(gè)I/O口,中斷口線與P3口線復(fù)用。 具體引腳功能不做贅述了(詳細(xì)請(qǐng)參見(jiàn)《單片機(jī)原理與接口技術(shù)》宋躍)。
圖2-2-1 STC89C52的引腳圖
2.3基本設(shè)計(jì)思路
              因?yàn)橹白鲞^(guò)單片機(jī)最小系統(tǒng)的電路,這次為了節(jié)約時(shí)間,采取在最小系統(tǒng)的板旁邊再焊一塊電路。
              一看到項(xiàng)目我的基本思路就差不多了,我要實(shí)現(xiàn)基本功能好說(shuō),倒是拓展不太難,于是選擇了拓展到8路和搶答倒計(jì)時(shí)。最小系統(tǒng)已經(jīng)包括了手動(dòng)復(fù)位電路,時(shí)鐘電路,電源電路和89C52的I/O口排插,這塊板上可以用的地方不多,只能焊一個(gè)蜂鳴器及其驅(qū)動(dòng)電路了。在另一塊板上需要有8個(gè)按鍵、8個(gè)LED燈和一個(gè)數(shù)碼管,并分別對(duì)應(yīng)三個(gè)插排。兩塊電路板之間高低電平用兩根導(dǎo)線連通。
2.4相關(guān)功能器材的選擇
              整體電路需要開(kāi)關(guān)的地方:電源的啟動(dòng),主持人的開(kāi)始與復(fù)位,8名搶答選手用的搶答按鈕。
              考慮到電源需長(zhǎng)時(shí)間保持開(kāi)啟或斷開(kāi)狀態(tài),故采用可保持按下或不按下?tīng)顟B(tài)的開(kāi)關(guān)。同理主持人的“開(kāi)始”和“未開(kāi)始”也需要這樣的開(kāi)關(guān)。8名搶答選手用的搶答按鈕,只需用4腳的按鍵即可,按下即接通,松開(kāi)就斷路。
              8個(gè)LED燈來(lái)顯示選手的搶答狀況,1個(gè)LED燈用來(lái)顯示電源的狀況;一個(gè)數(shù)碼管來(lái)顯示主持人說(shuō)“開(kāi)始”后的倒計(jì)時(shí);一個(gè)有源蜂鳴器,用一個(gè)NPN管來(lái)驅(qū)動(dòng);其他電容和電阻用最小系統(tǒng)的。
三  具體設(shè)計(jì)
3.1硬件設(shè)計(jì)
              如上所述,該電路部分電路采用之前做出來(lái)的單片機(jī)最小系統(tǒng),根據(jù)前面的思路可以在ISIS中擺出電路,如下圖所示:
圖3.1 仿真電路圖
3.2軟件設(shè)計(jì)
              在ISIS中的89C52可以仿真燒錄程序運(yùn)行,這樣可以先在Keil中編程然后燒錄看仿真結(jié)果,省時(shí)省力。
我采用C語(yǔ)言編寫(xiě)程序,詳細(xì)程序及分析請(qǐng)看附錄。
3.3仿真測(cè)試
在ISIS中調(diào)入hex文件后即可開(kāi)始仿真,仿真結(jié)果如下圖所示:
圖3.3 仿真測(cè)試結(jié)果
              主持人按下“開(kāi)始”按鈕后,數(shù)碼管開(kāi)始倒計(jì)時(shí),從9到0一秒減一下,也就是搶答倒計(jì)時(shí),在數(shù)碼管顯示0之前,8個(gè)開(kāi)關(guān)無(wú)論哪一個(gè)先按下,對(duì)應(yīng)的燈就會(huì)亮(蜂鳴器沒(méi)響,因?yàn)榉抡娌怀鰜?lái)),當(dāng)這個(gè)燈亮起后,不論其他的開(kāi)關(guān)怎樣按都不能改變燈亮的情況,也就是實(shí)現(xiàn)了搶答的功能。如果數(shù)碼管減到0了都沒(méi)人搶答,則搶答作廢,這時(shí)無(wú)論再怎樣搶答都不會(huì)有燈亮,實(shí)現(xiàn)搶答倒計(jì)時(shí)的功能。在主持人再次按下“復(fù)位”按鈕(和“開(kāi)始”是同一個(gè))時(shí),數(shù)碼管和LED都熄滅,同時(shí)所有人都不能搶答,實(shí)現(xiàn)清零功能。
四  電路板的制作
4.1元件清單
元件
數(shù)量
STC89C52
1
40PIC座
1
按鍵
8
開(kāi)關(guān)
2
LED燈(紅)
9
排針
3
8管腳數(shù)碼管
1
蜂鳴器
1
S9012
1
33pF瓷片電容
2
11.0592晶振
1
10uF電解電容
1
1k電阻
1
10k電阻
1
電源插口
1
導(dǎo)線
若干
萬(wàn)用板7*9CM
1
4.2焊接
              在實(shí)際焊接過(guò)程中,有很多地方元件以及走線十分密集,如8個(gè)按鍵、8個(gè)LED燈、8腳數(shù)碼管和3個(gè)排針的焊接,這需要十分的耐心,稍不注意就將排布密集的錫線焊到了一起,只能用錫槍吸走重新焊。
              還有一些問(wèn)題如元件如何擺放平整,如果不平整其他元件難以放得下;LED燈和數(shù)碼管不能用高溫焊太久,否則會(huì)毀掉,到時(shí)候很難檢查出問(wèn)題;元件的排版必須事先計(jì)算好,連走線都要想好,不然一步錯(cuò)步步錯(cuò)。
              經(jīng)過(guò)一個(gè)下午的焊接,最終還是將它做出來(lái)了。
五  電路功能測(cè)試與調(diào)試
5.1測(cè)試
              測(cè)試采用5V電源線接電腦供電,先用開(kāi)發(fā)板將程序燒錄進(jìn)89C52,然后插入到板上的IC座,將剩余的線連好后開(kāi)啟電源,電源指示燈亮,結(jié)果數(shù)碼管不亮,按搶答器也不亮,復(fù)位鍵也無(wú)任何作用,蜂鳴器也不響。
5.2調(diào)試
              一下是我遇到的問(wèn)題及解決的過(guò)程。
              1、除電源鍵外,其他鍵都無(wú)反應(yīng),蜂鳴器也不響。仔細(xì)檢查電路后,我發(fā)現(xiàn)是接口接觸的問(wèn)題,而且我NPN管忘了接P0口。
              2、通電后,數(shù)碼管不亮,能實(shí)現(xiàn)搶答器的功能,但一旦按下按鍵蜂鳴器一直響。后來(lái)發(fā)現(xiàn)是我程序我的問(wèn)題,仿真上顯示不出來(lái),于是我修改程序。
              3、通電后,能實(shí)現(xiàn)搶答的功能,蜂鳴器也能正常工作了,但是數(shù)碼管顯示亂碼,還是一秒一跳。后來(lái)我發(fā)現(xiàn)本身程序有一點(diǎn)問(wèn)題,仿真程序上的數(shù)碼管和我自己用的數(shù)碼管不同,只能修改程序。
              最后,經(jīng)過(guò)一系列的調(diào)試與修改后,終于實(shí)現(xiàn)了預(yù)期功能。
六  心得體會(huì)
              經(jīng)過(guò)一個(gè)星期的努力,我完成了設(shè)計(jì)任務(wù),通過(guò)此次設(shè)計(jì),我重新認(rèn)識(shí)到了自學(xué)的重要性,以及學(xué)以致用的道理。我在圖書(shū)館以及網(wǎng)上查閱了大量的資料,同時(shí)也認(rèn)識(shí)到了查閱信息的重要作用。通過(guò)此次的搶答器的設(shè)計(jì),讓我重新拾起了以前所學(xué)習(xí)的電子知識(shí),及我覺(jué)得此次設(shè)計(jì)讓我更加鞏固了所學(xué)的知識(shí)并在設(shè)計(jì)的過(guò)程中學(xué)會(huì)了與時(shí)俱進(jìn),讓我受益匪淺。這一次設(shè)計(jì)的練習(xí),很多事情我都不可以獨(dú)立完成,很多方面都需要同學(xué)的幫助,我也深刻認(rèn)識(shí)到自己的不足,知識(shí)的欠缺問(wèn)題很大,需要在編程方面大下功夫。同時(shí)因?yàn)槲疫@次設(shè)計(jì)用的是C語(yǔ)言,也希望自己學(xué)的更好了以后,能用匯編語(yǔ)言來(lái)實(shí)現(xiàn)同樣的功能。還有一點(diǎn)很重要,不能依賴(lài)仿真軟件,軟件本身有很多弊端不說(shuō),仿真出來(lái)的結(jié)果也不一定正確,很容易被誤導(dǎo),
附錄
電路板實(shí)物圖:


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. unsigned char flag,num1,num2;
  3. sbit a1=P3^0;//P3口開(kāi)關(guān)
  4. sbit a2=P3^1;
  5. sbit a3=P3^2;
  6. sbit a4=P3^3;
  7. sbit a5=P3^4;
  8. sbit a6=P3^5;
  9. sbit a7=P3^6;
  10. sbit a8=P3^7;
  11. sbit b1=P1^0;//P1口蜂鳴器
  12. sbit b2=P1^1;
  13. sbit b3=P1^2;
  14. unsigned char code table[]={0x80,0xf9,0x4c,0x60,0x31,0x22,0x02,0xf0,0x00,0x20};//數(shù)碼管顯示
  15. void display()
  16. {
  17. P2=table[num2]; //P2口數(shù)碼管
  18. }
  19. void init()
  20. {
  21. num2=9;
  22. TMOD=0X01;
  23. TH0=(65536-45872)/256;
  24. TL0=(65536-45872)/256;
  25. EA=1;
  26. ET0=1;
  27. TR0=1;
  28. flag=1;//全局變量
  29. P0=0xff;//P0口LED燈
  30. b1=1;
  31. P2=0xff;
  32. }
  33. void delay(int z)//延時(shí)程序
  34. {
  35.   int i,j;
  36.   for(i=0;i<z;i++)
  37.     for(j=0;j<110;j++);
  38. }
  39. void main()
  40. {
  41. init();
  42. while(flag)
  43. {
  44.    if(a1==0)
  45.    {
  46.      delay(100);//調(diào)用延時(shí)程序消除抖動(dòng)
  47.      if(a1==0)//判斷開(kāi)關(guān)a1是否按下
  48.      {
  49.        flag=0;
  50.        P0=0xfe;//對(duì)應(yīng)LED燈亮
  51.        b1=0;//蜂鳴器響
  52.        while(!a1);//按住時(shí)持續(xù)響
  53.        b3=0;
  54.        b1=1;
  55.       }
  56.    }
  57.    if(a2==0)//同理判斷a2
  58.    {
  59.      delay(100);
  60.      if(a2==0)
  61.      {
  62.        flag=0;
  63.        P0=0xfd;
  64.        b1=0;
  65.        while(!a2);
  66.        b1=1;
  67.       }
  68.     }
  69.    if(a3==0)//同理判斷a3
  70.    {
  71.      delay(100);
  72.      if(a3==0)
  73.      {
  74.        flag=0;
  75.        P0=0xfb;
  76.        b1=0;
  77.        while(!a3);
  78.        b1=1;
  79.       }
  80.     }
  81.    if(a4==0)//同理判斷a4
  82.    {
  83.      delay(100);
  84.      if(a4==0)
  85.      {
  86.        flag=0;
  87.        P0=0xf7;
  88.        b1=0;
  89.        while(!a4);
  90.        b1=1;
  91.       }
  92.     }
  93.    if(a5==0)//同理判斷a5
  94.    {
  95.      delay(10);
  96.      if(a5==0)
  97.      {
  98.        flag=0;
  99.        P0=0xef;
  100.        b1=0;
  101.        while(!a5);
  102.        b1=1;
  103.       }
  104.     }
  105.    if(a6==0)//同理判斷a6
  106.    {
  107.      delay(10);
  108.      if(a6==0)
  109.      {
  110.        flag=0;
  111.        P0=0xdf;
  112.        b1=0;
  113.        while(!a6);
  114.        b1=1;
  115.       }
  116.     }
  117.    if(a7==0)//同理判斷a7
  118.    {
  119.      delay(10);
  120.      if(a7==0)
  121.      {
  122.        flag=0;
  123.        P0=0xbf;
  124.        b1=0;
  125.        while(!a7);
  126.        b1=1;
  127.       }
  128.     }
  129.    if(a8==0)//同理判斷a8
  130.    {
  131.      delay(10);
  132.      if(a8==0)
  133.      {
  134.        flag=0;
  135.        P0=0x7f;
  136.        b1=0;
  137.        while(!a8);
  138.        b1=1;
  139.       }
  140.     }
  141. }
  142. while(!flag)
  143. {

  144.    EA=0;

  145.   if(P3!=0xff)//沒(méi)有開(kāi)關(guān)按下時(shí)不響也不亮
  146.   {
  147.     b1=0;   b2=0;
  148.     delay(50);
  149.   }
  150.   else b1=1;
  151.   }
  152. ……………………

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

Word文檔下載:
單片機(jī)課程設(shè)計(jì)-八路搶答器(C語(yǔ)言).doc (573.5 KB, 下載次數(shù): 197)


作者: feiji666    時(shí)間: 2018-7-1 20:40
好用,感謝
作者: 553783431    時(shí)間: 2018-10-11 15:24
不錯(cuò),參考一下,賺分下載
作者: AKBC八百    時(shí)間: 2020-6-27 18:23
可以參考一下
作者: 西風(fēng)125    時(shí)間: 2020-6-29 15:17
feiji666 發(fā)表于 2018-7-1 20:40
好用,感謝

那個(gè)復(fù)位鍵怎么沒(méi)用,請(qǐng)教一下
作者: 8751090    時(shí)間: 2020-12-17 14:10
復(fù)位鍵按下沒(méi)有反應(yīng),請(qǐng)問(wèn)是怎么回事?
作者: 2609929385    時(shí)間: 2021-10-8 15:47
復(fù)位鍵沒(méi)反應(yīng),請(qǐng)問(wèn)怎么改程序
作者: 2609929385    時(shí)間: 2021-10-12 09:06
大家有會(huì)改復(fù)位電路的嗎?




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