一、設(shè)計(jì)任務(wù)
二、性能指標(biāo)要求
2.有一個(gè)主持人控制開關(guān)和6路搶答按扭,當(dāng)主持人允許搶答時(shí)才能進(jìn)行搶答操作,并用一個(gè)數(shù)碼管顯示搶答選手的號(hào)碼,同時(shí)其他選手不能再搶答。
3.當(dāng)主持人允許搶答后倒計(jì)時(shí)5秒時(shí)間,在這5秒內(nèi)搶答有效,過后就不能進(jìn)行搶答了。
4.電路上要加個(gè)蜂鳴器的電路,當(dāng)有選手搶答時(shí)蜂鳴器響一下。
5.當(dāng)有選手搶答后,進(jìn)行倒計(jì)時(shí)20秒作為選手回答問題時(shí)間,用兩個(gè)數(shù)碼管顯示,倒計(jì)時(shí)時(shí)間到時(shí)有聲光提示。
6.畫電路板時(shí)要增加下載接口,方便調(diào)試程序。
7.?dāng)U展功能(選做)
用按鍵可設(shè)置倒計(jì)時(shí)的時(shí)間,范圍在5秒到30秒之間。
三、設(shè)計(jì)思路及設(shè)計(jì)框圖
1.設(shè)計(jì)思路
首先先設(shè)置支持人開始搶答按鍵,在芯片的P1^6腳處接入按鍵,按鍵按下,蜂鳴器響來實(shí)現(xiàn)這個(gè)搶答開始信號(hào)。在主持人開始允許搶答時(shí),六位選手連接的單片機(jī)從P1^0—P1^5口的任意一位選手進(jìn)行搶答,搶答時(shí)間為5s,搶答后設(shè)定回答問題時(shí)間為5s—30s,倒計(jì)時(shí)5s時(shí)LED燈亮,并且蜂鳴器響。所搶答的選手號(hào)碼、搶答時(shí)間與回答時(shí)間均將字節(jié)送入數(shù)碼管中顯示。用兩個(gè)按鍵來掌控回答問題的時(shí)間,時(shí)間加計(jì)數(shù)與時(shí)間減計(jì)數(shù)。當(dāng)需要重新進(jìn)行搶答時(shí)則按下與芯片的RST段(即9腳)連接的按鍵則可以實(shí)現(xiàn)。所搶答的選手號(hào)碼、搶答時(shí)間與回答時(shí)間均將字節(jié)送入數(shù)碼管中顯示。P0口接的是一個(gè)四位一體共陰數(shù)碼管,P2.4、P2.2、P2.1、P2.0作為數(shù)碼管的位選。由于單片機(jī)自身IO口的驅(qū)動(dòng)能力不能讓蜂鳴器發(fā)出聲音,因此要通過三極管NPN來放大電流,這樣才能使蜂鳴器發(fā)出聲音。
總體設(shè)計(jì)框圖:
電路原理圖:
部分程序:
#include <reg52.h> sbit BEEP = P2^0; sbit LED1 = P2^3; sbit LED2 = P2^2; sbit LED3 = P2^1;
#define duanPore P0 //數(shù)碼管段控制端口,高電平有效 sbit DIG1 = P2^4; sbit DIG2 = P2^5; sbit DIG3 = P2^6; sbit DIG4 = P2^7;
sbit KEY1 = P1^0; sbit KEY2 = P1^1; sbit KEY3 = P1^2; sbit KEY4 = P1^3; sbit KEY5 = P1^4; sbit KEY6 = P1^5; sbit KEY7 = P3^2; sbit KEY8 = P3^3;
unsigned char code tab_duan[19] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71, 0x40,0x00,0x48 }; unsigned char dat_buf[4] = {17, 17, 0, 5}; int time = 5, time1 = 5, time2 = 20; unsigned char i = 0; unsigned int count = 0; bit flag_lock = 1;
void DelayMs(unsigned int ms); //延時(shí)函數(shù) void dig_scan(unsigned char *dat); //數(shù)碼管顯示掃描 unsigned char KeyScan(void); //獨(dú)立按鍵掃描 void InitTimer0(void); //定時(shí)器0初始化 void alarm(void); //報(bào)警函數(shù) void AnswerTask(void); //搶答任務(wù) void SetTime(void); //設(shè)置倒計(jì)時(shí)時(shí)間 void main(void) { BEEP = 0; LED1 = 1; InitTimer0(); time = time1; while(1) { if(KeyScan() == 7) { alarm(); AnswerTask(); } if(KeyScan() == 8) { alarm(); SetTime(); }
dat_buf[0] = 17; dat_buf[1] = 17; dat_buf[2] = time / 10; dat_buf[3] = time % 10; dig_scan(dat_buf); } }
資料內(nèi)容:
需要全部資料可從我的里資源下載。
也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。
閱讀全文