您的位置:網(wǎng)站首頁 > 電器維修資料網(wǎng) > 正文 >
會造句就會編程-編程技巧
來源: 日期:2013-11-12 11:54:07 人氣:標簽:
我們以智能紅外干手機為例,介紹其編程技巧。此智能紅外干手機線路簡捷明快,能很方便地利用程序來解決抗干擾問題,若改變負.載,可實現(xiàn)其它控制。本文還要講一下累加器a“為零轉(zhuǎn)移”和“非零轉(zhuǎn)移”等指令,并作必要的程序執(zhí)行結(jié)果分析,提高大家的編程能力。
1、工作原理
電原理見下圖。該系統(tǒng)主要由at89c2051、6mhz晶振及簡單的輸入輸出等器件組成。圖中經(jīng)r2、r8分壓后使pl.0的電壓為0.5v。此電壓作為輸入檢測基準。系統(tǒng)上電復位后進行初始化,先向p1.3送高電位,于是,光耦ic2截止,使vt1亦截止,可控硅ks1關(guān)斷,切斷執(zhí)行負截的電源,電熱絲rll和風扇yd不工作。然后向p1.2送低電位,使vd1導通發(fā)射紅外線。此時調(diào)用檢測子程序檢測片內(nèi)比較器輸出端p3.6的電位。如果有人靠近,vd1發(fā)射的紅外線就會被反射到vd2的接收窗口上,使vd2的電阻變小,導致vt2發(fā)射極電流增大,r9上的壓降便升高。當其值超過0.5v時,pl.l的電位高于pl.0的電位,at89c2051內(nèi)部比較器輸出端p3.6的狀態(tài)發(fā)生跳變,呈低電位,否則呈高電位。這樣,檢測到p3.6呈低電位,就可判斷vd2接收到了紅外光。為區(qū)別干擾信號,還需關(guān)掉vd1,再進行檢測。向p1.2送高電位,使vd1截止,不再發(fā)射紅外線。
此時,因vd2收不vd1發(fā)出的紅外線而截止,使pl.l的電壓遠小于0.5v,即pl.l的電位低于pl.0的電位。因此,檢測p3.6應(yīng)為高電位。此時若檢測到p3.6為低電位,說明vd2仍然受到紅外線的照射,此紅外線一定是干擾信號。這樣就把正確動作信號和干擾信號區(qū)別開了。
編程時采用多次采樣比較的方式,判斷無誤后再執(zhí)行清位p1.3,向p1.3送低電位使光耦ic2導通,推動vt1飽和,觸發(fā)ks1導通,使yd和rll通電。風扇yd將電熱絲產(chǎn)生的熱量送出。這樣,整個系統(tǒng)就十分可靠了。hd、vd3、vd4、vd5、用作狀態(tài)提示或指示。上電和完成一次開關(guān)動作返回時,hd都要發(fā)出樂聲;進入等待狀態(tài)后,vd3以1hz的頻率閃爍作為等待狀態(tài)指示。當有人靠近時,vd4、vd5同時點亮使之呈黃色表示準備動作;當人的靠近時間超過0.5秒時,系統(tǒng)即確認為有效靠近,接通負載,并使vd4、vd5輸流導通,使之交替變換紅色和綠色。有效靠近解除,系統(tǒng)仍使負載延遲通電3秒,之后才返回等待狀態(tài)。此線路無需調(diào)試,只要焊接正確,編好程序后,上電即能可靠運行。
2、程序分析
由于主程序是從003bh處開始安放的,所以,在程序存貯區(qū)的ooooh至0002h的這三個單元內(nèi)要安放一條轉(zhuǎn)移指令:“轉(zhuǎn)移ql”,用以引導cpu復位后無條件地跳轉(zhuǎn)到003bh處去執(zhí)行程序。因此,ooooh至0002h中應(yīng)寫入機器碼02003bho初始化過程由ql至q2共5條指令組成,“送數(shù)pl,#ffh”和“送數(shù)p3,#ffh”,使圖1中ic1的“2、3、6、7、8、9、11”和“12、13、14、15、16、17、18、19”引腳呈高電位,這樣vd1、vd3、vd4.5都不發(fā)光,ks1截止,使yd和rll.斷電,整個系統(tǒng)的負載皆不工作。“送數(shù)sp.#30h”,其結(jié)果是修改了堆棧指針,使壓棧數(shù)據(jù)從片內(nèi)ram的31h開始壓入。有關(guān)堆棧的作用將在以后的智能產(chǎn)品開發(fā)中說明。“送數(shù)20h,#ooh”,是為檢測系統(tǒng)有無人員靠近情況作準備的,我們將片內(nèi)ram的20h單元作為靠近情況,記錄單元,知果無靠近情況,20h中的內(nèi)容為#ooh,如果有靠近情況20h中的內(nèi)容則為#ffh,此記錄是由檢測子程序來完成的(單片機內(nèi)部有一些標志位是可以供用戶作記錄使用的,但在此文中不做說明)。因此,在系統(tǒng)上電后調(diào)用檢測子程序前必須將其清零,以擦除以往或錯誤的記錄。“調(diào)用qs1”能使hd發(fā)出一段樂音,提示系統(tǒng)初始化完成,然后送上指示燈閃爍時間常數(shù),使指示燈能間歇發(fā)光,以作系統(tǒng)正常工作的指示。q3至q8中的大部分指令我們已經(jīng)學過,下面重點分析一下指令“非零轉(zhuǎn)移”的操作過程。初始化并設(shè)置好閃爍常數(shù)以后,系統(tǒng)執(zhí)行q6調(diào)用檢測子程序qj1,然后再檢查是否有靠近記錄。由于在程序中是將靠近情況記錄在20h之中的,所以,每每調(diào)用檢測子程序以后,只要對20h的內(nèi)容進行判斷就行了。如果20h中的內(nèi)容為零,說明該時間內(nèi)無人靠近系統(tǒng);如果20h中的內(nèi)容為非零(#ffh),說明有人靠近系統(tǒng),應(yīng)立即轉(zhuǎn)去判斷靠近時間的長短,以確認該次靠近是否為有效靠近,繼而確定是否通電輸出熱風。而20h中的內(nèi)容是否為零,cpu是不能直接對其進行判斷的。必須將其傳送到累加器a中才行。所以,q7:“傳數(shù)a,20h”一句,就將20h單元內(nèi)所存的數(shù)據(jù)傳遞到累加器a中,這和以前講過的的送數(shù)是有一點區(qū)別的。
q8就是判斷a中的數(shù)據(jù)是否為零的指令。“非零轉(zhuǎn)移”被操作的對象是累加器ao如果a中的數(shù)據(jù)不為零,就轉(zhuǎn)移至指令中指出的目的地址;如果a中的數(shù)據(jù)為零,就接著執(zhí)行下面的轉(zhuǎn)序。“非零轉(zhuǎn)移”的指令代碼是70h,后面的字節(jié)指出了轉(zhuǎn)移量。如上述“q6,非零轉(zhuǎn)移q16”的機器碼是7017h。其執(zhí)行結(jié)果是,如果a中的數(shù)據(jù)不為零,說明有靠近情況發(fā)生,就向下轉(zhuǎn)移17h個字節(jié),也就是由0056h-下子跳轉(zhuǎn)到了006eh空間去,進行靠近時間長短的判斷;如果a中的數(shù)據(jù)為零,說明沒有靠近情況發(fā)生,接著執(zhí)行0057h以下的程序,進行閃爍指示并進行下一輪調(diào)用檢測子程序和對檢測結(jié)果進行判斷的過程。明白了“非零轉(zhuǎn)移”,“為零轉(zhuǎn)移”也就理解了,其它程序的操作結(jié)果,大家可根據(jù)工作原理和程序注釋來分析。
3、程序流程圖(見下圖)。
4、程序清單
【看看這篇文章在百度的收錄情況】