❶ 求~51單片機的八路搶答器設計程序和原理圖,PCB
ORG 0000H
M: MOV P1, #0FEH
MOV P3, #00H
JNB P2.0, C1
JNB P2.1, C2
JNB P2.2, C3
SJMP M
C1: MOV P3, #06H
SJMP S1
C2: MOV P3, #5BH
SJMP S1
C3: MOV P3, #4FH
SJMP S1
S1: NOP
SJMP S1
END
這個是我以前做過的三路的搶答器的 你可以稍加改動一下就能實現八路的 我只會這一部分 很久沒有接觸了 都忘的差不多了
❷ 51單片機4路搶答器,求大神幫我做一個,急需。要求用匯編語言。還要有protues的模擬圖!!!
ORG0000H
JMPBEGIN
ORG0030H
TABLE:;共陰極數碼管顯示代碼表
DB3FH,06H,5BH,4FH,66H;01234
DB6DH,7DH,07H,7FH,6fh;56789
DELAY:MOVR5,#20
LOOP4:MOVR6,#50H;延時20X20ms
LOOP5:MOVR7,#100
DJNZR7,$
DJNZR6,LOOP5
DJNZR5,LOOP4
RET
;---------------------------------------
BEGIN:MOVP2,#0FFH;P2口置高電平,准備接收信號
MOVR4,#0
MOVA,R4;R4位標志值送A寄存器
AGAIN:MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP1,A
LOOP1:MOVA,P3;接收p3口的搶答信號
CPLA
JZLOOP1
LOOP2:RRCA;有人搶答信號則逐次移動判斷哪一位搶答
INCR4
JNCLOOP2
;********************
MOVA,R4
CJNEA,#5,LOOP3
LOOP3:
JCLOOP4
MOVR4,#0
SJMPLOOP1
LOOP4:
MOVCA,@A+DPTR;找到相應位顯示代碼
MOVP1,A
LEDDIS:
MOVA,#0FFH
CLRC
LEDDIS1:
RLCA
DJNZR4,LEDDIS1
MOVP0,A
LOOP3:JNBP2.2,BEGIN;若主持人按下復位信號鍵,則轉向主程序
CPLP2.0;若沒按復位信號鍵,則通過p2.2口給出高低信號驅動蜂鳴器
LCALLDELAY;調用延時子程序
SJMPLOOP3;p2.2口反復間隔0.4s變化,驅動蜂鳴器
END
❸ 搶答器電路圖
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日樓主 QQ
--------------------------------------------------------------------------------
搶答器電路圖問的人滿多的
特收集一些到這里
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:43:56 USB介面的ISPRO熱賣中
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 2 樓 QQ
--------------------------------------------------------------------------------
在各種知識競賽,搶答器是少不了的,這里給大家提供一種製作搶答器的方法,有條件的朋友不妨做一個。
這個搶答器由單片機以及外圍電路組成,由於採用單片機,使得外圍電路非常簡單,但是功能並不比一般的搶答器少。
如下圖為搶答器的電路原理圖,單片機AT90S1200的PB口的PB7~PB2為輸入口,接搶答按鍵開關,當有某個按鍵按下時,對應口的電位跳低,被單片機檢測到並執行相應的程序,比如讓數碼管顯示或者控制音響電路發聲等。PD口接數碼管,用於顯示哪個組搶到,並一數值方式顯示出來。PB口的PB0通過電容接到門鈴音樂集成電路的觸發端,當有某一組搶到時發出聲音。電路中,輕觸開關SB為復位開關,按下SB,可以讓系統復位。當一次搶答完畢以後,只有按下SB,讓系統復位,在下一次搶答時,各個組的搶答按鍵才有用,否則,搶答按鍵沒有作用。
本電路對元件沒有什麼特殊要求,按照圖中標明的型號選用即可。電路中R10的數值由自己定,要求是使音樂片正常工作即可,因為音樂片並不是一直在工作,因此,我在製作時把R10省了,也不怎麼樣。音樂片採用叮咚門鈴音樂片,要注意在音樂片上焊上一個NPN型三極體(三極體在圖中我沒有畫出來),比如9013。注意要在穩壓集成電路7805上加上散熱片。
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:44:38 PC/MCU/CPLD三合一學習套件
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 3 樓 QQ
--------------------------------------------------------------------------------
圖片
此主題相關圖片如下:
此主題相關圖片如下:
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:45:27 USB介面的ISPRO熱賣中
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 4 樓 QQ
--------------------------------------------------------------------------------
由觸發器構成的改進型搶答器
1.初步了解觸發器的基本功能及特點。
2. 熟悉具有接收、保持、輸出功能電路的基本分析方法。
3. 掌握觸發器應用電路的分析方法。
4. 建立時序邏輯電路的基本概念。
器件:74LS00 1片,雙四輸入與非門74LS20 2片,按鍵式開關4個,指示燈(發光二極體)三隻、510Ω電阻3個、1SΩ電阻4個、導線若干。
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:49:39 經典串口的ISPRO優惠中
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 5 樓 QQ
--------------------------------------------------------------------------------
電路圖
此主題相關圖片如下:
實訓電路原理圖如圖所示。改進型搶答器電路減少了一個輸入端,而在每一個輸入端增加了兩個與非門(圖中的門4~門9),該電路作為搶答信號的接收、保持和輸出的基本電路。S為手動清零控制開關,S1~S3為搶答按鈕開關。
該電路具有如下功能:
(1)開關S作為總清零及允許搶答控制開關(可由主持人控制),當開關S被按下時搶答電路清零,松開後則允許搶答。輸入搶答信號由搶答按鈕開關S1~S3實現。
(2)若有搶答信號輸入(開關S1~S3中的任何一個開關被按下)時,與之對應的指示燈被點亮。此時再按其他任何一個搶答開關均無效,指示燈仍「保持」第一個開關按下時所對應的狀態不變。
電路中,6個二輸入與非門採用兩個74LS00,3個三輸入與非門採用74LS20。
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:50:52 PC/MCU/CPLD三合一學習套件
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 6 樓 QQ
--------------------------------------------------------------------------------
出端的引腳編號。
2)連接電路
按圖3.1連接電路。先在實訓電路板上插接好IC器件。在插接器件時,要注意IC晶元的豁口方向(都朝左側),同時要保證IC管腳與插座接觸良好,管腳不能彎曲或折斷。指示燈的正、負極不能接反。在通電前先用萬用表檢查各IC的電源接線是否正確。
3)電路調試
首先按搶答器功能進行操作,若電路滿足要求,說明電路沒有故障。若某些功能不能實現,就要設法查找並排除故障。排除故障可按信息流程的正向(由輸入到輸出)查找,也可按信息流程逆向(由輸出到輸入)查找。
例如:當有搶答信號輸入時,觀察對應指示燈是否點亮,若不亮,可用萬用表(邏輯筆)分別測量相關與非門輸入、輸出端電平狀態是否正確,由此檢查線路的連接及晶元的好壞。
若搶答開關按下時指示燈亮,松開時又滅掉,說明電路不能保持,此時應檢查與非門相互連接是否正確,直至排除全部故障為止。
4)電路功能試驗
(1)按下清零開關S後,所有指示燈滅。
(2)選擇開關S1~S3中的任何一個開關(如S1)按下,與之對應的指示燈(D1)應被點亮,此時再按其他開關均無效。
(3)按控制開關S,所有指示燈應全部熄滅。
(4)重復(2)和(3)步驟,依次檢查各指示燈是否被點亮。
5)電路分析
分析圖3.1實訓電路,完成表3.1各項內容 ,表中H表示指示燈亮,L表示指示燈滅。如果不能正確分析,可以通過試驗檢測來完成。
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:51:39 超級51開發板套件,前衛實用超值
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 7 樓 QQ
--------------------------------------------------------------------------------
功能表
S S3 S2 S1
Q3 Q2 Q1 D3 D2 D1
L H H H
L H H L
L H L H
L L H H
H H H H
H H H L
H H L H
H L H H
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:51:54 經典串口的ISPRO優惠中
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 8 樓 QQ
--------------------------------------------------------------------------------
實訓步驟與要求
1)檢測與查閱器件
用數字集成電路測試儀檢測所用的集成電路。通過查閱集成電路手冊,標出圖3.1中各集成電路輸入、輸實訓總結與分析
(1)在第2章的實訓(實訓2)中,由於電路本身沒有保持功能,所以搶答開關必須用手按住不動,指示燈才會點亮,若手鬆開指示燈就熄滅。這對輸入搶答操作十分不便。在本實訓中,通過在輸入端接入兩個首尾交叉連接的雙輸入與非門(如圖3.1所示),解決了這一問題。實驗證明,該電路能將輸入搶答信號狀態「保持」在其輸出端不變。比如搶答開關S1按下時,與其連接的與非門5的輸出端Q1變為高電平,使與非門1輸出低電平,指示燈D1點亮;當開關S1松開後,與非門5的輸出狀態仍保持高電平不變,指示燈D1仍保持點亮狀態。
(2)在圖3.1中,將與非門4、5連接構成的電路既有接收功能同時又具有保持功能。在電路中可將與非門4、5連接構成的電路看成一個專門電路(虛框內電路),該電路能接收輸入信號並按某種邏輯關系改變輸出端狀態。在一定條件下,該狀態不會發生改變,即「保持」不變。
(3)這類具有接收、保持記憶和輸出功能的電路簡稱為「觸發器」。觸發器有多種不同的功能和不同的電路形式。掌握觸發器的電路原理、功能與電路特點是本章所要學習的主要內容。目前,各種觸發器大多通過集成電路來實現。對這類集成電路的內部情況我們不必十分關心,因為我們學習數字電子技術課程的目的不是設計集成電路的內部電路。學習時,我們只需將集成電路觸發器視為一個整體,掌握它所具有的功能、特點等外部特性,使我們能合理選擇並正確使用各種集成電路觸發器。
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:52:14 經典串口的ISPRO優惠中
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 9 樓 QQ
--------------------------------------------------------------------------------
一款八路搶答器
<script language="javascript" src="/AD/200608/4.js"></script>
本文介紹一款簡單易制的八路搶答器電路,它由兩只四D鎖存器集成電路CD4042等組成。
一、工作原理
該八路搶答器電路原理如附圖所示。IC1和IC2為四D鎖存器CD4042,其D0、D1、D2、D3為輸入端,Q0、Q1、Q2、Q3為輸出端,POL為極性控制端,CP為脈沖輸入端。當把POL接低電平時,時鍾脈沖的上升沿到來時,電路鎖存;時鍾脈沖的下降沿到來時,電路傳輸數據。
K1~K8為搶答鍵,LEDl~LED8用作識別搶答鍵的顯示。搶答開始前,CP端經R9接地為低電平,IC1、IC2的輸入端D0~D3接地都置低電平,其Q0~Q3輸出端也都輸出低電平,LEDI~LED8不亮。搶答開始後,假設K1鍵最先被按下,IC1的D0端輸入高電平,IC1的輸出端Q0也輸出高電平,發光二極體LED1點亮,指示第一路按鍵搶答成功。此時,R9兩端產生壓降,使IC1和IC2的脈沖輸入端CP端都產生一個上升沿脈沖,此脈沖使IC1、IC2在K1鍵按下後的瞬間都產生了鎖存作用,即:將鎖存前IC1、IC2的輸入端D0~D3的數據(ICI的D0端為高電平,其餘都為低電平)傳輸到八個輸出端Q0~Q3並鎖存,即IC1的Q0端為高電平,其餘都為低電平。此時若再按下K2~K8,電路將不再作任何反應,從而識別出八個搶答鍵誰最先被按下。
一次搶答結束後,主持人需按一下復位鍵K9,LED1熄滅,IC1、IC2復位,即可開始第二次搶答。
該搶答器的搶答鍵個數可以很方便地擴展,只要增加一隻CD4042,並把其CP端接到R9的上端即可。
二、元器件選擇
LEDl~LED8為紅色發光二極體,K1~K9為輕觸開關。
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:55:30 超級51開發板套件,前衛實用超值
aoe
等級:管理員
文章:3501
積分:5959
門派:少林派
注冊:2001年10月10日第 10 樓 QQ
--------------------------------------------------------------------------------
此主題相關圖片如下:
21世紀什麼最寶貴???
回帖!!!!!
----------------------------------------------
aoe是Age of Empires的縮寫,俺的中文網名叫「帝國老手」,大家聯系我的話叫我「帝國」就可以了。2006-9-23 3:58:07 USB介面的ISPRO熱賣中
❹ 求51單片機設定8人計時搶答器,要電路原理圖和c語言程序
還要畫圖,分數太少了
❺ 51單片機做六人搶答器
#include<reg51.h>明斗
#define uchar unsigned char
#define uint unsigned int
void delay(uchar x);
void Js_Scan1(void);
void Js_Scan2(void);
int flag=0,i;
int code LED_Num[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void main()
{
EA=1;
ET0=1;
EX0=1;
while(1)
{
Js_Scan1();
flag=0;
}
}
void key() interrupt 0 using 0
{
int x;
x=P2;
if(x==0xfe&&flag==0)
{
i=0;
Js_Scan2();
flag=1;
}
if(x==0xfd&&flag==0)
{
i=1;
Js_Scan2();
flag=1;
}
if(x==0xfb&&flag==0)
{
i=2;
Js_Scan2();
flag=1;
}
if(x==0xf7&&flag==0)
{
i=3;
Js_Scan2();
flag=1;
}
if(x==0xef&&flag==0)
{
i=4;
Js_Scan2();
flag=1;
}
if(x==0xdf&&flag==0)
{
i=5;
Js_Scan2();
flag=1;
}
}
void Js_Scan1() //數碼管掃描函數
{
P1=0xfe;P0=LED_Num[0];delay(100);
P1=0xfd;P0=LED_Num[1];delay(100);
P1=0xfb;P0=LED_Num[2];delay(100);
P1=0xf7;P0=LED_Num[3];delay(100);
P1=0xef;P0=LED_Num[4];delay(100);
P1=0xdf;P0=LED_Num[5];delay(100);
}
void Js_Scan2() //數碼管掃描函數
{
uchar j; //定纖襲義j數據類型
for(j=0;j<5;j++) //建立循環
{
P1=0x00;P0=LED_Num[i];delay(1);
}
}
void delay(uchar x) //延時函數,防止數碼管顯示不穩定
{
uchar k;
while(x--)
for(k=0;k<激豎磨125;k++);
}
❻ AT89S51單片機八路搶答器工作原理
基於MCS-51系列單片機AT89S51的八路搶答器
基於MCS-51系列單片機AT89S51的八路搶答器
前言
隨著現代電子電路的快速發展,以及電子行業對現有電子工程技術的不斷需求,特別是對實際操作實踐的電子人才的需求越來越多,所以加強學生動手能力、重視實踐應該是電子發展需求的必然趨向。實踐動手能力的培養是一種綜合能力,這種能力當然是在一定難度的前提下完成的,通過一定數量的實踐才能逐步形成的。因此在培養實踐能力的同時,要通過實踐來不斷的發現問題和解決問題的途徑和方法,從而提高實踐能力。
近年來,隨著單片機檔次的不斷提高,功能的不斷完善,其應用日趨成熟、應用領域日趨擴大,特別是工業測控、尖端武器和日用家電等領域更是因為有了單片機而生輝增色。單片機應用技術已成為一項新的工程應用技術。本次實習設計的題目為基於單片機的搶答器。
在本次的課程設計中我主要負責了該系統的印製電路板PCB的製作
一、方案論證
方案一:系統各部分採用中小規模集成數字電路,用機械開關按鈕作為控制開關,完成搶答輸入信號的觸發。該方案的特點是中小規模集成電路應用技術成熟,性能可靠,能方便地完成選手搶答的基本功能,但是由於系統功能要求較高,所以電路連接集成電路相對較多,而且過於復雜,並且製作過程工序比較煩瑣,使用不太方便。
方案二:該系統採用MCS-51系列單片機AT89S51作為控制核心,該系統可以完成運算控制、信號識別以及顯示功能的實現。由於用了單片機,使其技術比較成熟,應用起來方便、簡單並且單片機周圍的輔助電路也比較少,便於控制和實現。整個系統具有極其靈活的可編程性,能方便地對系統進行功能的擴張和更改性。CS-51單片機特點如下:
1>可靠性好:單片機按照工業控制要求設計,抵抗工業雜訊干擾優於一般的CPU,程序指令和數據都可以燒寫在ROM許多信號通道都在同一晶元,因此可靠性高。
2>易擴充:單片機有一般電腦所必須的器件,如三態雙向匯流排,串並行的輸入及輸出引腳,可擴充為各種規模的微電腦系統
3>控制功能強:單片機指令除了輸入輸出指令,邏輯判斷指令外還有更豐富的條件分支跳躍指令。原理框圖如1-1所示;
圖1-1
方案比較及其選用依據,顯然方案二比方案一簡單的多,不但從性能上優於方案一,而且在使用上及其功能的實現上都較方案一簡潔,並且由於單片機具有優越的高集成電路性,使其工作速度更快、效率更高。另外AT89S51單片機採用12MHz的晶振,提高了信號的測量精度,並且使該系統可以通過軟體改進來擴張功能。而方案一採用了中小規模集成電路,有其復雜的電路性能,從而可能會使信號的輸入輸出產生延時及不必要的誤差。依此依據選擇方案二比較適合。
二、原理分析
1.本電路採用單片機AT89C51作為控制晶元,單片機的P0口外接八個發光二極體,每個發光二極體分別作為八位選手的信號指示燈。並在各個外接電路上並接開關按鍵,按鍵另一端接地。發光二極體採用共陽極接法,由於P0口為高電平呈輸入狀態,當有按鍵按下時,P0口呈低電平與按鍵對應的發光二極體滿足點亮條件點亮。在程序編程上採用查詢,查詢P0口P0。0到P0。7的八個埠呈低電平,即查詢是哪個選手先按鍵,然後將選手號碼的位元組數據送至串列口輸出並在數碼管上顯現出來。
2.蜂鳴器是利用三極體處於開關狀態是的導通與截止工作,在三極體導通時蜂鳴器工作,三極體截止時蜂鳴器不工作。三極體採用8550PNP型基極接於P1。2口置其低電平時三極體導通,置其高電平時三極體截止。
3.數碼管採用共陽極七段顯示,其內部發光二極體為共陽極接高電平,當對應發光二極體一端為低電平時發光二極體點亮,顯示的數字或字元由送入的位元組數據控制,位元組數據的輸出採用串形口工作模式0,8位串列位元組數據的輸出通過RXD埠送出,TXD端用於送出同步移位脈沖,作為外接器件的同步移位信號。數據的發送是在TI=0的情況下,由一寫發送緩沖器的指令開始CPU執行完該指令,串列口即將8位數據從RXD端送出,同時TXD端發出同步移位脈沖。8位數據發送完畢後由硬體置位TI=1,通過查詢TI位來確定是否發送完一組數據,TI=1表示發送緩沖器已空,當要發送下一組數據時用軟體使TI清零,然後即可發送下一組數據。
4.軟體設計分析首先在程序的開始為選手設置了一段違規程序,該程序的作用是為了防止選手在主持人沒有按下搶答鍵時,有的選手已經提前搶答了,本次搶答為無效搶答,並有報警和記錄下該位選手的選號,做違規處理,如果選手超出了在規定的提前搶答次數,則該選手將被取消以後的搶答資格。如果在主持按下搶答鍵時再搶答,該次搶答被視為有效搶答,在主持按下回答問題的鍵時選手就可以在規定的時間內回答問題了
圖1-2
<1>選手查詢程序:
ORG0000H
START:CLRA
MOVA,#0FFH
MOVP0,A
LOP:JNBP2。4,LP
JNBP0。0,SA1
JNBP0。1,SA2
JNBP0。2,SA3
JNBP0。3,SA4
JNBP0。4,SA5
JNBP0。5,SA6
JNBP0。6,SA7
JNBP0。7,SA8
SJMPLOP
SA1:AJMPSB1
SA2:AJMPSB2
SA3:AJMPSB3
SA4:AJMPSB4
SA5:AJMPSB5
SA6:AJMPSB6
SA7:AJMPSB7
SA8:AJMPSB8
LP:MOVR0,#9
LOP1:LCALLLED
LCALLDEL
JNBP0。0,SIP1
JNBP0。1,SIP2
JNBP0。2,SIP3
JNBP0。3,SIP4
JNBP0。4,SIP5
JNBP0。5,SIP6
JNBP0。6,SIP7
JNBP0。7,SIP8
DECR0
CJNER0,#0,LOP1
MOVR0,#0
LCALLLED
LCALLDEL
SJMPLOP
SIP1:AJMPDIP1
SIP2:AJMPDIP2
SIP3:AJMPDIP3
SIP4:AJMPDIP4
SIP5:AJMPDIP5
SIP6:AJMPDIP6
SIP7:AJMPDIP7
SIP8:AJMPDIP8
SB1:MOVR2,#1
LCALLLED1
LCALLDE
SJMPLP1
SB2:MOVR2,#2
LCALLLED1
LCALLDE
SJMPLP1
SB3:MOVR2,#3
LCALLLED1
LCALLDE
SJMPLP1
SB4:MOVR2,#4
LCALLLED1
LCALLDE
SJMPLP1
SB5:MOVR2,#5
LCALLLED1
LCALLDE
SJMPLP1
SB6:MOVR2,#6
LCALLLED1
LCALLDE
SJMPLP1
SB7:MOVR2,#7
LCALLLED1
LCALLDE
SJMPLP1
SB8:MOVR2,#8
LCALLLED1
LCALLDE
SJMPLP1
LP1:JNBP2。4,LOP2
SJMPLP1
DIP1:MOVR2,#1
LCALLLED1
LCALLDE
SJMPLH1
DIP2:MOVR2,#2
LCALLLED1
LCALLDE
SJMPLH1
DIP3:MOVR2,#3
LCALLLED1
LCALLDE
SJMPLH1
DIP4:MOVR2,#4
LCALLLED1
LCALLDE
SJMPLH1
DIP5:MOVR2,#5
LCALLLED1
LCALLDE
SJMPLH1
DIP6:MOVR2,#6
LCALLLED1
LCALLDE
SJMPLH1
DIP7:MOVR2,#7
LCALLLED1
LCALLDE
SJMPLH1
DIP8:MOVR2,#8
LCALLLED1
LCALLDE
SJMPLH1
LH1:JNBP2。4,LOOP
SJMPLH1
LOP2:MOVA,#11H
MOVSBUF,A
JNBTI,$
CLRTI
LCALLDEL
AJMPLOP
<2>串列輸出程序:
該部分程序的設計利用了單片機的串列模式0輸出,該輸出方式佔用IO口少。可以省去許多IO口作為功能的擴展使用。在該模式下,我們採用了輸出查詢的方式,就是要藉助發送標志TI,當程序執行到發送標志位時,查詢其標志位TI的值,只要TI的值是0程序就繼續查詢,知道查詢到TI為1時才結束,然後在進入下一組數據的發送。由於串列輸出時送進去的數都是十進制數,以致計算機不能識別,所以還要把送進去的十進制數轉化成而進制數,這樣才能輸出。因此在輸出程序前必須有拆字程序,把原來送進去的十進制數轉化成二進制數,然後在輸出並通過數碼管顯示出來。但是如果在顯示選手選號與顯示選手回答問題所用的到計同用一段串列輸出程序時就會造成程序的混亂,所以在此處設計了兩段初始值不同的顯示程序,從而可能增加了程序的煩瑣化。
LED1:MOVA,R2
MOVB,#10
DIVAB
MOVR1,A
MOVR3,B
MOVA,R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,R3
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
RET。
LED:MOVA,R0
MOVB,#10
DIVAB
MOVR1,A
MOVR3,B
MOVA,R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,R3
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
RET
DE:CLRP1。2
LCALLDEL01
SETBP1。2
LCALLDEL01
RET
TAB:DB11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
RET
<3>倒計時程序
該程序為選手回答問題時的30秒倒計時程序,其中前25秒為正常的倒計時,在後5秒倒計時時伴隨有報警聲,用於提示選手回答問題的剩餘時間。如果該選手在正常的倒計時內沒有完成問題的回答,那麼倒計時將被清零。
LOOP:MOVR0,#30
LPP:LCALLLED
LCALLDEL
JNBP2。4,LOP2
DECR0
CJNER0,#5,LPP
MOVR0,#5
LPP1:JNBP2。4,LOP2
LCALLLED
LCALLDE
DECR0
CJNER0,#0,LPP1
MOVR0,#0
LCALLLED
LCALLDEL
LJMPSTART
<4>延時程序
該系統設計了兩段延時程序,一段1秒延時,是為了30秒倒計時調用和程序中一秒延時所用;另一段為0。5秒延時,用於報警。程序的設計中報警時間為一秒,但是由於在硬體的設計時只設計了一個按鍵,這樣就會造成連續按鍵時會使所設定的報警聲不斷的響,這是設計中不允許的,所以在軟體編程時設計了一個0。5秒的延時,被報警時所調用,這樣就使報警聲能很清楚地區分出來了
DEL:MOVR6,#20DEL01:MOVR6,#10
DEL1:MOVR5,#100DEL11:MOVR5,#100
DEL2:MOVR4,#250DEL21:MOVR4,#250
DJNZR4,$DJNZR4,$
DJNZR5,DEL2DJNZR5,DEL21
DJNZR6,DEL1DJNZR6,DEL11
RETRET
<5>報警程序
該段程序主要是用於本系統中的所有報警使用,報警時間延時為1秒鍾。
DE:CLRP1。2
LCALLDEL01
SETBP1。2
LCALLDEL01
RET
三、製作過程
五、參考文獻
曾峰,鞏海洪,曾波,電子工業出版社,印刷電路板(PCB)設計與製作2005.8
梅海鳳,王艷秋,張軍,汪毓鐸,清華大學出版社單片機原理與介面技術2004.2
北京交通大學出版社
第二個文獻:基於51單片機八路搶答器設計程序及電路圖
基於51單片機八路搶答器設計程序及電路圖
說明:本人的這個設計改進後解決了前一個版本中1號搶答優先的問題,並增加了錦囊的設置,當參賽選手在回答問題時要求使用錦囊,則主持人按下搶答開始鍵,計時重新開始。
;八路搶答器電路請看下圖是用ps模擬的,已經測試成功
<單片機八路搶答器電路圖>
;============================================================
;================單片機八路搶答器程序=====================
;================51hei=======================
;================2008年5月=======================
;============================================================
OKEQU20H;搶答開始標志位
RINGEQU22H;響鈴標志位
ORG0000H
AJMPMAIN
ORG0003H
AJMPINT0SUB
ORG000BH
AJMPT0INT
ORG0013H
AJMPINT1SUB
ORG001BH
AJMPT1INT
ORG0040H
MAIN:MOVR1,#30;初設搶答時間為30s
MOVR2,#60;初設答題時間為60s
MOVTMOD,#11H;設置未定時器/模式1
MOVTH0,#0F0H
MOVTL0,#0FFH;越高發聲頻率越高,越尖
MOVTH1,#3CH
MOVTL1,#0B0H;50ms為一次溢出中斷
SETBEA
SETBET0
SETBET1
SETBEX0
SETBEX1;允許四個中斷,T0/T1/INT0/INT1
CLROK
CLRRING
SETBTR1
SETBTR0;一開始就運行定時器,以開始顯示FFF.如果想重新計數,重置TH1/TL1就可以了
;=====查詢程序=====
START:MOVR5,#0BH
MOVR4,#0BH
MOVR3,#0BH
ACALLDISPLAY;未開始搶答時候顯示FFF
JBP3.0,NEXT;ddddddd
ACALLDELAY
JBP3.0,NEXT;去抖動,如果"開始鍵"按下就向下執行,否者跳到非法搶答查詢
ACALLBARK;按鍵發聲
MOVA,R1
MOVR6,A;送R1->R6,因為R1中保存了搶答時間
SETBOK;搶答標志位,用於COUNT只程序中判斷是否查詢搶答
MOVR7,#01H;讀搶答鍵數據信號標志,這里表示只讀一次有用信號
MOVR3,#0AH;搶答只顯示計時,滅號數
AJMPCOUNT;進入倒計時程序,"查詢有效搶答的程序"在COUNT裡面
NEXT:JNBP1.0,FALSE1
JNBP1.1,FALSE2
JNBP1.2,FALSE3
JNBP1.3,FALSE4
JNBP1.4,FALSE5
JNBP1.5,FALSE6
JNBP1.6,FALSE7
JNBP1.7,FALSE8
AJMPSTART
;=====非法搶答處理程序=====
FALSE1:MOVR3,#01H
AJMPERROR
FALSE2:MOVR3,#02H
AJMPERROR
FALSE3:MOVR3,#03H
AJMPERROR
FALSE4:MOVR3,#04H
AJMPERROR
FALSE5:MOVR3,#05H
AJMPERROR
FALSE6:MOVR3,#06H
AJMPERROR
FALSE7:MOVR3,#07H
AJMPERROR
FALSE8:MOVR3,#08H
AJMPERROR
;=====INT0(搶答時間R1調整程序)=====
INT0SUB:MOVA,R1
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY;先在兩個時間LED上顯示R1
JNBP3.4,INC0;P3.4為+1s鍵,如按下跳到INCO
JNBP3.5,DEC0;P3.5為-1s鍵,如按下跳到DECO
JNBP3.1,BACK0;P3.1為確定鍵,如按下跳到BACKO
AJMPINT0SUB
INC0:MOVA,R1
CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOVR1,#00H
ACALLDELAY1
AJMPINT0SUB
ADD0:INCR1
ACALLDELAY1
AJMPINT0SUB
DEC0:MOVA,R1
JZSETR1;如果R1為0,R1就置99,
DECR1
ACALLDELAY1
AJMPINT0SUB
SETR1:MOVR1,#63H
ACALLDELAY1
AJMPINT0SUB
BACK0:RETI
;=====INT1(回答時間R2調整程序)=====
INT1SUB:MOVA,R2
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY
JNBP3.4,INC1
JNBP3.5,DEC1
JNBP3.1,BACK1
AJMPINT1SUB
INC1:MOVA,R2
CJNEA,#63H,ADD1
MOVR2,#00H
ACALLDELAY1
AJMPINT1SUB
ADD1:INCR2
ACALLDELAY1
AJMPINT1SUB
DEC1:MOVA,R2
JZSETR2
DECR2
ACALLDELAY1
AJMPINT1SUB
SETR2:MOVR2,#63H
ACALLDELAY1
AJMPINT1SUB
BACK1:RETI
;=====倒計時程序(搶答倒計時和回答倒計時都跳到改程序)=====
REPEAT:MOVA,R2;使用錦囊時重新計時
MOVR6,A
CLRRING
COUNT:MOVR0,#00H;重置定時器中斷次數
MOVTH1,#3CH
MOVTL1,#0B0H;重置定時器
RECOUNT:MOVA,R6;R6保存了倒計時的時間,之前先將搶答時間或回答時間給R6
MOVB,#0AH
DIVAB;除十分出個位/十位
MOV30H,A;十位存於(30H)
MOV31H,B;個位存於(31H)
MOVR5,30H;取十位
MOVR4,31H;取個位
MOVA,R6
SUBBA,#07H
JNCLARGER;大於5s跳到LARGER,小於等於5s會提醒
MOVA,R0
CJNEA,#0AH,FULL;1s中0.5s向下運行
CLRRING
AJMPCHECK
FULL:CJNEA,#14H,CHECK;下面是1s的情況,響並顯示號數並清R0,重新計
SETBRING
MOVA,R6
JZQUIT;計時完畢
MOVR0,#00H
DECR6;一秒標志減1
AJMPCHECK
LARGER:MOVA,R0
CJNEA,#14H,CHECK;如果1s向下運行,否者跳到查"停/顯示"
DECR6;計時一秒R6自動減1
MOVR0,#00H
CHECK:JNBP3.1,QUIT;如按下停止鍵退出
JNBOK,CHECKK;只在回答倒計時才有效
AJMPNEXTT
CHECKK:JNBP3.0,REPEAT;判斷是否使用錦囊
NEXTT:ACALLDISPLAY
JBOK,ACCOUT;如果是搶答倒計時,如是則查詢搶答,否者跳過查詢繼續倒數(這里起到鎖搶答作用)
AJMPRECOUNT
ACCOUT:
MOVA,36H
JNBACC.0,TRUE1
JNBACC.1,TRUE2
JNBACC.2,TRUE3
JNBACC.3,TRUE4
JNBACC.4,TRUE5
JNBACC.5,TRUE6
JNBACC.6,TZ1
JNBACC.7,TZ2
AJMPRECOUNT
TZ1:JMPTRUE7
TZ2:JMPTRUE8
QUIT:CLROK;如果按下了"停止鍵"執行的程序
CLRRING
AJMPSTART
;=====正常搶答處理程序=====
TRUE1:ACALLBARK
MOVA,R2
MOVR6,A;搶答時間R2送R6
MOVR3,#01H
CLROK;因為答題的計時不再查詢搶答,所以就鎖了搶答
AJMPCOUNT
TRUE2:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#02H
CLROK
AJMPCOUNT
TRUE3:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#03H
CLROK
AJMPCOUNT
TRUE4:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#04H
CLROK
AJMPCOUNT
TRUE5:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#05H
CLROK
AJMPCOUNT
TRUE6:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#06H
CLROK
AJMPCOUNT
TRUE7:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#07H
CLROK
AJMPCOUNT
TRUE8:ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#08H
CLROK
AJMPCOUNT
;=====犯規搶答程序=====
ERROR:MOVR0,#00H
MOVTH1,#3CH
MOVTL1,#0B0H
MOV34H,R3;犯規號數暫存與(34H)
HERE:MOVA,R0
CJNEA,#06H,FLASH;0.3s向下運行->滅並停響
CLRRING
MOVR3,#0AH
MOVR4,#0AH
MOVR5,#0AH;三燈全滅
AJMPCHECK1
FLASH:CJNEA,#0CH,CHECK1;下面是0.8s的情況,響並顯示號數並清R0,重新計
SETBRING
MOVR0,#00H
MOVR3,34H;取回號數
MOVR5,#0BH
MOVR4,#0BH;顯示FF和號數
AJMPCHECK1
CHECK1:JNBP3.1,QUIT1
ACALLDISPLAY
AJMPHERE
QUIT1:CLRRING
CLROK
AJMPSTART
;=====顯示程序=====
DISPLAY:MOVDPTR,#DAT1;查表顯示程序,利用P0口做段選碼口輸出/P2低三位做位選碼輸出,
MOVA,R3
MOVCA,@A+DPTR
MOVP2,#0feH
MOVP0,A
ACALLDELAY2
MOVDPTR,#DAT2
MOVA,R5
MOVCA,@A+DPTR
MOVP2,#0fdH
MOVP0,A
ACALLDELAY2
MOVA,R4
MOVCA,@A+DPTR
MOVP2,#0fbH
MOVP0,A
ACALLDELAY2
RET
DAT1:DB00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;"滅","1","2","3","4","5","6","7","8","9","滅","F"
DAT2:DB3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;第一個為零,其他與上相同,因為十位如果為零顯示熄滅
;====加減時間延時(起到不會按下就加N個數)======
DELAY1:MOV35H,#08H
LOOP0:ACALLDISPLAY
DJNZ35H,LOOP0
RET
;=====延時4236個機器周期(去抖動用到)=====
DELAY:MOV32H,#12H
LOOP:MOV33H,#0AFH
LOOP1:DJNZ33H,LOOP1
DJNZ32H,LOOP
RET
;=====延時4236個機器周期(顯示用到)=====
DELAY2:MOV32H,#43H
LOOP3:MOV33H,#1EH
MOVA,R7;每隔60~70個機器周期讀一次P1口,全為1時為無效數據,繼續讀,有一個不為1時,轉到正常搶答處理
JNZAAAA1;沒讀到有效數據時繼續轉到AAAA1
LOOP2:DJNZ33H,LOOP2
DJNZ32H,LOOP3
RET
;=====讀搶答按鍵數據口程序=====
;由於在讀搶答數據口的時候,單片機首先進入倒計時程序,再調用顯示程序,最後才檢測按鍵口
;然而在檢測按鍵口時動態掃描要調用三次(4ms)延時程序.這樣就會導致讀數據口出現滯後,造成1號優先最高.8號最低.
;故採用在延時子程序中加了讀數據口程序.保證了靈敏度和可靠性
AAAA1:MOVA,P1
CJNEA,#0FFH,AA1;當不全為1時的數據為有效數據
AA0:MOV36H,A;將有效數據送到36H暫存
AJMPLOOP2
AA1:DECR7
AJMPAA0
;=====發聲程序=====
BARK:SETBRING
ACALLDELAY1
ACALLDELAY1
CLRRING;按鍵發聲
RET
;=====TO溢出中斷(響鈴程序)=====
T0INT:MOVTH0,#0ECH
MOVTL0,#0FFH
JNBRING,OUT;
CPLP3.6;RING標志位為1時候P3.6口不短取反使喇叭發出一定頻率的聲音
OUT:RETI
;=====T1溢出中斷(計時程序)=====
T1INT:MOVTH1,#3CH
MOVTL1,#0B0H
INCR0
RETI
僅供參考。
❼ 求四路搶答器電路原理圖
原理圖:
工作原理
搶答器由74LS148、74LS279、74LS48組成,LED顯示器 開始時,當支持人按鈕還未按是,CLR為0,所以輸出Q1~Q4為0;
放光二極體全為滅的,當主持人按鈕按下時CLR為1,可以輸入,誰先搶答,相應的誰的燈亮,利用74LS279和74LS148輸出的是cp等於0,鎖存其他的,不能使其他的輸出。
利用51單片機建立四路搶答器
單片機,當然不只是51,51單片機是一種稍通用型的單片機,通過I/O口的定義,可以實現多種控制功能。
搶答器,原理:如果為四路,當其中任一路控下後,其他幾路即失效,結果為第一次按下的,可以用數碼管或是LED燈來顯示,當然這里只是講原理與編程,具體可以根據搶答器路數及顯示方式更改程序即可。
源程序如下:
<div class="blockcode"><blockquote>/*用的是AT89S52開發板,獨立按鍵介面如下,就用這四路。先按下的用LED燈來顯示,對應第一個到第四個LED燈,其他再按無效,如果想再次實現,可手動復位單片機*/
#include <reg52.h>
sbit key1=P3^0; //定義按鍵,根據需要連接線路,如獨立按鍵(4路)
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
/*void delay(unsigned int cnt) //如果有抖動或是干擾,可以用個小延時去抖
{
while(--cnt);
}*/
void main()
{
bit Flag;
while(!Flag)
{
if(!key1)
{
P1=0xFE;
Flag=1;
}
/*LED燈來顯示按下的鍵,第一個燈,我這里是8位LED燈,即:0111 1111,反過來讀數為:1111 1110 即:0xFE *,P1口對應LED燈,給P1賦值*/
else if(!key2)
{
P1=0xFD;
Flag=1;
}
//第二個燈亮
else if(!key3)
{P1=0xFB;Flag=1;}
//第三個燈亮
else if(!key4)
{
P1=0xF7;
Flag=1;
}
//第四個燈亮,意味著第四路首先按下
}
while(Flag); //可以再加個I/O,控制Flag,這樣初始化,繼續搶答,還可以設計按下時的聲音
}
❽ 求四路智能競賽搶答器的設計電路
聲光顯示鉛遲智力悔激梁競賽搶答器:
四路智力競賽搶答器
http://www.51hei.com/mcu/568.html
智力競賽搶答器系統介紹
http://www.jzd21.com/Cpzs/JZD010/JZD010_Xtjs/JZD010_Xtjs.htm
聲光顯示智力競賽搶答器資料碧運下載網頁:
http://www.elecfans.com/soft/courseware/2008/2008120112584.html
供你參考
❾ 哪位大神有八路搶答器的keil做的c51單片機的源程序,和電路圖麻煩分享下。
#include<reg51.h>
#defineucharunsignedchar
uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbitrstkey=P2^2;
sbitspeaker=P2^0;
voiddelay()//延時約400毫秒
{
uchari,j;
for(i=0;i<200;i++)
for(j=0;j<250;j++);
}
main()
{
uchari,key;
P2=0xff;
while(1)
{
i=0;
P1=table[i];
while(1)
{
key=P3;
if(key!=0)break;
}
switch(key)
{
case0x01:i=1;break;
case0x02:i=2;break;
case0x04:i=3;break;
case0x08:i=4;break;
case0x10:i=5;break;
case0x20:i=6;break;
case0x40:i=7;break;
case0x80:i=8;break;
default:break;
}
P1=table[i];//顯示按下搶答器的號
P0=key;//顯示按下鍵號的LED
while(1)
{
if(rstkey==0)break;//主持人按下復位鍵則重新開始
speaker=~speaker;//否則蜂鳴器報警
delay();
}
}
}
❿ 求51單片機的8路搶答器,在普中開發板上實現
單片機源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define WHO P0
sbit player1=P1^0;
sbit player2=P1^1;
sbit player3=P1^2;
sbit player4=P1^3;
sbit Ensure=P3^7;
sbit beep=P1^6;
sbit LSA=P3^2;
sbit LSB=P3^3;
sbit LSC=P3^4;
uchar state=0;
uchar ssec=0;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar OUT[]={0x71,0x77,0x38,0x38};
void delay(uint time)
{
uint x,y ;
for(x=time;x>0;x--)
for(y=130;y>0;y--);
}
void Delay2(uint i)
{
while(i--);
}
void Show(uchar content[])
{
uchar i;
for(i=0;i<4;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
}
P2=content[i];//發送段碼
Delay2(100); //間隔一段時間掃描
P2=0x00;//消隱
}
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
Ensure=1;
while(1)
{
if(player1==0) //玩家1進入搶答狀態
{
delay(10); //延時,按鍵消抖
if(player1==0) //再次判斷是否進入搶答狀態
{
if(state==0) //前方無人搶答狀態
{
InitTimer0();
state=1; //將搶答狀態置為1,防止其他玩家搶答
while(!player1) //搶答成功,蜂鳴器發聲
{
beep=~beep;
delay(1);
}
WHO=table[1]; //數碼管顯示搶答成功的玩家編號
}
}
}
if(player2==0) //以下結構類似於玩家1
{
delay(10);
if(player2==0)
{
if(state==0)
{
InitTimer0();
state=1;
while(!player2)
{
beep=~beep;
delay(1);
}
WHO=table[2];
}
}
}
if(player3==0)
{
delay(10);
if(player3==0)
{
if(state==0)
{
InitTimer0();
state=1;
while(!player3)
{
beep=~beep;
delay(1);
}
WHO=table[3];
}
}
}
if(player4==0)
{
delay(10);
if(player4==0)
{
if(state==0)
{
InitTimer0();
state=1;
while(!player4)
{
beep=~beep;
delay(1);
}
WHO=table[4];
}
}
}
}
}
void Timer0() interrupt 1
{
TH0=(65536-45872)/255; //給定時器賦初值,定時50ms
TL0=(65536-45872)%255;
ssec++;
if(Ensure)
{
if(ssec>=100) //5s
{
EA=0;
while(1)
Show(OUT);
}
}
else
{
delay(10);
if(Ensure==0)
{
while(!Ensure);
Ensure=0;
if(ssec>=100)
{
EA=0;
}
}
}
}