自學(xué)單片機(jī)心得體會(huì)
無論是作為一名業(yè)余的電子愛好者還是一名電子行業(yè)的相關(guān)從業(yè)人員,掌握單片機(jī)技術(shù)無疑可以使您如虎添翼,為您的電子小制作或者開發(fā)設(shè)計(jì)電子產(chǎn)品時(shí)打開方便的大門!
而且現(xiàn)在學(xué)習(xí)單片機(jī)技術(shù)的熱潮正在不斷升溫,電子發(fā)燒友網(wǎng)開設(shè)了詳細(xì)的單片機(jī)學(xué)習(xí)專欄和人氣非常旺的論壇討論組,對(duì)于想學(xué)習(xí)單片機(jī)的朋友來說幫助很大,可以說現(xiàn)在的單片機(jī)學(xué)習(xí)環(huán)境是最好的,經(jīng)過一段時(shí)間的努力,采用單片機(jī)來開發(fā)設(shè)計(jì)電子產(chǎn)品已經(jīng)不再是專業(yè)電子工程師的“專利”!作為一個(gè)普通的電子愛好者完全可以通過一番努力后熟練掌握!國(guó)外的電子愛好者采用單片機(jī)來設(shè)計(jì)小制作非常普及,一些智能機(jī)器人、智能自動(dòng)裝置內(nèi)部都離不開單片機(jī)的身影~~~
學(xué)習(xí)單片機(jī)技術(shù)有一定的難度,不花費(fèi)一番努力是很難學(xué)會(huì)的,但是只要不斷努力就一定能成功,套用一句廣告歌詞:努力總有回報(bào)!
學(xué)習(xí)單片機(jī)最好從51系列開始,第一是書多、資料多,而且掌握51技術(shù)的人多,碰到問題能請(qǐng)教的老師也就多了,51系列的實(shí)驗(yàn)芯片AT89C51價(jià)格低廉而且很容易買到,AT89C51芯片而且可以反復(fù)擦寫1000次以上,對(duì)于初學(xué)者來說真是太合適了,就算以后考慮工業(yè)運(yùn)用,也可以先學(xué)透51后再學(xué)其他類型的單片機(jī),畢竟技術(shù)是相通的。
學(xué)習(xí)單片機(jī)的第一步是看書,單片機(jī)是一個(gè)知識(shí)密集的東東,不看書是絕對(duì)不行的,北京航空航天大學(xué)出版社出版了大量單片機(jī)方面的好書,你可以直接登錄他們的網(wǎng)站進(jìn)行郵購(gòu)。本人認(rèn)為第一本書應(yīng)該是8051單片機(jī)的基礎(chǔ)原理書,我看的第一本書是問單位一位大學(xué)生同事借的清華大學(xué)出版社的《單片機(jī)的原理及接口技術(shù)》這本是51的大學(xué)教科書,比較系統(tǒng)地介紹了51芯片的基礎(chǔ)知識(shí),我認(rèn)為這本書對(duì)我?guī)椭€是很大的,可以很系統(tǒng)地了解51單片機(jī),雖然一開始不容易看懂,不過確實(shí)很有用,很有嚼頭,可以先大致看一遍,不消化的可以以后在試驗(yàn)實(shí)踐中反復(fù)研究。
這里我推薦初學(xué)者一張學(xué)習(xí)單片機(jī)的多媒體光盤,這張光盤中有比較詳細(xì)的單片機(jī)基礎(chǔ)知識(shí),因?yàn)槭菆D文并茂,所以學(xué)習(xí)起來比較容易上手,學(xué)習(xí)容易產(chǎn)生興趣,當(dāng)然最終還是要看書的,畢竟書更系統(tǒng)全面。
《MCS-51單片機(jī)實(shí)用接口技術(shù)》這是一本北京航空航天大學(xué)出版社出版的一本好書,它詳細(xì)描述了單片機(jī)的常見接口技術(shù),對(duì)于想以后開發(fā)產(chǎn)品的話,那就人手一本吧!《單片機(jī)實(shí)踐與運(yùn)用》這本書詳細(xì)介紹了用單片機(jī)作的實(shí)驗(yàn),有很實(shí)用的匯編源程序,可以通過學(xué)習(xí)模仿上面的程序加以試驗(yàn),快速掌握單片機(jī)技術(shù)。
學(xué)習(xí)單片機(jī)的第二步是購(gòu)買工具,單片機(jī)芯片必須借助編程器才能寫入程序,站長(zhǎng)用的編程器是一種性能較好的Genius NSP 通用編程器,通用編程器的特點(diǎn)是專為開發(fā)單片機(jī)和燒寫各類存儲(chǔ)器而設(shè)計(jì)的通用機(jī)型,它的編程可靠性高,支持的器件品種很多。
Genius NSP 通用編程器:
4Opins萬用鎖緊插座。適應(yīng)絕大多數(shù)器件編程之所需。使用適配器能夠支持非DIP封裝器件的編程。
RS232竄口通訊。通訊波特率:57600bit/s
9V/500mA電源轉(zhuǎn)換器。
主要功能:EPROM、EEPROM、FLASH、MPU/CPU、PLD。Serial EEPROM六大類器件的編程;RAM器件及CMOS/TTL器件的測(cè)試等等。
可選擇的器件插入自動(dòng)探測(cè)啟動(dòng)功能,即當(dāng)您選擇該功能并啟動(dòng)后,不再需要每次點(diǎn)擊鼠標(biāo)啟動(dòng)操作,每次當(dāng)您更換芯片并鎖緊萬用插座后操作自動(dòng)啟動(dòng)。
Genius NSP 可以在 WINDOS95、 98、me、2000、XP上運(yùn)行。
從長(zhǎng)遠(yuǎn)的方面考慮,購(gòu)置一臺(tái)通用編程器是很有必要的。
學(xué)習(xí)單片機(jī)的第三步是反復(fù)編程實(shí)踐,這里需要一塊AT89C51的試驗(yàn)板。
仿真器對(duì)單片機(jī)初學(xué)者來說既是那么耳熟,同時(shí)又有些陌生,這主要是因?yàn)槭袌?chǎng)上傳統(tǒng)的仿真器價(jià)格都在千元以上,對(duì)經(jīng)濟(jì)不是非常寬裕的人來說是不小的開支。同時(shí)仿真器是用來提高調(diào)試程序效率的,也不是非需不可的,所以站長(zhǎng)在自學(xué)單片機(jī)開始的時(shí)候也沒有用過仿真器,碰到程序出錯(cuò)的時(shí)候,只好苦思冥想,或者在程序中插入一些驅(qū)動(dòng)端口的指令,然后再接上一些發(fā)光二極管做簡(jiǎn)單指示,一般調(diào)試一個(gè)程序,反復(fù)燒寫幾十次芯片是很經(jīng)常的。
現(xiàn)在我們介紹一種新型的廉價(jià)在線仿真器:它使用一片宏晶公司 【SST公司】的STC89C516RD 的單片機(jī),仿真機(jī)通過串口與 PC 連接,該型號(hào)單片機(jī)是51系列單片機(jī)中的一種,具有ISP(在系統(tǒng)可編程)功能,程序可串行下載,可仿真63K用戶程序空間,具有450個(gè)外部RAM字節(jié)。
具備了必要的工具以后就可以開始學(xué)習(xí)單片機(jī)了,對(duì)單片機(jī)進(jìn)行編程可以采用匯編語言或者C語言,匯編語言的特點(diǎn)是代碼緊湊,對(duì)初學(xué)者的電腦水平要求低、上手快,但是程序編寫工作量大,站長(zhǎng)網(wǎng)站的程序范例就是采用匯編語言編寫的,這里說的C語言是專用于51單片機(jī)的C語言,它的特點(diǎn)是編寫效率高,但是對(duì)使用者的電腦水平要求高,最好是已經(jīng)會(huì)C語言了,電子發(fā)燒友網(wǎng)網(wǎng)站上也有單片機(jī)C語言教程。我認(rèn)為初學(xué)單片機(jī)的人最好懂一些匯編語言,匯編語言可以直接控制單片機(jī)的資源,比如具體的單片機(jī)引腳、內(nèi)存地址,掌握這些也是很有必要的,學(xué)會(huì)匯編語言可以打下比較好的基礎(chǔ),很多參考書也是這么說的,如果你是專業(yè)單片機(jī)開發(fā)人員,那么C語言效率高,更適合你。
自學(xué)匯編語言,首先要學(xué)會(huì)看懂別人的匯編語言程序,可以將匯編語言的指令翻譯成自己容易理解的功能描述性文字,詳細(xì)注釋在程序后面,這樣便于自己以后引用或者別人容易看懂。站長(zhǎng)看到別人寫的一些匯編程序的注釋都非常少,這非常不利于初學(xué)者學(xué)習(xí)和互相交流,所以只要是站長(zhǎng)寫的程序都做了非常詳細(xì)的注釋。
學(xué)習(xí)匯編語言可以參考相關(guān)的書,匯編語言有100多條指令,但是常用的指令也就二三十條,可以先記住常用的匯編指令,如果一時(shí)記不住可以打印在紙上慢慢熟悉,然后對(duì)別人的匯編程序再加以試驗(yàn)驗(yàn)證,最后還可以在自己理解的基礎(chǔ)上對(duì)匯編程序的相關(guān)參數(shù)修改再反復(fù)試驗(yàn),這是快速掌握單片機(jī)的捷徑!
一、八路LED跑馬燈實(shí)驗(yàn)
現(xiàn)在讓我們開始做第一個(gè)實(shí)驗(yàn):八路發(fā)光二極管輪流點(diǎn)亮的實(shí)驗(yàn),也就是通常所說的跑馬燈實(shí)驗(yàn),首先讓我們來完成必須的硬件部分,我們需要焊接上8個(gè)發(fā)光二極管和8個(gè)限流電阻,可以參考下面的原理圖和實(shí)物圖像進(jìn)行操作,需要注意的是LED是有極性的,引腳長(zhǎng)的為正極,引腳短的為負(fù)極,負(fù)極和電阻一側(cè)連接,如果接錯(cuò)那么相應(yīng)的那一路可能在實(shí)驗(yàn)中不會(huì)點(diǎn)亮了,在焊接前要看仔細(xì)哦~~~
下面我們來完成軟件編程設(shè)計(jì),這里我們沒有采用高深的編程技巧,而是用了最笨、最直接的向端口送數(shù)的辦法來實(shí)現(xiàn),一來程序比較簡(jiǎn)單,沒必要玩深沉,而且初學(xué)者看起來直觀易懂。
ORG 0000H
START:MOV P1,#01111111B;最下面的LED點(diǎn)亮
LCALL DELAY;延時(shí)1秒
MOV P1,#10111111B;最下面第二個(gè)的LED點(diǎn)亮
LCALL DELAY;延時(shí)1秒
MOV P1,#11011111B;最下面第三個(gè)的LED點(diǎn)亮 (以下省略)
LCALL DELAY
MOV P1,#11101111B
LCALL DELAY
MOV P1,#11110111B
LCALL DELAY
MOV P1,#11111011B
LCALL DELAY
MOV P1,#11111101B
LCALL DELAY
MOV P1,#11111110B
LCALL DELAY
MOV P1,#11111111B;完成第一次循環(huán)點(diǎn)亮,延時(shí)約0.25秒
AJMP START;反復(fù)循環(huán)
;延時(shí)子程序,12M晶振延時(shí)約250毫秒
DELAY:
MOV R4,#2
L3: MOV R2 ,#250
L1: MOV R3 ,#250
L2: DJNZ R3 ,L2
DJNZ R2 ,L1
DJNZ R4 ,L3
RET
END
如何精確計(jì)算延時(shí)子程序的執(zhí)行時(shí)間?
匯編語言的一大優(yōu)勢(shì)就是能夠精確控制程序的執(zhí)行時(shí)間,這在編寫一些對(duì)時(shí)序要求嚴(yán)格的外圍器件驅(qū)動(dòng)時(shí)由為重要!
二、兩位數(shù)碼管循環(huán)顯示00~99的實(shí)驗(yàn)
現(xiàn)在讓我們用實(shí)驗(yàn)板上的兩個(gè)數(shù)碼管來做一個(gè)循環(huán)顯示00~99數(shù)字的實(shí)驗(yàn),先來完成必要的硬件部分,
數(shù)碼管有共陰和共陽的區(qū)分,單片機(jī)都可以進(jìn)行驅(qū)動(dòng),但是驅(qū)動(dòng)的方法卻不同,并且相應(yīng)的0~9的顯示代碼也正好相反。
首先我們來介紹兩位共陽數(shù)碼管的單片機(jī)驅(qū)動(dòng)方法,電路如下圖:
網(wǎng)友可以看到:P2.6和P2.7端口分別控制數(shù)碼管的十位和個(gè)位的供電,當(dāng)相應(yīng)的端口變成低電平時(shí),驅(qū)動(dòng)相應(yīng)的三極管會(huì)導(dǎo)通,+5V通過IN4148二極管和驅(qū)動(dòng)三極管給數(shù)碼管相應(yīng)的位供電,這時(shí)只要P0口送出數(shù)字的顯示代碼,數(shù)碼管就能正常顯示數(shù)字。
因?yàn)橐@示兩位不同的數(shù)字,所以必須用動(dòng)態(tài)掃描的方法來實(shí)現(xiàn),就是先個(gè)位顯示1毫秒,再十位顯示1毫秒,不斷循環(huán),這樣只要掃描時(shí)間小于1/50秒,就會(huì)因?yàn)槿搜鄣囊曈X殘留效應(yīng),看到兩位不同的數(shù)字穩(wěn)定顯示。
下面我們?cè)俳榻B一種共陰數(shù)碼管的單片機(jī)驅(qū)動(dòng)方法,電路如下圖:
網(wǎng)友可以看到:+5V通過1K的排阻直接給數(shù)碼管的8個(gè)段位供電,P2.6和P2.7端口分別控制數(shù)碼管的十位和個(gè)位的供電,當(dāng)相應(yīng)的端口變成低電平時(shí),相應(yīng)的位可以吸入電流。單片機(jī)的P0口輸出的數(shù)據(jù)相當(dāng)于將數(shù)碼管不要顯示的數(shù)字段對(duì)地短路,這樣數(shù)碼管就會(huì)顯示需要的數(shù)字。
網(wǎng)友可以看到,共陰數(shù)碼管的硬件更簡(jiǎn)單,所以在批量生產(chǎn)時(shí),硬件開銷小,節(jié)省PCB面積,減少焊接工作量,降低綜合成本,所以采用共陰數(shù)碼管更有利于批量生產(chǎn),現(xiàn)在銷售的試驗(yàn)板都是采用共陰數(shù)碼管了。
以下是用AT89C51實(shí)驗(yàn)板的兩位數(shù)碼管顯示00~99依次循環(huán)的匯編語言程序
a_bit equ 20h ;數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置
b_bit equ 21h ;數(shù)碼管十位數(shù)存放內(nèi)存位置
temp equ 22h ;計(jì)數(shù)器數(shù)值存放內(nèi)存位置
star: mov temp,#0 ;初始化計(jì)數(shù)器,從0開始
stlop: acall display;調(diào)用顯示子程序
inc temp;對(duì)計(jì)數(shù)器加1
mov a,temp
cjne a,#100,next ;判斷計(jì)數(shù)器是否滿100?
mov temp,#0;滿100就清零重新開始
next: ljmp stlop;不滿就循環(huán)執(zhí)行
;顯示子程序
display: mov a,temp ;將temp中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
mov b,#10 ;10進(jìn)制/10=10進(jìn)制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個(gè)位在b
mov dptr,#numtab ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;
dplop: mov a,a_bit ;取個(gè)位數(shù)
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
mov p0,a ;送出個(gè)位的7段代碼
clr p2.7 ;開個(gè)位顯示
acall d1ms ;顯示162微秒
setb p2.7;關(guān)閉個(gè)位顯示,防止鬼影
mov a,b_bit ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
mov p0,a ;送出十位的7段代碼
clr p2.6 ;開十位顯示
acall d1ms ;顯示162微秒
setb p2.6;關(guān)閉十位顯示,防止鬼影
djnz r1,dplop ;循環(huán)執(zhí)行250次
djnz r0,dpl1 ;循環(huán)執(zhí)行250X4=1000次
ret
;2+2X80=162微秒,延時(shí)按12MHZ計(jì)算
D1MS: MOV R7,#80
DJNZ R7,$
RET
;實(shí)驗(yàn)板上的7段數(shù)碼管0~9數(shù)字的共陰顯示代碼
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
end
;如果是共陽數(shù)碼管的顯示代碼
numtab: DB 30H,0FCH,0A2H,0A4H,06CH,25H,21H,0BCH,20H,24H
三、單片機(jī)演奏音樂實(shí)驗(yàn)
利用單片機(jī)演奏音樂大概是單片機(jī)愛好者感興趣的問題之一。這里我們用網(wǎng)站提供的實(shí)驗(yàn)板來做這個(gè)實(shí)驗(yàn),并且了解單片機(jī)演奏音樂的基本原理,和相關(guān)的源程序。
首先來完成必要的硬件部分,硬件部分比較簡(jiǎn)單,如下圖:
AT89C51單片機(jī)的P2.5口控制一個(gè)8550的三極管,三極管控制電磁蜂鳴器的電源通斷。
我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單處機(jī)某個(gè)口線的高電平或低電平,則在該口線上就能產(chǎn)生一定頻率的矩形波,接上喇叭就能發(fā)出一定頻率的聲音,若再利用延時(shí)程序控制“高”“低”電平的持續(xù)時(shí)間,就能改變輸出頻率,從而改變音調(diào)。
例如,要產(chǎn)生200HZ的音頻信號(hào),200HZ音頻的變化周期為1/200秒,即5ms。這樣,當(dāng)P2.5的高電平或低電平的持續(xù)時(shí)間為2.5ms時(shí)就能發(fā)出200HZ的音調(diào)。
樂曲中,每一音符對(duì)應(yīng)著確定的頻率,我們將每一音符的時(shí)間常數(shù)和其相應(yīng)的節(jié)拍常數(shù)作為一組,按順序?qū)非械乃谐?shù)排列成一個(gè)表,然后由查表程序依次取出,產(chǎn)生音符并控制節(jié)奏,就可以實(shí)現(xiàn)演奏效果。
此外,結(jié)束符和體止符可以分別用代碼00H和FFH來表示,若查表結(jié)果為00H,則表示曲子終了;若查表結(jié)果為FFH,則產(chǎn)生相應(yīng)的停頓效果。
為了產(chǎn)生手彈的節(jié)奏感,在某些音符(例如兩個(gè)相同音符)音插入一個(gè)時(shí)間單位的頻率略有不同的音符。
程序框圖如圖2所示。
下面給出程序序請(qǐng)單,可直接在51實(shí)驗(yàn)板上進(jìn)行演奏。本程序演奏的是民歌“八月桂花遍地開”,C調(diào),節(jié)奏為94拍/分。網(wǎng)友也可以自行找出一首歌,將樂曲翻譯成碼表輸入機(jī)器,而程序不變。本實(shí)驗(yàn)方法簡(jiǎn)便,即使不懂音樂的人,將一首陌生的曲子翻譯成代碼也是易事,和著機(jī)器的演奏學(xué)唱一首歌曲,其趣味無窮。
;標(biāo)題 ‘八月桂花香’發(fā)聲程序
ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中斷服務(wù),中斷計(jì)數(shù)器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中斷
RETI
START:
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表頭地址送DPTR
MOV 20H,#00H ;中斷計(jì)數(shù)器清0
MUSIC1:
NOP
CLR A ;A清零
MOVC A,@A+DPTR ;查表取代碼
JZ END0 ;是00H,則結(jié)束
CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下執(zhí)行
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A ;R6=18H音符的頻率
INC DPTR DPTR加一
MOV A,#0
MOVC A,@A+DPTR ;取節(jié)拍代碼送R7
MOV R7,A ;R7=30H音符發(fā)音的時(shí)間
SETB TR0 ;啟動(dòng)計(jì)數(shù)
MUSIC2:
NOP
CPL P2.5 ;P2.5是音樂輸出引腳
MOV A,R6
MOV R3,A ;R3=R6=18H
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中斷計(jì)數(shù)器(20H)=R7否?
;不等,則繼續(xù)循環(huán)
MOV 20H,#00H ;等于,則取下一代碼
INC DPTR
LJMP MUSIC1
MUSIC3:
NOP ;休止100毫秒
CLR TR0
MOV R2,#0DH ;R2=13
MUSIC4:
NOP
MOV R3,#0FFH ;R3=255
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#0FFH ;歌曲結(jié)束,延時(shí)1秒后繼續(xù)
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
DB 18H, 30H, 1CH, 10H
DB 20H, 40H, 1CH, 10H
DB 18H, 10H, 20H, 10H
DB 1CH, 10H, 18H, 40H
DB 1CH, 20H, 20H, 20H
DB 1CH, 20H, 18H, 20H
DB 20H, 80H, 0FFH, 20H
DB 30H, 1CH, 10H , 18H
DB 20H, 15H, 20H , 1CH
DB 20H, 20H, 20H , 26H
DB 40H, 20H , 20H , 2BH
DB 20H, 26H, 20H , 20H
DB 20H, 30H , 80H , 0FFH
DB 20H, 20H, 1CH , 10H
DB 18H, 10H, 20H , 20H
DB 26H, 20H , 2BH , 20H
DB 30H, 20H , 2BH , 40H
DB 20H, 20H , 1CH , 10H
DB 18H, 10H, 20H, 20H
DB 26H, 20H , 2BH, 20H
DB 30H, 20H, 2BH , 40H
DB 20H, 30H, 1CH , 10H
DB 18H, 20H , 15H , 20H
DB 1CH, 20H , 20H , 20H
DB 26H, 40H, 20H , 20H
DB 2BH, 20H, 26H , 20H
DB 20H, 20H, 30H , 80H
DB 20H, 30H, 1CH , 10H
DB 20H, 10H, 1CH , 10H
DB 20H, 20H, 26H , 20H
DB 2BH, 20H, 30H , 20H
DB 2BH, 40H, 20H , 15H
DB 1FH, 05H, 20H , 10H
DB 1CH, 10H, 20H , 20H
DB 26H, 20H, 2BH , 20H
DB 30H, 20H, 2BH , 40H
DB 20H, 30H, 1CH , 10H
DB 18H, 20H , 15H , 20H
DB 1CH, 20H , 20H , 20H
DB 26H, 40H, 20H , 20H
DB 2BH, 20H, 26H , 20H
DB 20H, 20H, 30H, 30H
DB 20H, 30H, 1CH, 10H
DB 18H, 40H, 1CH, 20H
DB 20H, 20H, 26H, 40H
DB 13H, 60H, 18H , 20H
DB 15H, 40H, 13H , 40H
DB 18H, 80H, 00H
end
四、單片機(jī)倒計(jì)時(shí)定時(shí)器
這里我們先要安裝好51試驗(yàn)板上的兩個(gè)輕觸按鈕開關(guān),我們采用的是獨(dú)立式按鈕開關(guān),也就是說將開關(guān)直接連接到電源的地和單片機(jī)的對(duì)應(yīng)引腳之間,這里K1接到單片機(jī)的P3.6引腳,K2接到P3.7。正常情況下單片機(jī)的P3.6、P3.7都被程序初始化時(shí)置“1” 當(dāng)有按鍵按下時(shí)對(duì)應(yīng)的單片機(jī)引腳被按鈕開關(guān)下拉為“0”,這種方法比較直觀,而且比較簡(jiǎn)單,在按鍵數(shù)量不多的場(chǎng)合下使用很廣泛。
因?yàn)?a href="http://wenjunhu.com/v/tag/1472/" target="_blank">機(jī)械開關(guān)開關(guān)時(shí)有抖動(dòng),所以需要在程序中加一個(gè)軟件去抖動(dòng)程序,它的工作原理如下:當(dāng)單片機(jī)檢測(cè)到有按鍵被按下后立即執(zhí)行一個(gè)10毫秒的延時(shí)程序,然后再在檢測(cè)該引腳是否仍然為閉合狀態(tài)?如果仍然為閉合說明確認(rèn)該鍵被按下立即執(zhí)行相應(yīng)的處理程序,否則可能是干擾,丟棄這次檢測(cè)結(jié)果。
接下來我們?cè)侔惭b一個(gè)四位的撥碼開關(guān),就是圖中紅色的開關(guān),它相當(dāng)于四個(gè)裝在一起的撥動(dòng)開關(guān),當(dāng)開關(guān)撥到“ON”一側(cè)時(shí),對(duì)應(yīng)的那路就會(huì)接通,反之?dāng)嚅_。它在單片機(jī)中一般用于設(shè)置初始參數(shù),而且不經(jīng)常改變的場(chǎng)合。這里因?yàn)閱纹瑱C(jī)引腳資源不夠,所以我們只使用了撥碼開關(guān)的第2、3、4位,第1位閑置。三個(gè)開關(guān)可以邏輯組合出8種狀態(tài),所以我們能夠方便靈活地預(yù)置多達(dá)7種的倒計(jì)時(shí)時(shí)間。
最后我們來安裝兩個(gè)繼電器和相關(guān)電路,有了繼電器我們的實(shí)驗(yàn)板不再僅僅是做做實(shí)驗(yàn)而已,可以用于控制一些負(fù)載,比如說:充電器,洗衣機(jī),電風(fēng)扇等,使我們的實(shí)驗(yàn)板的實(shí)用功能大大增強(qiáng),這也是電子制作實(shí)驗(yàn)室網(wǎng)站的單片機(jī)實(shí)驗(yàn)板和其他公司的產(chǎn)品不同的地方。
這里繼電器由相應(yīng)的S8050三極管來驅(qū)動(dòng),開機(jī)時(shí),單片機(jī)初始化后的P2.3/P2.4為高電平,+5伏電源通過電阻使三極管導(dǎo)通,所以開機(jī)后繼電器始終處于吸合狀態(tài),如果我們?cè)诔绦蛑薪o單片機(jī)一條:CLR P2.3或者CLR P2.4的指令的話,相應(yīng)三極管的基極就會(huì)被拉低到零伏左右,使相應(yīng)的三極管截至,繼電器就會(huì)斷電釋放,每個(gè)繼電器都有一個(gè)常開轉(zhuǎn)常閉的接點(diǎn),便于在其他電路中使用,繼電器線圈兩端反相并聯(lián)的二極管是起到吸收反向電動(dòng)勢(shì)的功能,保護(hù)相應(yīng)的驅(qū)動(dòng)三極管,這種繼電器驅(qū)動(dòng)方式硬件結(jié)構(gòu)比較簡(jiǎn)單。
;電子制作實(shí)驗(yàn)室http://www.xie-gang.com/
;可設(shè)定時(shí)間的倒計(jì)時(shí)定時(shí)器,可選擇5/15/20/30/35/45/50分鐘倒計(jì)時(shí)
;倒計(jì)時(shí)時(shí)間由四位撥碼開關(guān)的2/3/4位來控制,
;第2位表示5分鐘,第3位表示15分鐘,第4位表示30分鐘,
;通過不同的組合可以產(chǎn)生5/15/20/30/35/45/50分鐘倒計(jì)時(shí)
;P1.0口的外接的發(fā)光二極管為狀態(tài)LED,定時(shí)未開始時(shí)LED常亮,定時(shí)過程中LED閃爍
;K1為開始按鈕,K2為停止按鈕
a_bit equ 20h ;數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置
b_bit equ 21h ;數(shù)碼管十位數(shù)存放內(nèi)存位置
temp equ 22h ;計(jì)數(shù)器數(shù)值存放內(nèi)存位置
;開機(jī)初始化
MOV P3,#0FFH;對(duì)P3口初始化,設(shè)置為高電平,用于按鍵輸入
MOV P0,#0FFH;使顯示時(shí)間數(shù)碼管熄滅
CLR P1.0;點(diǎn)亮LED指示燈
;等待鍵盤輸入
START:JB P3.6,$;循環(huán)判斷開始按鈕K1是否按下?
ACALL DELAY10;延時(shí)10毫秒觸點(diǎn)消抖
JB P3.6,START;如果是干擾就返回
JNB P3.6,$;等待按鍵松開
;讀撥碼開關(guān)的狀態(tài),獲得倒計(jì)時(shí)時(shí)間
SET:MOV A,#0;首先對(duì)A清零
JB P2.0,A1;判斷撥碼開關(guān)的第2位是否接通,接通就對(duì)A加5
ADD A,#5
A1:JB P2.1,A2;判斷撥碼開關(guān)的第3位是否接通,接通就對(duì)A加15
ADD A,#15
A2:JB P2.2,A3;判斷撥碼開關(guān)的第4位是否接通,接通就對(duì)A加30
ADD A,#30
A3:MOV TEMP,A
;這時(shí)TEMP中的值就是倒計(jì)時(shí)時(shí)間
;數(shù)碼管顯示定時(shí)時(shí)間的程序
display:CLR P2.4;使繼電器1釋放,開始定時(shí)(開機(jī)時(shí)繼電器處于吸合狀態(tài))
CLR P2.3;使繼電器2釋放,開始定時(shí)(開機(jī)時(shí)繼電器處于吸合狀態(tài))
MOV R2,#120
AB:MOV R3,#250
TIME1:mov a,temp ;將temp中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
mov b,#10 ;10進(jìn)制/10=10進(jìn)制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個(gè)位在b
mov dptr,#numtab ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;
dplop: mov a,a_bit ;取個(gè)位數(shù)
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
mov p0,a ;送出個(gè)位的7段代碼
clr p2.7 ;開個(gè)位顯示
ACALL DELY1;顯示1毫秒
setb p2.7;關(guān)閉個(gè)位顯示,防止鬼影
mov a,b_bit ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
mov p0,a ;送出十位的7段代碼
clr p2.6 ;開十位顯示
ACALL DELY1;顯示1毫秒
setb p2.6;關(guān)閉十位顯示,防止鬼影
;插入一段判斷定時(shí)過程中是否有按鍵輸入的程序段
C1:JB P3.6,B1
ACALL DELAY10;延時(shí)10毫秒消抖
JB P3.6,C1
JNB P3.6,$;等待按鍵松開
AJMP SET
B1:JB P3.7,M33
ACALL DELAY10;延時(shí)10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按鍵松開
AJMP OVER
M33:djnz r3,TIME1 ;2毫秒循環(huán)執(zhí)行250次,時(shí)間約0.5秒
CPL P1.0;使LED每1秒閃爍一次
djnz r2,AB ;循環(huán)執(zhí)行120次,時(shí)間為1分鐘
DEC TEMP;滿一分鐘對(duì)定時(shí)時(shí)間減1
MOV A,TEMP
JNZ DISPLAY;判斷TEMP的數(shù)值是否為0?不為0循環(huán)
;結(jié)束定時(shí)
OVER:CLR P1.0;LED指示燈常亮
SETB P2.4;繼電器1吸合,定時(shí)結(jié)束,退回到開機(jī)時(shí)的狀態(tài)
SETB P2.3;繼電器2吸合,定時(shí)結(jié)束,退回到開機(jī)時(shí)的狀態(tài)
AJMP START;退到開機(jī)初始化狀態(tài)
;1毫秒延時(shí)子程序
DELY1:MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
;10毫秒延時(shí)子程序
DELAY10:MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
;實(shí)驗(yàn)板上的7段數(shù)碼管0~9數(shù)字的共陰顯示代碼
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
end
五、單片機(jī)和PC機(jī)串口通訊試驗(yàn)
51單片機(jī)有一個(gè)全雙工的串行通訊口,所以單片機(jī)和電腦之間可以方便地進(jìn)行串口通訊。進(jìn)行串行通訊時(shí)要滿足一定的條件,比如電腦的串口是RS232電平的,而單片機(jī)的串口是TTL電平的,兩者之間必須有一個(gè)電平轉(zhuǎn)換電路,我們采用了專用芯片MAX232進(jìn)行轉(zhuǎn)換,雖然也可以用幾個(gè)三極管進(jìn)行模擬轉(zhuǎn)換,但是還是用專用芯片更簡(jiǎn)單可靠。我們采用了三線制連接串口,也就是說和電腦的9針串口只連接其中的3根線:第5腳的GND、第2腳的RXD、第3腳的TXD。這是最簡(jiǎn)單的連接方法,但是對(duì)我們來說已經(jīng)足夠使用了,電路如下圖所示,MAX232的第10腳和單片機(jī)的11腳連接,第9腳和單片機(jī)的10腳連接,第15腳和單片機(jī)的20腳連接。電子制作實(shí)驗(yàn)室網(wǎng)站的提供的帶擴(kuò)展元件的51單片機(jī)實(shí)驗(yàn)板上已經(jīng)裝配好了全部硬件。
串口通訊的硬件電路如上圖所示,我們可以采用以下方法來判斷串口是否存在硬件問題,將MAX232的第9腳接地,測(cè)量一下串口的第3腳和第5腳之間是否輸出10V左右的直流電壓?將MAX232的第9腳接正5V,測(cè)量一下串口的第3腳和第5腳之間是否輸出-10V左右的直流電壓?這樣可以判斷MAX232是否完好和串口線的排線壓接處是否有接觸不良。
為了能夠在電腦端看到單片機(jī)發(fā)出的數(shù)據(jù),我們必須借助一個(gè)WINDOWS軟件進(jìn)行觀察,這里我們利用一個(gè)免費(fèi)的電腦串口調(diào)試軟件。
點(diǎn)擊這里可以下載并運(yùn)行這個(gè)串口調(diào)試軟件,這是一個(gè)綠色的軟件,無需安裝,可以直接在當(dāng)前位置運(yùn)行這個(gè)軟件。軟件界面如上圖,我們先要設(shè)置一下串口通訊的參數(shù),將波特率調(diào)整為4800,勾選十六進(jìn)制顯示。串口選擇為COM1,當(dāng)然將網(wǎng)站提供的51單片機(jī)實(shí)驗(yàn)板的串口也要和電腦的COM1連接,將燒寫有以下程序的單片機(jī)插入單片機(jī)實(shí)驗(yàn)板的萬能插座中,并接通51單片機(jī)實(shí)驗(yàn)板的電源,這時(shí)只要按下K1一次,在串口調(diào)試助手軟件的接收區(qū)界面中就會(huì)增加一個(gè)“AF”字符,表示單片機(jī)向電腦發(fā)送“AF”字符成功。串口實(shí)驗(yàn)的源程序如下所示:
;這是一個(gè)AT89C51單片機(jī)實(shí)驗(yàn)開發(fā)板向PC機(jī)的串口單向發(fā)送數(shù)據(jù)AF的演示程序
;采用MAX232專用芯片作RS232/TTL電平轉(zhuǎn)換。
;通訊波特率為4800KBPS,只要按下一次K1(就是P3.6引腳變成低電平)
;就發(fā)送一個(gè)16進(jìn)制的AF字符
ORG 0000H
MOV SCON,#50H;設(shè)置成串口1方式
MOV TMOD,#20H;波特率發(fā)生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍為2400x2=4800BPS
MOV TH1,#0F3H;預(yù)置初值(按照波特率2400BPS預(yù)置初值)
MOV TL1,#0F3H;預(yù)置初值(按照波特率2400BPS預(yù)置初值)
SETB TR1;啟動(dòng)定時(shí)器T1
;以上完成通訊初始化設(shè)置
WRIT:JB P3.6,$;判斷K1是否按下,如果沒有按下就等待
ACALL DELAY10;延時(shí)10毫秒消觸點(diǎn)抖動(dòng)
JB P3.6,WRIT;去除干擾信號(hào)
JNB P3.6,$;等待按鍵松開
MOV A,#0AFH;將16進(jìn)制的字符AF發(fā)送到串口去
MOV SBUF,A;將AF通過串口發(fā)送出去
AJMP WRIT
;10毫秒延時(shí)子程序
DELAY10:MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
END
六、紅外線遙控器聲光測(cè)試器
這里我們要用單片機(jī)實(shí)驗(yàn)板制作一個(gè)紅外線遙控器聲光測(cè)試器,紅外線遙控器廣泛用于電視機(jī)、VCD、音響等家用電器中,經(jīng)過長(zhǎng)時(shí)間使用可能會(huì)出現(xiàn)一些小故障,用我們制作的測(cè)試器可以方便地判斷遙控器是否能發(fā)射紅外信號(hào)?各個(gè)按鍵工作是否可靠?這個(gè)測(cè)試器非常簡(jiǎn)單,制作也很容易,但是也有一定的實(shí)用價(jià)值,站長(zhǎng)就是用這個(gè)小東東幫鄰居修了不少遙控器哦~~
首先讓我們來完成試驗(yàn)板上的硬件部分,需要再焊接一個(gè)一體化紅外接收器,一體化紅外線接收器是一種集紅外線接收和放大于一體,不需要任何外接元件,就能完成從紅外線接收到輸出與TTL電平信號(hào)兼容的所有工作,而體積又很小巧,它適合于各種紅外線遙控和紅外線數(shù)據(jù)傳輸。 再焊上兩個(gè)濾波電容,可以使接收器工作更可靠
ORG 0000H
START:MOV P0,#0FFH;開機(jī)初始化
MOV P1,#0FFH
MOV P2,#11100111B
MOV P3,#0FFH
JB P3.2,$;等待遙控信號(hào)出現(xiàn)
MOV P1,#0
MOV p2,#0
JNB P3.2,$;如果是低電平就原地等待,如果出現(xiàn)高電平就退出
AJMP START
END
七、紅外線遙控器解碼程序
這里我們以紅外線遙控編碼芯片為L(zhǎng)C7461等芯片為例來說明用單片機(jī)實(shí)現(xiàn)紅外遙控解碼的詳細(xì)過程,站長(zhǎng)琢磨這個(gè)解碼程序花了相當(dāng)多的精力,期間幾經(jīng)修改逐步完善,后來還用它開發(fā)了幾個(gè)小產(chǎn)品,希望能對(duì)網(wǎng)友學(xué)習(xí)單片機(jī)有所幫助。
紅外線遙控是目前使用最廣泛的一種通信和遙控手段。由于紅外線遙控裝置具有體積小、功耗低、功能強(qiáng)、成本低等特點(diǎn),因而,繼彩電、錄像機(jī)之后,在錄音機(jī)、音響設(shè)備、空凋機(jī)以及玩具等其它小型電器裝置上也紛紛采用紅外線遙控。工業(yè)設(shè)備中,在高壓、輻射、有毒氣體、粉塵等環(huán)境下,采用紅外線遙控不僅完全可靠而且能有效地隔離電氣干擾。
1 紅外遙控系統(tǒng)
通用紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成,應(yīng)用編/解碼專用集成電路芯片來進(jìn)行控制操作,如圖1所示。發(fā)射部分包括鍵盤矩陣、編碼調(diào)制、LED紅外發(fā)送器;接收部分包括光、電轉(zhuǎn)換放大器、解調(diào)、解碼電路。
2 遙控發(fā)射器及其編碼
遙控發(fā)射器專用芯片很多,根據(jù)編碼格式可以分成脈沖寬度調(diào)制和脈沖相位調(diào)制兩大類,這里我們以運(yùn)用比較廣泛,解碼比較容易的脈沖寬度調(diào)制來加以說明,現(xiàn)以LC7461組成發(fā)射電路為例說明編碼原理。當(dāng)發(fā)射器按鍵按下后,即有遙控碼發(fā)出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:
采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進(jìn)制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進(jìn)制的“1”
上述“0”和“1”組成的42位二進(jìn)制碼經(jīng)38kHz的載頻進(jìn)行二次調(diào)制以提高發(fā)射效率,達(dá)到降低電源功耗的目的。然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射,
7461產(chǎn)生的遙控編碼是連續(xù)的42位二進(jìn)制碼組,其中前26位為用戶識(shí)別碼,能區(qū)別不同的紅外遙控設(shè)備,防止不同機(jī)種遙控碼互相干擾。后16位為8位的操作碼和8位的操作反碼用于核對(duì)數(shù)據(jù)是否接收準(zhǔn)確。
當(dāng)遙控器上任意一個(gè)按鍵按下超過36ms時(shí),LC7461芯片的振蕩器使芯片激活,將發(fā)射一個(gè)特定的同步碼頭,對(duì)于接收端而言就是一個(gè)9ms的低電平,和一個(gè)4.5ms的高電平,這個(gè)同步碼頭可以使程序知道從這個(gè)同步碼頭以后可以開始接收數(shù)據(jù)。
解碼的關(guān)鍵是如何識(shí)別“0”和“1”,從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以0.56ms的低電平開始,不同的是高電平的寬度不同,“0”為0.56ms,“1”為1.68ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。如果從0.56ms低電平過后,開始延時(shí),0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時(shí)必須比0.56ms長(zhǎng)些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此?。?.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右即可。
根據(jù)紅外編碼的格式,程序應(yīng)該等待9ms的起始碼和4.5ms的結(jié)果碼完成后才能讀碼。
如果郵購(gòu)我們開發(fā)的51單片機(jī)試驗(yàn)板和擴(kuò)展元件的網(wǎng)友,可以獲得如上圖所示的紅外遙控手柄,這種遙控器的編碼格式符合上面的描述規(guī)律,而且價(jià)格低廉,有32個(gè)按鍵,按鍵外形比較統(tǒng)一,如果用于批量開發(fā),可以把遙控器上貼膜換成你需要的字符,這為開發(fā)產(chǎn)品提供了便利。
接收器及解碼
LT0038是塑封一體化紅外線接收器,它是一種集紅外線接收、放大、整形于一體的集成電路,不需要任何外接元件,就能完成從紅外線接收到輸出與TTL電平信號(hào)兼容的所有工作,沒有紅外遙控信號(hào)時(shí)為高電平,收到紅外信號(hào)時(shí)為低電平,而體積和普通的塑封三極管大小一樣,它適合于各種紅外線遙控和紅外線數(shù)據(jù)傳輸。
下面是一個(gè)對(duì)51實(shí)驗(yàn)板配套的紅外線遙控器的解碼程序,它可以把上圖32鍵的紅外遙控器每一個(gè)按鍵的鍵值讀出來,并且通過實(shí)驗(yàn)板上P1口的8個(gè)LED顯示出來,在解碼成功的同時(shí)并且能發(fā)出“嘀嘀嘀”的提示音。
ORG 0000H
AJMP MAIN;轉(zhuǎn)入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
AJMP INT ;轉(zhuǎn)入外部中斷服務(wù)子程序(解碼程序)
;以下為主程序進(jìn)行CPU中斷方式設(shè)置
MAIN:SETB EA ;打開CPU總中斷請(qǐng)求
SETB IT0 ;設(shè)定INT0的觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
SETB EX0 ;打開INT0中斷請(qǐng)求
;以下對(duì)單片機(jī)的所有引腳進(jìn)行初始化,全部設(shè)置成高電平
MOV P2,#11100111B
AJMP $
;以下為進(jìn)入P3.2腳外部中斷子程序,也就是解碼程序
INT: CLR EA ;暫時(shí)關(guān)閉CPU的所有中斷請(qǐng)求
MOV R6,#10
SB: ACALL YS1;調(diào)用882微秒延時(shí)子程序
JB P3.2,EXIT;延時(shí)882微秒后判斷P3.2腳是否出現(xiàn)高電平如果有就退出解碼程序
DJNZ R6, SB;重復(fù)10次,目的是檢測(cè)在8820微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
;以上完成對(duì)遙控信號(hào)的9000微秒的初始低電平信號(hào)的識(shí)別。
JNB P3.2, $ ;等待高電平避開9毫秒低電平引導(dǎo)脈沖
ACALL YS2 ;延時(shí)4.74毫秒避開4.5毫秒的結(jié)果碼
MOV R7,#26;忽略前26位系統(tǒng)識(shí)別碼
JJJJA:JNB P3.2,$;等待地址碼第一位的高電平信號(hào)
LCALL YS1;高電平開始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
MOV C,P3.2;將P3.2引腳此時(shí)的電平狀態(tài)0或1存入C中
JNC UUUA;如果為0就跳轉(zhuǎn)到UUUA
LCALL YS3;檢測(cè)到高電平1的話延時(shí)1毫秒等待脈沖高電平結(jié)束
UUUA: DJNZ R7,JJJJA
MOV R1,#1AH ;設(shè)定1AH為起始RAM區(qū)
MOV R2,#2;接收從1AH到1BH的2個(gè)內(nèi)存,用于存放操作碼和操作反碼
PP: MOV R3,#8;每組數(shù)據(jù)為8位
JJJJ: JNB P3.2,$;等待地址碼第一位的高電平信號(hào)
LCALL YS1;高電平開始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
MOV C,P3.2;將P3.2引腳此時(shí)的電平狀態(tài)0或1存入C中
JNC UUU;如果為0就跳轉(zhuǎn)到UUU
LCALL YS3;檢測(cè)到高電平1的話延時(shí)1毫秒等待脈沖高電平結(jié)束
UUU: MOV A,@R1;將R1中地址的給A
RRC A;將C中的值0或1移入A中的最低位
MOV @R1,A;將A中的數(shù)暫時(shí)存放在R1數(shù)值的內(nèi)存中
DJNZ R3,JJJJ;接收滿8位換一個(gè)內(nèi)存
INC R1;對(duì)R1中的值加1,換下一個(gè)RAM
DJNZ R2,PP ;接收完8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH中
MOV A,1AH
CPL A;對(duì)1AH取反后和1BH比較
CJNE A,1BH,EXIT;如果不等表示接收數(shù)據(jù)發(fā)生錯(cuò)誤,放棄
MOV P1,1AH;將按鍵的鍵值通過P1口的8個(gè)LED顯示出來!
CLR P2.5;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
LCALL YS2
LCALL YS2
LCALL YS2
SETB P2.5;蜂鳴器停止
EXIT: SETB EA ;允許中斷
RETI ;退出解碼子程序
YS1: MOV R4,#20 ;延時(shí)子程序1,精確延時(shí)882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;延時(shí)子程序2,精確延時(shí)4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2;延時(shí)程序3,精確延時(shí)1000微秒
D3:MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
END
這是按照紅外遙控器按鍵的實(shí)際位置給出的32個(gè)按鍵的鍵值(16進(jìn)制)
八、 紅外線電腦遙控器
將燒寫文件燒錄到AT89C51單片機(jī)內(nèi)部后,再將電腦串口連接好帶有擴(kuò)展元件的51實(shí)驗(yàn)板,打開51實(shí)驗(yàn)板電源后,P1.0端口上的LED就會(huì)閃爍,這說明單片機(jī)程序已經(jīng)正常運(yùn)行了,再把紅色的撥碼開關(guān)的第2、第3位開關(guān)打開。
如上圖所示就可以接收紅外遙控編碼了。這時(shí)實(shí)驗(yàn)板就變成了一個(gè)超級(jí)的PC遙控器了。當(dāng)然我們還要借助Grider軟件來實(shí)現(xiàn)。
1.安裝軟件
Grider是國(guó)外一款很優(yōu)秀的免費(fèi)紅外遙控軟件,支持多種的硬件,如紅外鍵盤鼠標(biāo),紅外接收器等,軟件的功能強(qiáng)大有OSD屏顯,名種常用的相關(guān)系統(tǒng)操作如開關(guān)顯示器等等。這里就簡(jiǎn)單介紹一些簡(jiǎn)單的用法。首先要安裝軟件,點(diǎn)擊這里下載Grider3.2,也可到www.grider.nl上下載新版或舊版的。下載完后運(yùn)行。出現(xiàn)下面的畫面:
點(diǎn)NEXT,再到下一畫面:
選上“I accept the agreement”,再按Next,這些都是通常的安裝步驟,不多說,一直按Next,直到出現(xiàn)完成畫面。
然后就可以在“開始”中找到程序并運(yùn)行它了。
2.設(shè)置軟件
運(yùn)行Girder3.2程序后,點(diǎn)擊File菜單->Settings打開設(shè)置窗口
在設(shè)置菜單UserInterface(用戶界面)頁中,選擇設(shè)置中文菜單,再按Apply鍵,這時(shí)程序就變成了中文漢化版的了。
在“常規(guī)”頁中可以設(shè)置是否自動(dòng)加載設(shè)置文件,隨WINDOWS啟動(dòng),啟動(dòng)后只出現(xiàn)在任務(wù)欄而不出現(xiàn)主窗口等等。好了下面的硬件設(shè)置是最重要的。
在插件頁中選中UIR/IRman/IRA.。..。.(選中QuestionOSD就可以使用像電視中的屏顯提示了),選好后你就按設(shè)置彈出下面的畫面
然后按畫面上的設(shè)置進(jìn)行設(shè)置,當(dāng)然串口就選你自己所連接的串口,再把前面一個(gè)畫面中的“自動(dòng)打開輸入設(shè)置”選中就可以了。
3遙控鍵學(xué)習(xí)
在圖中空白處右擊彈出菜單,選添加命令,則新建了一個(gè)命令,可以對(duì)其重命名。
以打開WINAMP為例,在“系統(tǒng)頁”選“執(zhí)行”,按“瀏覽”找到你所安裝的WINAMP的程序文件,這里中文件中有其詳細(xì)路徑,再按“應(yīng)用”,最后按學(xué)習(xí)事件
然后按我們配套的紅外遙控器,軟件就取得了實(shí)驗(yàn)板上發(fā)來的紅外編碼,并在圖中1處顯示。comments是注釋命令有的,圖中2是設(shè)定重復(fù)按鍵的等待時(shí)間,就是說按下一個(gè)鍵執(zhí)行命令后,要等多久才能再次響應(yīng)該鍵。這樣就定義了一個(gè)鍵的命令。軟件功能很強(qiáng)大這里也無法一一說明。自已多使用摸索幾次就可以輕松上手了。
?
評(píng)論
查看更多