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