基于MCS51單片機(jī)的四路搶答器課件_第1頁
基于MCS51單片機(jī)的四路搶答器課件_第2頁
基于MCS51單片機(jī)的四路搶答器課件_第3頁
基于MCS51單片機(jī)的四路搶答器課件_第4頁
基于MCS51單片機(jī)的四路搶答器課件_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、物理系08 超Protel課程設(shè)計(jì)基于MCS-51單片機(jī)的四路搶答器目錄:硬件設(shè)計(jì)1各模塊功能234程序設(shè)計(jì)5程序流程圖電路原理圖和PCB制版6總結(jié)與展望硬件設(shè)計(jì)硬件電路應(yīng)能完成以下功能:參加競(jìng)賽者對(duì)主持人提出的問題要在最短的時(shí)間內(nèi)作出判斷,并按下?lián)尨鸢存I回答問題。當(dāng)?shù)谝粋€(gè)人按下按鍵后,則在顯示器上顯示此競(jìng)賽者的號(hào)碼并進(jìn)行聲音提示,同時(shí)電路將其他搶答按鍵封鎖,使其不起作用。若有人在可以搶答之前按鍵,應(yīng)該有違規(guī)提示。電路應(yīng)該具有倒計(jì)時(shí)功能,倒計(jì)時(shí)時(shí)間可以設(shè)置并顯示,在規(guī)定時(shí)間內(nèi)沒有人搶答則本題作廢?;卮鹜昊虺瑫r(shí)后,由主持人將所有按鍵恢復(fù),重新開始下一輪。完成上述功能的電路包括時(shí)間設(shè)定開關(guān)、聲光顯

2、示、按鍵控制以及按鍵鎖存等部分各模塊功能 單片機(jī)部分時(shí)間設(shè)定模塊按鍵模塊數(shù)碼管顯示模塊蜂鳴器模塊單片機(jī)部分 通過讀取P3.7P3.3的狀態(tài)決定倒計(jì)時(shí)時(shí)間;通過讀取P1.3P1.0的狀態(tài)讀取按鍵情況;通過P2.4P2.2控制顯示模塊以顯示按鍵者的號(hào)碼和倒計(jì)時(shí)所剩時(shí)間;通過P0.1控制蜂鳴器 時(shí)間設(shè)定模塊 以撥碼開關(guān)U3作為倒計(jì)時(shí)時(shí)間的選擇信號(hào)。若P3.7通過U3接地,倒計(jì)時(shí)時(shí)間為10s;若P3.6通過U3接地,倒計(jì)時(shí)時(shí)間為8s,若P3.5通過U3接地,倒計(jì)時(shí)時(shí)間為6s,若P3.4通過U3接地,倒計(jì)時(shí)時(shí)間為4s。判斷時(shí)P3.7優(yōu)先級(jí)最高,P3.4優(yōu)先級(jí)最低。按鍵模塊 KEY1KEY4的信息可以直接

3、傳輸?shù)絇1.3P1.0。單片機(jī)一旦檢測(cè)到有按鍵按下,立即將P1.4置為低電平,將按鍵信息鎖存,以免后來的按鍵對(duì)其產(chǎn)生影響。KEY1KEY4為搶答按鍵,KEY5為主持人控制按鍵 數(shù)碼管顯示模塊 數(shù)碼管顯示模塊由一片MAX7219和3個(gè)數(shù)碼管組成。其中U8用來顯示按鍵者的編號(hào),U6、U7在倒計(jì)時(shí)時(shí)顯示還有多長時(shí)間,如果有人犯規(guī)搶答,U6U7顯示“FF”。 蜂鳴器模塊 蜂鳴器在主持人發(fā)出可以搶答信號(hào)、有人按下?lián)尨鸢存I和倒計(jì)時(shí)時(shí)間到等3種情況下發(fā)出蜂鳴聲。 程序流程圖如下電路原理圖及PCB制版圖 四路智力搶答器電路原理圖四路智力搶答器PCB模塊程序設(shè)計(jì) 搶答器工作過程如下 首先主持人選定倒計(jì)時(shí)時(shí)間,單

4、片機(jī)掃描U3以獲取此信息。如果沒有人為設(shè)置,默認(rèn)為10s。 在按下?lián)尨鸢存I之前,3個(gè)數(shù)碼管全部顯示“0”。 按下?lián)尨鸢存I之后,蜂鳴器響一聲,單片機(jī)開始倒計(jì)時(shí),數(shù)碼管U6和U7顯示倒計(jì)時(shí)時(shí)間,數(shù)碼管U8顯示“0”。 如果有競(jìng)賽者率先在規(guī)定時(shí)間內(nèi)按鍵,則蜂鳴器響一聲,數(shù)碼管U8顯示該競(jìng)賽者的編號(hào),U6和U7停止更新。 如果在主持人未按下?lián)尨鸢存I的時(shí)候有選手搶答,則此時(shí)蜂鳴器響一聲,U8顯示犯規(guī)者的編號(hào),U6和U7顯示“FF”以指示有人犯規(guī)。 如果在規(guī)定時(shí)間內(nèi)無人按鍵,則U8顯示“0”,U6和U7顯示“EE”以指示無人按鍵。 無論是在規(guī)定時(shí)間內(nèi)有人按鍵、在規(guī)定時(shí)間內(nèi)無人按鍵或者是有人犯規(guī),都需要主持

5、人再按一下?lián)尨鸢存I,之后單片機(jī)根據(jù)U3狀態(tài)決定倒計(jì)時(shí)時(shí)間,3個(gè)數(shù)碼管全部顯示“0”,恢復(fù)到初始狀態(tài),準(zhǔn)備下一輪搶答。8051單片機(jī)控制的四路搶答器程序#include typedef unsigned char uchar;sbit LE=P14;sbit KEY5=P37;sbit DIN=P24; /定義P2.5控制MAX7219的串行數(shù)據(jù)輸入端sbit LOAD=P23; /定義P2.4控制MAX7219的載入使能端sbit CLK=P22; /定義P2.3控制MAX7219的時(shí)鐘信號(hào)sbit BUZ=P01;#define TIMER_HBYTE -50000/256 /定時(shí)50ms#

6、define TIMER_LBYTE -50000%256uchar intr_counter; /設(shè)定的時(shí)間用需要產(chǎn)生的中斷次數(shù)表示uchar bdata byte; /在bdata區(qū)定義一個(gè)變量,便于位操作sbit byte_7=byte7; bit foul_flg; /是否有人犯規(guī)標(biāo)志bit time_over_flg; /是否倒計(jì)時(shí)超時(shí)標(biāo)志bit key_flg; /是否有人在規(guī)定時(shí)間內(nèi)按鍵標(biāo)志 void max7219_reset(void); /初始化MAX7219void write_reg(uchar,uchar); /向控制寄存器寫數(shù)據(jù)void write_digit(uc

7、har,uchar); /向字型寄存器寫數(shù)據(jù)void send_data(uchar); /底層的硬件驅(qū)動(dòng)uchar set_time(void); /函數(shù)功能:設(shè)置倒計(jì)時(shí)時(shí)間bit control_key(void); /函數(shù)功能:檢測(cè)主持人是否按鍵uchar get_key_num(void); /函數(shù)功能:檢測(cè)哪個(gè)參賽者按鍵void display_time(void); /函數(shù)功能:顯示倒計(jì)時(shí)剩余時(shí)間void foul_handle(uchar); /函數(shù)功能:犯規(guī)處理void key_handle(uchar); /函數(shù)功能:按鍵處理void time_over_handle(voi

8、d); /函數(shù)功能:超時(shí)處理void init_t0(void); /函數(shù)功能:初始化T0定時(shí)器void delay_20ms(void); /函數(shù)功能:延時(shí)20ms,按鍵去抖動(dòng)void buz_on(void) /函數(shù)功能:蜂鳴器響500msvoid buz_on(void) /函數(shù)功能:蜂鳴器響500msvoid main(void) uchar key_number; max7219_reset(); /初始化MAX7219 while(1) foul_flg=0; /設(shè)置初始環(huán)境 time_over_flg=0; TR0=0; /禁止T0運(yùn)行 write_digit(DIGIT0,LE

9、D_code0 x0);/上電后3個(gè)數(shù)碼管全部顯示0 write_digit(DIGIT1,LED_code0 x0); write_digit(DIGIT2,LED_code0 x0); while(control_key()=1)&(foul_flg=0) /如果主持人沒有按鍵 /如果主持人沒有按鍵 key_number=getkey_num(); /檢查是否有人犯規(guī) if(key_number=0) /如果沒有,進(jìn)行下一次循環(huán) continue; else /如果有人犯規(guī) foul_handle(); /犯規(guī)處理 foul_flg=1; /設(shè)置犯規(guī)標(biāo)志 if(foul_flg=1) /如

10、果有人犯規(guī) while(control_key()=1); /等待主持人按鍵以進(jìn)入下一輪 continue; /主持人按鍵后進(jìn)入下一輪 else /如果沒有人犯規(guī),必定是主持人允許答題 intr_counter=set_time(); /讀取倒計(jì)時(shí)時(shí)間 init_t0(); /定時(shí)器T0開始計(jì)時(shí) buz_on(); /蜂鳴器響500ms while(time_over_flg=0&key_flg=0) key_number=getkey_num(); /在規(guī)定時(shí)間內(nèi)檢查是否有按鍵 if(key_number!=0) /如果有 key_handle(key_number);/按鍵處理 key_f

11、lg=1; /設(shè)置有人按鍵答題標(biāo)志 TR0=0; /停止T0運(yùn)行 else /否則循環(huán)檢測(cè) display_time(); /并顯示剩余時(shí)間 continue; if(key_flg=1) /如果有人在規(guī)定時(shí)間內(nèi)答題 while(control_key=1); /等待主持人按鍵以進(jìn)入下一輪 continue; /主持人按鍵后進(jìn)入下一輪 else /倒計(jì)時(shí)時(shí)間到仍無人按鍵 time_over_handle(); /超時(shí)處理 while(control_key=1); /等待主持人按鍵以進(jìn)入下一輪 continue; /主持人按鍵后進(jìn)入下一輪 bit control_key(void) /檢測(cè)主持

12、人是否按鍵 if(KEY5=1) /如果KEY5為高,說明沒有按鍵 return 1; /返回1,表示沒有按鍵動(dòng)作 else /如果KEY5為低,說明可能有按鍵動(dòng)作 delay_20ms(); /延時(shí)20ms,去抖動(dòng) if(KEY5=1) /如果20ms后KEY5變?yōu)楦唠娖?,是干擾 return 1; /返回1 else /如果20ms后仍為低電平,確認(rèn)有按鍵動(dòng)作 return 0; /返回0uchar set_time(void) /根據(jù)設(shè)置決定倒計(jì)時(shí)時(shí)間 uchar intr_counter; if(P36=0) intr_counter=200; /10s else if(P35=0)

13、intr_counter=160; /8s else if (P34=0) intr_counter=120; /6s else if (P33=0) intr_counter=80; /4s else intr_counter=200; /如果沒有設(shè)置,默認(rèn)為10s return intr_counter;uchar get_key_num() /檢測(cè)哪個(gè)參賽者按鍵 uchar key_state=0; key_state=P1; key_state&=0 x0f; /讀取P1端口的低4位 if(key_state=0 x0f) /若均為高電平,說明無人按鍵 return 0; /返回1 e

14、lse key_state=0 xff; if(key_state&0 x01) return 1; /如果KEY1被按下,返回1 else if(key_state&0 x02) return 2; /如果KEY2被按下,返回2 else if(key_state&0 x04) return 3; /如果KEY3被按下,返回3 else return 4; /如果KEY4被按下,返回4 void foul_handle(uchar key_number) /犯規(guī)處理 write_digit(DIGIT0,key_number); /顯示犯規(guī)者號(hào)碼 write_digit(DIGIT1,0 x

15、0f); /顯示“FF” write_digit(DIGIT2,0 x0f); buz_on(); /蜂鳴器響void time_over_handle(void) /超時(shí)處理 write_digit(DIGIT0,0 x0); /顯示“0” write_digit(DIGIT1,0 x0e); /顯示“EE” write_digit(DIGIT2,0 x0e); buz_on(); /蜂鳴器響void key_handle(uchar key_number) /按鍵處理 write_digit(DIGIT0,key_number); /顯示按鍵者號(hào)碼 buz_on();void displa

16、y_time(void) /顯示倒計(jì)時(shí)剩余時(shí)間 uchar number; write_digit(DIGIT0,LED_code0); number=int_counter/20; /秒數(shù) write_digit(DIGIT1,number/10); /秒數(shù)的十位數(shù)字 write_digit(DIGIT2,number%10); /秒數(shù)的個(gè)位數(shù)字 void buz_on(void) uchar i; BUZ=0; /開蜂鳴器 for(i=1;i=25;i+) /延時(shí)500ms delay_20ms; BUZ=1; /關(guān)蜂鳴器void init_t0(void) TMOD=0 x01; /T0

17、選擇工作方式1,16位定時(shí)器 TH0=TIMER_HBYTE; /定時(shí)時(shí)間為50ms TL0=TIMER_LBYTE; EA=1; /使能CPU中斷 ET0=1; /使能T0溢出中斷 TR0=1; /T0運(yùn)行 void isr_t0(void) interrupt 1 /T0中斷服務(wù)函數(shù) TH0=TIMER_HBYTE; /定時(shí)時(shí)間為50ms TL0=TIMER_LBYTE; intr_counter-; /中斷次數(shù) if(intr_counter=0) /倒計(jì)時(shí)時(shí)間到 time_over_flg=1; /設(shè)置超時(shí)標(biāo)志 TR0=0;/禁止T0運(yùn)行 void delay_20ms(void) /延時(shí)20msvoid max7219_reset(void) /初始化MAX7219void write_reg(uchar reg,uchar sdata) /寫入命令void write_digit(uchar digit,uchar number) /顯示數(shù)字void send_data(uchar byte) /MAX7219的驅(qū)動(dòng)程序總結(jié)與展望總結(jié): 通過這次的課程設(shè)計(jì),使我的動(dòng)手能力和經(jīng)驗(yàn)有了一定程度的提高,在51單片機(jī)技術(shù)和protel的理論

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論