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