① 求proteus單片機c語言程序代碼,四路搶答器
能把問題描述清楚看來程序實現對你來說不成問題,我用偽代碼給你寫出來你自己補充完整即可。
void main()
{
unsigned char key,cont;
bit flag = 0;
初始化IO口;\\關閉紅燈點亮綠燈,數碼管顯示0
while(1)
{
key = P1&0xF;
if(key!=0xF)
{
/*按下的按鍵相應綠燈關閉*/
LED_G1 = (bit)(key&0x1);
LED_G2 = (bit)(key&0x2);
LED_G3 = (bit)(key&0x4);
LED_G4 = (bit)(key&0x8);
/*按下的按鍵相應紅色LED閃爍*/
for(cont=0;cont<5;cont++)
{
LED_R1 = (~LED_G1)|flag;
LED_R2 = (~LED_G2)|flag;
LED_R3= (~LED_G3)|flag;
LED_R4 = (~LED_G4)|flag;
Delay();//延時
flag = ~flag;
}
關閉所有紅色LED並開啟所有綠色LED;
}
}
}
注意:代碼是允許有同時按下的情況,當然也可以改為不允許同時按下的情況發生,即如果發生同時按下則隨便選擇一個按鍵,這樣覺得有點不公平。
② 51單片機4路搶答器
用編譯器把程序編譯成HEX檔,然後在proteus內把hex檔導入單片機就可以模擬了
③ 基於51單片機的搶答器如果有兩人同時按下怎麼解決呢 比如有四組 當其中一組按下搶答鍵時 屏蔽其他組
搶答按鍵無需去抖
理論上同時觸發幾乎不可能
實際應用中同時觸發的概率取決於系統反應速度
速度越快同時觸發的概率越低
用MCU中斷截獲數據的話,大概能識別微秒級別的時間差
用CMOS鎖存器可識別納秒級別的時間差
當有按鍵被按下的時候,以最快的速度保存各埠狀態即可,無需什麼屏蔽不屏蔽
④ 求四路搶答器電路原理圖
原理圖:
工作原理
搶答器由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,這樣初始化,繼續搶答,還可以設計按下時的聲音
}
⑤ 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
⑥ 用51單片機做搶答器需要買什麼東西
揚聲器,單片機最小系統,三級管,以及搶答的按鈕,電線若干
⑦ 51單片機 四路搶答器
你好!這搶答器是模擬還是做實物?需要倒計時嗎?
⑧ 求大神做一個51單片機的四路搶答器,要匯編程序,電路圖,和分析過程,還有4天答辯,
有一個八路的發給你吧,供參考
ORG 0000H
JMP BEGIN
ORG0030H
TABLE: ;共陰極數碼管顯示代碼表
DB 3FH,06H,5BH,4FH,66H;12345
DB 6DH,7DH,07H,7FH ;6789
DELAY: MOV R5,#20
LOOP4: MOV R6,#50H ;延時20X20ms
LOOP5: MOV R7,#100
DJNZ R7,$
DJNZ R6,LOOP5
DJNZ R5,LOOP4
RET
;---------------------------------------
BEGIN: MOV P2,#0FFH ;P2口置高電平,准備接收信號
MOV R4,#0
MOV A,R4 ;R4位標志值送A寄存器
AGAIN: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
LOOP1: MOV A,P3 ;接收p3口的搶答信號
CPL A
JZ LOOP1
LOOP2: RRC A ;有人搶答信號則逐次移動判斷哪一位搶答
INC R4
JNC LOOP2
;********************
MOV A,R4
MOVC A,@A+DPTR ;找到相應位顯示代碼
MOV P1,A
LEDDIS:
MOVA,#0FFH
CLRC
LEDDIS1:
RLCA
DJNZR4,LEDDIS1
MOVP0,A
LOOP3: JNBP2.2,BEGIN;若主持人按下復位信號鍵,則轉向主程序
CPL P2.0 ;若沒按復位信號鍵,則通過p2.2口給出高低信號驅動蜂鳴器
LCALLDELAY ;調用延時子程序
SJMP LOOP3 ;p2.2口反復間隔0.4s變化,驅動蜂鳴器
END
⑨ 51單片機做搶答器,要求如下,需要什麼器件
LEDH EQU 30H
LEDL EQU 31H
ORG 0000H
AJMP MAIN
ORG 0003H
SJMP INT_2
ORG 0013H
SJMP INT_1
MAIN:
MOV SP,#60H
MOV A,#0EEH
MOV P2,A
MOV LEDH,#0E0H
MOV LEDL,#0EH
SETB IT0
SETB IT1
SETB EA
SETB EX1
SETB EX0
SJMP $
INT_1:
MOV A,LEDL
SETB C
RLC A
` ANL A,#0FH
ORL A,LEDH
MOV P2,A
JNB ACC.3,INT_1E
MOV LEDL,#0EH
INT_1E:
RETI
INT_2:
MOV A,LEDH
SETB ACC.3
RL A
ANL A,#0F0H
ORL A,LEDL
MOV P2,A
JNB P2.7,INT_2E
MOV LEDH,#0E0H
INT_2E:
RETI
END
⑩ 求MCS-51單片機四路搶答器的c語言程序設計
#include<reg51.h>
#defineuint unsigned int
#defineuchar unsigned char
sbitspeaker = P2^7;
sbit key0 =P1^0;
sbit key1 =P1^1;
sbit key2 =P1^2;
sbit key3 =P1^3;
sbit key4 =P1^4;
sbit key5 =P1^5;
sbit key6 =P1^6;
sbit key7 =P1^7;
ucharled[8]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};
voiddelay_1ms(uint t)
{
uchar m,n;
for(m=t;m>0;m--)
for(n=330;n>0;n--);
}
bitiskeyinput() //判斷是否有按鍵閉合
{
if((P1 & 0xff) ==0xff ) //屏蔽高4位(列線),只檢測低4位(行線)
return 0; //沒有鍵閉合,返回0
else
return 1; //有鍵閉合,返回1
}
ucharkey_identify() //識別鍵號
{
uchar key;
if( key0==0 )key=0;
if(key1==0 )key=1;
if( key2==0 )key=2;
if( key3==0 )key=3;
if( key4==0 )key=4;
if( key5==0 )key=5;
if( key6==0 )key=6;
if( key7==0 )key=7;
return key; //輸出鍵號
}
voidkeyprocess(uchar keynum)
{
uint i;
P0 = led[keynum];
i=500;
while(i--)
{
speaker = 0;
delay_1ms(10);
speaker = 1;
}
}
void main()
{
uchar keynum;
P0 = 0xFF;
while(1)
{
while (!iskeyinput() ); //如果沒有鍵,則等待
delay_1ms(10); //去除鍵抖動
if(iskeyinput() ) //當前有按鍵,需要識別按鍵並且等待鍵盤松開
{
keynum= key_identify(); //識別鍵號
keyprocess(keynum);
while(1); //等待復位
}
}
}