搶答器
在知識(shí)競(jìng)賽、文體娛樂(lè)活動(dòng)(搶答賽活動(dòng))中,能準(zhǔn)確、公正、直觀地判斷出搶答者的座位號(hào)。更好的促進(jìn)各個(gè)團(tuán)體的競(jìng)爭(zhēng)意識(shí),讓選手門(mén)體驗(yàn)到戰(zhàn)場(chǎng)般的壓力感
傳統(tǒng)搶答器只是大概判斷出搶答成功或犯規(guī)選手臺(tái)號(hào),無(wú)法顯示出每個(gè)選手的搶答時(shí)間。而今搶答器可以通過(guò)數(shù)據(jù)來(lái)說(shuō)明裁決結(jié)果的準(zhǔn)確性、公平性。使比賽大大增加了娛樂(lè)性的同時(shí),也更加公平、公正。
新增無(wú)線(xiàn)搶答器更是搶答器史上的一大改革
軟件功能更強(qiáng)大:
搭配全新升級(jí)版軟件,采用嵌入式PPT設(shè)計(jì),可支持三種格式題庫(kù)導(dǎo)入(文本文檔、WORD、Excel),15O道題導(dǎo)入只需20秒,導(dǎo)入的題目直接以PPT方式展現(xiàn),可直接在展現(xiàn)頁(yè)面進(jìn)行題目再修改。此款軟件還提供多種背景模板,供客戶(hù)選擇使用,點(diǎn)擊任何一款即可自動(dòng)導(dǎo)入到題目中。非常簡(jiǎn)單便捷。
搶答精度更高:
國(guó)內(nèi)首臺(tái)可以將所有選手搶答時(shí)間同步顯示出來(lái)并自動(dòng)排序的搶答器,且精度高達(dá)0.00001秒。開(kāi)創(chuàng)搶答領(lǐng)域新時(shí)代,讓比賽沒(méi)有爭(zhēng)議且更具娛樂(lè)性。
主機(jī)接線(xiàn)更少:一條
主線(xiàn)串連所有分組計(jì)分顯示屏;最大程度減少了布線(xiàn)的繁瑣。
搶答模式更齊全:根據(jù)
公司多年的大賽經(jīng)驗(yàn),將各類(lèi)大型賽事所用的搶答模式歸結(jié)為四種:即淘汰模式、快速式、直接式、無(wú)限時(shí)式,全部納入此款軟件,所以功能相當(dāng)齊全。
搶答節(jié)奏可調(diào):
目前國(guó)內(nèi)搶答器搶答開(kāi)始令的語(yǔ)音都是固定的,客戶(hù)無(wú)法調(diào)節(jié),新款搶答器增加了可調(diào)節(jié)功能,客戶(hù)可以根據(jù)自己的需要來(lái)自行調(diào)節(jié)比賽節(jié)奏,同時(shí)軟件還提供男生、女生兩種語(yǔ)音主持模式,更具人性化。
軟件操作更簡(jiǎn)單:操作
方面進(jìn)行了多種自動(dòng)識(shí)別功能,簡(jiǎn)化比賽操作步驟,正式比賽時(shí)只需操作5、6個(gè)按鍵即可完成比賽。
電子搶答器
1電子搶答器的中心構(gòu)造一般都是由搶答器由單片機(jī)以及外圍電路組成,其搭配的配件不同又分為,非語(yǔ)音非記分搶答器和語(yǔ)音記分搶答器。
多適用于學(xué)校和企事業(yè)單位舉行的簡(jiǎn)單的搶答活動(dòng)。
非語(yǔ)音記分搶答器構(gòu)造很簡(jiǎn)單,就是一個(gè)搶答器的主機(jī)和一個(gè)搶答按鈕組成,在搶答過(guò)程中選手是沒(méi)有記分的顯示屏。
語(yǔ)音記分搶答器是有一個(gè)搶答器的主機(jī)和主機(jī)的顯示屏和選手的記分顯示屏。
STC12C5A60S2的6路搶答器設(shè)計(jì)
搶答按鈕
根據(jù)公司多年的大賽經(jīng)驗(yàn)搶答盒對(duì)比賽現(xiàn)場(chǎng)氣氛起到非常重要的作用。知識(shí)競(jìng)賽是屬于娛樂(lè)學(xué)習(xí)的范疇,所以比賽的現(xiàn)場(chǎng)氣氛非常重要,搶答盒的2個(gè)技術(shù)指示燈可直接影響比賽氣圍:1,搶答盒行程多少。2,搶答盒體積大小。
1,搶答盒行行程。直接決定比賽的現(xiàn)場(chǎng)氣氛,而決定搶答盒行程的有2點(diǎn):1,模具的行程。2,按鈕的行程。模具行程要在5~6MM為最佳,按鈕行程在2~3mm為最佳,這樣既能保證搶答的精確度,又可以保證比賽現(xiàn)場(chǎng)氛圍。搶答盒的行程如果小于5mm,,選手在搶答時(shí)場(chǎng)面就會(huì)顯得過(guò)于安靜,從現(xiàn)場(chǎng)看感覺(jué)還有搶答已經(jīng)搶答結(jié)束了。但行程在5~6mm的選手搶答幅度就會(huì)很大,比賽氣氛就會(huì)熱鬧很多。
2,搶答盒大小要適中,如果太小的話(huà),搶答時(shí)一般用手指點(diǎn)搶答,這樣太輕也不利于比賽現(xiàn)場(chǎng)氣氛,本公司設(shè)計(jì)的這種搶答盒,適用手掌大力拍打來(lái) 搶答,這樣能很好的烘托出比賽的激烈程度。
總體方案設(shè)計(jì)
通過(guò)查閱大量相關(guān)技術(shù)資料,并結(jié)合自己的實(shí)際知識(shí),我主要提出了兩種技術(shù)方案來(lái)實(shí)現(xiàn)系統(tǒng)功能。下面我將首先對(duì)這兩種方案的組成框圖和實(shí)現(xiàn)原理分別進(jìn)行說(shuō)明,并分析比較它們的特點(diǎn),然后闡述我最終選擇方案的原因。
搶答器采用STC12C5A60S2(或STC89C52)單片機(jī)作為控制核心,搶答器可以完成運(yùn)算控制、信號(hào)識(shí)別以及顯示功能的實(shí)現(xiàn)。由于用了單片機(jī),使其技術(shù)比較成熟,應(yīng)用起來(lái)方便、簡(jiǎn)單并且單片機(jī)周?chē)妮o助電路也比較少,便于控制和實(shí)現(xiàn)。整個(gè)系統(tǒng)具有極其靈活的可編程性,能方便地對(duì)系統(tǒng)進(jìn)行功能的擴(kuò)張和更改性。
單元模塊設(shè)計(jì)
搶答電路模塊
搶答器的工作原理是采用單片機(jī)最小系統(tǒng),用查詢(xún)式鍵盤(pán)進(jìn)行搶答。通過(guò)搶答按鍵模塊,鏈接按鍵進(jìn)行搶答。其工作原理為:主持人按清零鍵后,選手可按鍵搶答,單片機(jī)鎖存信號(hào),屏蔽外界信號(hào),同時(shí)通過(guò)5510顯示搶答成功的選手編號(hào),并有蜂鳴器發(fā)聲。此時(shí)定時(shí)器工作,開(kāi)始答題倒計(jì)時(shí),到時(shí)間結(jié)束,主持人將系統(tǒng)清零。原理圖如下:
復(fù)位電路的設(shè)計(jì)
復(fù)位電路的設(shè)計(jì)該復(fù)位電路采用上電自動(dòng)復(fù)位和手動(dòng)復(fù)位兩種復(fù)位方式,要實(shí)現(xiàn)復(fù)位只需在,STC12C5A60S2單片機(jī)的RESET~I腳上加上5ms的高電平就可以了。上電復(fù)位是利用電容的充電來(lái)實(shí)現(xiàn)的,即上電瞬間RESET端的電位與Vcc相同,隨著電容上儲(chǔ)能增加,電容電壓也逐漸增大,充電電流減小,RESET端的電位。這樣就會(huì)建立一個(gè)脈沖電壓,調(diào)節(jié)電容與電阻的大小可對(duì)脈沖的持續(xù)時(shí)間進(jìn)行調(diào)節(jié)。通常若采用1 2MHz的晶振時(shí),復(fù)位元件參數(shù)為10 LI F的電解電容和10kQ的電阻。按鈕復(fù)位電路是通過(guò)按下復(fù)位按鈕時(shí),電源對(duì)RESET端,維持兩個(gè)機(jī)器周期的高電平實(shí)現(xiàn)復(fù)位的。
晶振電路的設(shè)計(jì)
STC12單片機(jī)的定時(shí)控制功能是用時(shí)鐘電路和振蕩器完成的,而根據(jù)硬件電路的不同,連接方式分為內(nèi)部時(shí)鐘方式和外部時(shí)鐘方式。內(nèi)部時(shí)鐘方式,是單片機(jī)內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器,該高增益反相放大器的輸入端為芯片引腳XTAL1,輸出端引腳XTAL2。這兩個(gè)引腳跨接石英晶體振蕩器和微調(diào)電容,就構(gòu)成一個(gè)穩(wěn)定的自激振蕩器,電路如圖所示。
電路中電容C1、C2典型值通常選擇為30pF左右。對(duì)外接電容的值雖然沒(méi)有嚴(yán)格的要求,但電容的大小會(huì)影響振蕩器頻率的高低,振蕩器的穩(wěn)定性和起振的快速性。晶振的頻率通常在1.2MHZ-12MHZ之間。晶振的頻率越高,則系統(tǒng)的時(shí)鐘頻率也就越高,單片機(jī)的運(yùn)行速度也就越快。本設(shè)計(jì)采用內(nèi)部時(shí)鐘方式。
蜂鳴器提示報(bào)警電路
其主要在于當(dāng)單片機(jī)執(zhí)行中斷后,當(dāng)輸出信號(hào)時(shí)能夠在很短的時(shí)間里讓揚(yáng)聲器工并持續(xù)一定的時(shí)間。當(dāng)搶答器程序響應(yīng),使三極管導(dǎo)通,蜂鳴器的放大電路被接通,與此同時(shí),喇叭發(fā)出聲響。由于自激蜂鳴器是直流電壓驅(qū)動(dòng)的,不需要利用交流信號(hào)進(jìn)行驅(qū)動(dòng),只需對(duì)驅(qū)動(dòng)口輸出驅(qū)動(dòng)電平并通過(guò)三極管放大驅(qū)動(dòng)電流就能使蜂鳴器發(fā)出聲音。單片機(jī)驅(qū)動(dòng)他激蜂鳴器的方式有兩種:一種是PWM 輸出口直接驅(qū)動(dòng),另一種是利用I/O 定時(shí)翻轉(zhuǎn)電平產(chǎn)生驅(qū)動(dòng)波形對(duì)蜂鳴器進(jìn)行驅(qū)動(dòng)。
PWM 輸出口直接驅(qū)動(dòng)是利用PWM 輸出口本身可以輸出一定的方波來(lái)直接驅(qū)動(dòng)蜂鳴器。在單片機(jī)的軟件設(shè)置中有幾個(gè)系統(tǒng)寄存器是用來(lái)設(shè)置PWM 口的輸出的,可以設(shè)置占空比、周期等等,通過(guò)設(shè)置這些寄存器產(chǎn)生符合蜂鳴器要求的頻率的波形之后,只要打開(kāi)PWM 輸出,PWM 輸出口就能輸出該頻率的方波,這個(gè)時(shí)候利用這個(gè)波形就可以驅(qū)動(dòng)蜂鳴器了。比如頻率為2000Hz 的蜂鳴器的驅(qū)動(dòng),可以知道周期為500μs,這樣只需要把PWM 的周期設(shè)置為500μs,占空比電平設(shè)置為250μs,就能產(chǎn)生一個(gè)頻率為2000Hz 的方波,通過(guò)這個(gè)方波再利用三極管就可以去驅(qū)動(dòng)這個(gè)蜂鳴器了。
利用I/O 定時(shí)翻轉(zhuǎn)電平來(lái)產(chǎn)生驅(qū)動(dòng)波形的方式會(huì)比較麻煩一點(diǎn),必須利用定時(shí)器來(lái)做定時(shí),通過(guò)定時(shí)翻轉(zhuǎn)電平產(chǎn)生符合蜂鳴器要求的頻率的波形,這個(gè)波形就可以用來(lái)驅(qū)動(dòng)蜂鳴器了。比如為2500Hz 的蜂鳴器的驅(qū)動(dòng),可以知道周期為400μs,這樣只需要驅(qū)動(dòng)蜂鳴器的I/O 口每200μs 翻轉(zhuǎn)一次電平就可以產(chǎn)生一個(gè)頻率為2500Hz,占空比為1/2 duty的方波,再通過(guò)三極管放大就可以驅(qū)動(dòng)這個(gè)蜂鳴器了。當(dāng)蜂鳴器發(fā)聲時(shí),發(fā)光二激光點(diǎn)亮。
顯示電路
顯示電路可由LED或LCD來(lái)實(shí)現(xiàn)。此處選用ULF-3461BS來(lái)顯示。
本系統(tǒng)程序下載接口采用的是美信公司專(zhuān)門(mén)為電腦的RS-232標(biāo)準(zhǔn)串口設(shè)計(jì)的單電源電平轉(zhuǎn)換芯片MAX232,使用+5v單電源供電。
第一部分是電荷泵電路。由1、2、3、4、5、6腳和4只電容構(gòu)成。功能是產(chǎn)生+12v和-12v兩個(gè)電源,提供給RS-232串口電平的需要。第二部分是數(shù)據(jù)轉(zhuǎn)換通道。由7、8、9、10、11、12、13、14腳構(gòu)成兩個(gè)數(shù)據(jù)通道。其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數(shù)據(jù)通道。8腳(R2IN)、9腳(R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數(shù)據(jù)通道。TTL/CMOS數(shù)據(jù)從T1IN、T2IN輸入轉(zhuǎn)換成RS-232數(shù)據(jù)從T1OUT、T2OUT送到電腦DB9插頭;DB9插頭的RS-232數(shù)據(jù)從R1IN、R2IN輸入轉(zhuǎn)換成TTL/CMOS數(shù)據(jù)后從R1OUT、R2OUT輸出。第三部分是供電。15腳GND、16腳VCC(+5v)。
鍵盤(pán)電路
鍵盤(pán)有很多種形式。比如獨(dú)立按鍵,矩陣鍵盤(pán),編碼鍵盤(pán)等。在日常開(kāi)發(fā)中經(jīng)常會(huì)
用到鍵盤(pán)。但鍵盤(pán)會(huì)占用大量的IO,比如說(shuō)4*4矩陣鍵盤(pán),會(huì)用到單片機(jī)的8個(gè)IO口。而AD鍵盤(pán),既是利用AD轉(zhuǎn)換芯片,將鍵盤(pán)輸出的模擬電壓值進(jìn)行轉(zhuǎn)換,然后將轉(zhuǎn)換后的數(shù)字量傳送給單片機(jī),這樣就可以節(jié)省7個(gè)IO口,讓單片機(jī)流出其余的IO 口供其他外圍電路使用。
軟件設(shè)計(jì)
程序初始化:上電后,設(shè)置單片機(jī)的中斷入口及其他狀態(tài)標(biāo)志設(shè)置,清除相關(guān)中斷標(biāo)志,初始化外部顯示電路,顯示屏點(diǎn)亮。 端口設(shè)置及初始化:關(guān)顯示電路,按鍵電路對(duì)應(yīng)I/O口輸出LOC,以便進(jìn)行按鍵檢測(cè)。
搶答過(guò)程:顯示倒計(jì)時(shí),掃描到有效按鍵按下,倒計(jì)時(shí)停止倒計(jì),進(jìn)入答題倒計(jì)時(shí),蜂鳴器鳴叫10S,然后等待復(fù)位。如果在搶答時(shí)間內(nèi),沒(méi)有掃描到有效按鍵,一直倒計(jì)時(shí),到倒計(jì)為零的時(shí)候,沒(méi)搶答,蜂鳴器長(zhǎng)鳴10S后,顯示“無(wú)人搶答”。 按鍵掃描:采用動(dòng)態(tài)掃描,檢測(cè)到按鍵按下,軟件消抖,然后確認(rèn)按鍵。 搶答結(jié)束:清除本次搶答相關(guān)標(biāo)志,清倒計(jì)時(shí)和通道搶答確認(rèn)顯示。
系統(tǒng)能實(shí)現(xiàn)的功能:
本系統(tǒng)搶答器能實(shí)現(xiàn)如下功能:
?、?、由主持人控制答題開(kāi)始,通過(guò)一個(gè)總的控制按鈕,并且蜂鳴器 發(fā)聲提示。再次按下時(shí)可以對(duì)單片機(jī)進(jìn)行復(fù)位。
?、?、同時(shí)主持人按鈕控制著30S的搶答倒計(jì)時(shí),當(dāng)時(shí)間到仍沒(méi)有人搶答時(shí),蜂鳴器發(fā)聲報(bào)警,同時(shí)屏幕顯示無(wú)人搶答,等待主持人按鍵復(fù)位,進(jìn)行下一輪搶答 ③、當(dāng)有一個(gè)搶答按鈕被按下后,單片機(jī)進(jìn)行鎖存,屏蔽其他選手號(hào),此時(shí)蜂鳴器報(bào)警提示,并進(jìn)入答題倒計(jì)時(shí)30S,若超時(shí),則蜂鳴器報(bào)警,屏幕顯示答題超時(shí),此時(shí)等待主持人復(fù)位。
六、主要程序
/*======================================================= 主函數(shù)
=======================================================*/ void main(void) {
system_init();//系統(tǒng)初始化 // IP = 0x20; while(1) {
seg_change();//轉(zhuǎn)換顯示的內(nèi)容 key_handle();//鍵盤(pán)處理函數(shù) switch(SPK_Flag) {
case SPK_NO: break;
case SPK_MUSIC: SpkMusic(); break; //播放音樂(lè)1 case SPK_ALARM: SpkAlarm(); break; } } }
/*======================================================= 系統(tǒng)初始化函數(shù)
=======================================================*/ void system_init(void) {
//定時(shí)器0 初始化 定時(shí)時(shí)間2ms TMOD = 0x01;
TH0 = 0x3c; //50微妙 TL0 = 0xb0;
EA = 1;
ET0 = 1; TR0 = 1;
SEG_RAM[0]=SEG_no; //這位不顯示 有人搶答時(shí),s顯示搶答選手號(hào) 或則 無(wú)人搶答時(shí) 顯示 F
SEG_RAM[1]=SEG_no; SEG_RAM[2]=SEG_no; SEG_RAM[3]=SEG_no;
SEG_RAM[4]=SEG_no;//初始化記分器分?jǐn)?shù) SEG_RAM[5]=SEG_no; SEG_RAM[6]=SEG_no;
SEG_RAM[7]=SEG_0;//始終顯示0 }
/*======================================================= 鍵盤(pán)掃描函數(shù)
=======================================================*/ unsigned char key_scan(void) {
unsigned char keyvalue=NO_KEY; if(KEY_PORT != 0xff) {
delay();delay();delay();delay(); delay();delay();delay();delay(); delay();delay();delay();delay(); delay();delay();delay();delay(); switch (KEY_PORT) {
case 0xff: break;//無(wú)鍵按下 case 0xfe: keyvalue = PLAYER_1; break; case 0xfd: keyvalue = PLAYER_5; break; case 0xfb: keyvalue = PLAYER_2; break; case 0xf7: keyvalue = RST_KEY; break; case 0xef: keyvalue = PLAYER_3; break; case 0xdf: keyvalue = ADD_KEY; break; case 0xbf: keyvalue = PLAYER_4; break; case 0x7f: keyvalue = UP_KEY; break; }
while(KEY_PORT != 0xff);//松手檢測(cè) }
return (keyvalue);
}
/*======================================================= 鍵盤(pán)處理函數(shù)
=======================================================*/ void key_handle(void) {
unsigned char keytemp; keytemp = key_scan(); switch(keytemp) {
case NO_KEY: break;
case PLAYER_1: case PLAYER_2: case PLAYER_3: case PLAYER_4: case PLAYER_5:
if(QD_Flag==QD_GO) {
QD_Flag = QD_OK; //切換到搶答成功狀態(tài) SEG_RAM[0] = table_duan[keytemp+1]; //第一個(gè)數(shù)碼管顯示搶答選手號(hào)
QD_show_num = keytemp;
SPK_Flag = SPK_MUSIC; //蜂鳴器 播放音樂(lè) }
break; case RST_KEY:
QD_Flag = QD_GO; SPK_Flag = SPK_NO; QD_timectr=100;
SEG_RAM[0] = SEG_no; break; case ADD_KEY:
JFQ_ctr[QD_show_num]++; //對(duì)應(yīng)選手 記分器 加分 break; case UP_KEY:
QD_show_num++;
if(QD_show_num==5)QD_show_num=0;
SEG_RAM[0] = table_duan[QD_show_num+1];
break; } }
/*======================================================= 定時(shí)器0中斷服務(wù)程序
=======================================================*/ void Timer0_ISR(void) interrupt 1 {
static unsigned char t0_2ms_counter = 0,tt; //50毫秒計(jì)數(shù)器 ET2=0;
TL0 = 0x30; //2ms TH0 = 0xf8;
t0_2ms_counter++;
seg_display(); //2毫秒 掃描數(shù)碼管 if(t0_2ms_counter==250) //500ms / 2ms = 250 { //0.5s到 if(QD_timectr==0)
{ //搶答時(shí)間到,無(wú)人搶答,切換到搶答失敗狀態(tài) QD_Flag = QD_NO;
tt++;
if(tt==1)SPK_Flag = SPK_ALARM; //蜂鳴器 播放報(bào)警音 else SPK_Flag = SPK_NO; }
if(QD_Flag==QD_GO) QD_timectr-=5; //在搶答倒計(jì)時(shí)期間 倒計(jì)時(shí)減0.5
}
ET2=1; }
/*======================================================= 數(shù)碼管顯示函數(shù)
=======================================================*/ void seg_display(void) {
static unsigned char i=0; LED_WEI = table_wei[i]; LED_DUAN = SEG_RAM[i]; i++;
if(i》7) i=0; }
/*======================================================= 數(shù)碼管顯示轉(zhuǎn)換函數(shù)
=======================================================*/ void seg_change(void) {
if (QD_timectr《100) //取值為0~100
SEG_RAM[1]= SEG_no; //最高位為0則不顯示 else
SEG_RAM[1]= SEG_1; //最高位顯示1 SEG_RAM[2] = table_duandot[QD_timectr%100/10]; SEG_RAM[3] = table_duan[QD_timectr%10];
if(QD_Flag==2) SEG_RAM[0] = SEG_F; //顯示‘F’ 無(wú)人搶答 if(JFQ_ctr[QD_show_num]》=100) {
SEG_RAM[4]=table_duan[JFQ_ctr[QD_show_num]/100];
SEG_RAM[5]=table_duan[JFQ_ctr[QD_show_num]%100/10]; SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; }
else if (JFQ_ctr[QD_show_num]《100 && JFQ_ctr[QD_show_num]》=10) {
SEG_RAM[4]=SEG_no;//不顯示0
SEG_RAM[5]=table_duan[JFQ_ctr[QD_show_num]%100/10]; SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; }
else if (JFQ_ctr[QD_show_num]《10 && JFQ_ctr[QD_show_num]》0) {
SEG_RAM[4]=SEG_no;//不顯示0 SEG_RAM[5]=SEG_no;//不顯示0
SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; } else {
SEG_RAM[4]=SEG_no;//不顯示0 SEG_RAM[5]=SEG_no;//不顯示0 SEG_RAM[6]=SEG_no;//不顯示0 } }
/*======================================================= 延時(shí)函數(shù)(延時(shí)1毫秒)
=======================================================*/
void delay(void) //延時(shí)1MS {
unsigned char a,b; for(b=102;b》0;b--) for(a=3;a》0;a--); }
/*======================================================== 播放音樂(lè) 和 報(bào)警聲音
=======================================================*/ unsigned int g_ucSoundLongCNT; //
/************************************************* * 函數(shù)名稱(chēng):void T2Init(void) * 創(chuàng)建日期:2005.6.17
* 功能描述:定時(shí)器T2初始化 * 入口參數(shù):uT2Reg:定時(shí)器初值 * 返回值: 無(wú) * 修改日志:
*************************************************/ void T2Init(unsigned int uT2Reg) {
CP_RL2=0; //16位自動(dòng)重載
T2MOD=0x00; //計(jì)數(shù)增加,外部捕獲禁止 RCLK=0; TCLK=0;
TL2=RCAP2L=uT2Reg&0x00ff; TH2=RCAP2H=uT2Reg》》8;
TR2=1; // 啟動(dòng)定時(shí)器 ET2=1; //t2開(kāi)中斷 EA=1; }
/************************************************* * 函數(shù)名稱(chēng):void MusicPlay(uchar ucSL[],uint uST[]) * 創(chuàng)建日期:2005.7.12
* 功能描述:播放某首音樂(lè)的函數(shù)
* 入口參數(shù):ucSL[]:音節(jié)長(zhǎng)度的數(shù)組;uST[]:音樂(lè)頻率的數(shù)組 * 返回值: 無(wú) * 修改日志:
*************************************************/
void MusicPlay(unsigned char ucSL[],unsigned int uST[])
{
unsigned char i=0; //float fTmp=“0”;
while((ucSL[i]!=0)||(uST[i]!=0)) {
//fTmp=(float)11059/(float)12000;
T2Init(0xffff-uST[i]*((float)11059/(float)12000)*4); //11。0592M的晶體 //我添加了*5
g_ucSoundLongCNT=((3*ucSL[i]*75000L)/8)/uST[i]; //*1000我改為 75000
while(g_ucSoundLongCNT!=0); //等待計(jì)數(shù)器為0 TR2=0; //暫時(shí)關(guān)閉定時(shí)器 i++; }
BUZZER = 1; }
/************************************************* * 函數(shù)名稱(chēng):void T2Init(void) * 創(chuàng)建日期:2005.7.11
* 功能描述:用于音樂(lè)的音調(diào)半周期定時(shí) * 入口參數(shù):無(wú) * 返回值: 無(wú) * 修改日志:
*************************************************/ void T2ISR(void) interrupt 5 using 1 {
TF2=0; //手動(dòng)清除溢出標(biāo)志 if(g_ucSoundLongCNT!=0) {
g_ucSoundLongCNT--; }
BUZZER=~BUZZER; }
評(píng)論