單片機(jī)匯編語(yǔ)言經(jīng)典一百例.doc
《單片機(jī)匯編語(yǔ)言經(jīng)典一百例.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《單片機(jī)匯編語(yǔ)言經(jīng)典一百例.doc(79頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
51單片機(jī)實(shí)用程序庫(kù) ?? ?4.1 流水燈 程序介紹:利用P1 口通過(guò)一定延時(shí)輪流產(chǎn)生低電平 輸出,以達(dá)到發(fā)光二極管輪流亮的效果。實(shí)際應(yīng)用中例如: 廣告燈箱彩燈、霓虹燈閃爍。 程序?qū)嵗↙AMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;滅所有的燈 MOV A,#11111110B MAIN1: MOV P1,A ;開(kāi)最左邊的燈 ACALL DELAY ;延時(shí) RL A ;將開(kāi)的燈向右邊移 AJMP MAIN ;循環(huán) DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波輸出 程序介紹:P1.0 口輸出高電平,延時(shí)后再輸出低電 平,循環(huán)輸出產(chǎn)生方波。實(shí)際應(yīng)用中例如:波形發(fā)生器。 程序?qū)嵗‵AN.ASM): ORG 0000H MAIN: ;直接利用P1.0口產(chǎn)生高低電平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET END 五、定時(shí)器功能實(shí)例 5.1 定時(shí)1秒報(bào)警 程序介紹:定時(shí)器1每隔1秒鐘將p1.o的輸出狀態(tài)改變1 次,以達(dá)到定時(shí)報(bào)警的目的。實(shí)際應(yīng)用例如:定時(shí)報(bào)警器。 程序?qū)嵗―IN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定時(shí)器0入口 MAIN: TFLA G EQU 34H ;時(shí)間秒標(biāo)志,判是否到50個(gè) 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定時(shí)器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;設(shè)定時(shí)時(shí)間為0.05秒,定時(shí) 20次則一秒 11 SETB EA ;開(kāi)總中斷 SETB ET0 ;開(kāi)定時(shí)器0中斷允許 SETB TR0 ;開(kāi)定時(shí)0運(yùn)行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;設(shè)定時(shí)時(shí)間為0.05秒,定時(shí) 20次則一秒 RETI END 5.2 頻率輸出公式 介紹:f=1/t s51 使用12M晶振,一個(gè)周期是1微秒使用定時(shí)器1 工作于方式0,最大值為65535,以產(chǎn)生200HZ的頻率為 例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一個(gè)高電 12 平或低電平的時(shí)間為2500 微秒。這樣,定時(shí)值應(yīng)設(shè)為 65535-2500=63035,將它轉(zhuǎn)換為十六進(jìn)制則為:F63B。 具體程序請(qǐng)看f200.asm 頻率遞增: 200HZ:63035:F63B 250HZ:63535:F82F 300HZ:63868:F97C 5.3 200HZ頻率輸出 程序介紹:利用定時(shí)器定時(shí),在P1.0 口產(chǎn)生200HZ 的頻率輸出。實(shí)際應(yīng)用例如:傳感器前級(jí)推動(dòng)。 程序?qū)嵗‵200.ASM): ORG 0000H AJMP MAIN ORG 001BH AJMP DIN0 MAIN: CLR P1.0 ;產(chǎn)生一個(gè)低電平,實(shí)際上 是從p1.0口產(chǎn)生頻率 MOV TMOD,#00010000B ;定時(shí)器1工作于方式0 MOV TH1,#0F6H MOV TL1,#3BH ;頻率產(chǎn)生的時(shí)間,詳細(xì)請(qǐng) 見(jiàn)頻率公式 SETB EA ;開(kāi)總中斷 13 SETB TR1 ;開(kāi)定時(shí)器1運(yùn)行 SETB ET1 ;開(kāi)定時(shí)器1允許 LOOP: AJMP LOOP ;無(wú)限循環(huán) DIN0: CPL P1.0 ;產(chǎn)生一個(gè)高電平, 下次來(lái)就是低電平(因?yàn)槿》矗?,一個(gè)高電平和一個(gè)低電平 形成一個(gè)周期 MOV TH1,#0F6H MOV TL1,#3BH ;重置頻率產(chǎn)生時(shí)間 RETI ;返回 END 5.4 200——250HZ變化頻率輸出 程序介紹:利用定時(shí)器定時(shí)時(shí)間的變化,由P1.0 口 產(chǎn)生200——250HZ變化的頻率。實(shí)際應(yīng)用例如:傳感器 前級(jí)推動(dòng)、頻率發(fā)生器。 程序?qū)嵗‵250.ASM): ORG 0000H AJMP MAIN ORG 001BH AJMP DIN1 MAIN: ;定義頻率200和300////////////////////////////////// F2H EQU 30H F2L EQU 31H F3H EQU 32H F3L EQU 33H 14 ;////////////////////////////////////////////////// ;定義頻率保持初值////////////////////////////////// MOV R1,#50 MOV R2,#02H ;////////////////////////////////////////////////// ;頻率賦初值//////////////////////////////////////// MOV F2H,#0F6H MOV F2L,#3BH MOV F3H,#0F8H MOV F3L,#2FH ;////////////////////////////////////////////////// CLR P1.0 ;在P1.0口產(chǎn)生一個(gè)低 電平,一個(gè)脈沖是由一個(gè)高電平和一個(gè)低電平組成的 MOV TMOD,#00010000B ;定時(shí)器工作于方式1 MOV TH1,F2H MOV TL1,F2L ;200HZ輸出 SETB EA ;開(kāi)總中斷 SETB TR1 ;開(kāi)定時(shí)器1運(yùn)行 SETB ET1 ;開(kāi)定時(shí)器1允許 LOOP: AJMP LOOP DIN1: CPL P1.0 ;取反P1.0口,實(shí)際 是為了不斷的將p1.0的電平關(guān)系轉(zhuǎn)換,即產(chǎn)生了頻率 ;頻率保持時(shí)間////////////////////////////////////// DJNZ R1,RE MOV R1,#50 DJNZ R2,RE MOV R2,#02H 15 ;////////////////////////////////////////////////// MOV A,F2H CJNE A,F3H,XIA ;頻率高位到300HZ 的高位了嗎? AJMP JIA ;頻率高位沒(méi)到 300HZ的高位值,直接將低位值加1 XIA: INC F2L MOV A,F2L CJNE A,#00H,RE INC F2H MOV A,F2H CJNE A,F3H,RE ;///////////////////////////////////////////// ;頻率高位加到300HZ的高位值了,低位加一,到300HZ的低 位值了嗎,沒(méi)到出去,到了關(guān)定時(shí)器 JIA: INC F2L ;到了將200HZ頻率的低位加1 MOV A,F2L CJNE A,#F3L,RE CLR TR1 ;///////////////////////////////////////////// RE: MOV TH1,F2H MOV TL1,F2L RETI END 16 六、數(shù)顯 0——9999顯示 程序介紹:利用S51的串行口功能,實(shí)現(xiàn)數(shù)碼管0— —9999 的循環(huán)顯示。實(shí)際應(yīng)用例如:電子計(jì)分牌。 程序?qū)嵗?999.ASM): ORG 0000H MAIN: GEE EQU 30H SHI EQU 31H BEI EQU 32H QIAN EQU 33H ;定義個(gè)十百千 MOV GEE,#00H MOV SHI,#00H MOV BEI,#00H MOV QIAN,#00H ;賦初值 MOV SCON,#00H ;串行口工作于方式 0.同步移位 ;顯示個(gè),十,百,千////////////////////////////////// DISPLAY: ACALL DELAY ;延時(shí) MOV DPTR,#SETTAB MOV A,GEE MOVC A,@A+DPTR MOV SBUF,A D1: JNB TI,D1 17 CLR TI MOV DPTR,#SETTAB MOV A,SHI MOVC A,@A+DPTR MOV SBUF,A D2: JNB TI,D2 CLR TI MOV DPTR,#SETTAB MOV A,BEI MOVC A,@A+DPTR MOV SBUF,A D3: JNB TI,D3 CLR TI MOV DPTR,#SETTAB MOV A,QIAN MOVC A,@A+DPTR MOV SBUF,A D4: JNB TI,D4 CLR TI ;///////////////////////////////////////////// ;個(gè),十,百,千的依次加一///////////////////// INC GEE MOV A,GEE CJNE A,#0AH,DISPLAY MOV GEE,#00H INC SHI MOV A,SHI CJNE A,#0AH,DISPLAY 18 MOV SHI,#00H INC BEI MOV A,BEI CJNE A,#0AH,DISPLAY MOV BEI,#00H INC QIAN MOV A,QIAN CJNE A,#0AH,DISPLAY MOV QIAN,#00H AJMP DISPLAY ;////////////////////////////////////////////////// ;延時(shí)////////////////////////////////////////////// DELAY: MOV R1,#0FFH E1: MOV R2,#0FFH DJNZ R2,$ DJNZ R1,E1 RET ;///////////////////////////////////////////// SETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH, F6H,0EEH,3EH,9CH,7AH,9EH,8EH ;數(shù)顯代碼 END 七、AD 轉(zhuǎn)換 7.1 AD轉(zhuǎn)換(數(shù)碼顯示) 程序介紹:利用ADC0809模擬通道3輸入電壓,經(jīng)單片機(jī) 19 處理后在數(shù)碼管上用相對(duì)應(yīng)的16進(jìn)制數(shù)顯示出來(lái),0—5V對(duì) 應(yīng)為0--0FFH,實(shí)際應(yīng)用例如:數(shù)據(jù)采集。 程序操作:程序?qū)懲晟想娺\(yùn)行后,用本機(jī)配帶的專(zhuān)用起微調(diào) 圖15所示電位器,會(huì)在數(shù)碼管上看到隨不同電壓而變化的對(duì) 應(yīng)16進(jìn)制值。也可以用 萬(wàn)用表實(shí)ADC0809IN3腳 電壓,來(lái)檢驗(yàn)所對(duì)應(yīng)顯 示的16進(jìn)制數(shù)。 圖15 程序?qū)嵗╝d.asm): ORG 0000H MAIN1: ACALL DELAY ;延時(shí) ACALL AD ;呼叫AD子程序 ;將轉(zhuǎn)換的數(shù)字量屏蔽高位低位送顯//////////////////// MOV 31H,30H MOV A,30H ANL A,#0FH MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D1: JNB TI,D1 CLR TI ;////////////////////////////////////////////////// ;將轉(zhuǎn)換的數(shù)字量屏蔽低位高位送顯//////////////////// MOV A,30H 20 ANL A,#0F0H SWAP A MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D2: JNB TI,D2 CLR TI ;////////////////////////////////////////////////// AJMP MAIN1 ;返回主程序 AD: MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址 MOV A,#03H ;指向轉(zhuǎn)換口 MOVX @DPTR,A ;轉(zhuǎn)換 MOV R1,#64H D3: DJNZ R1,D3 ;等100微秒轉(zhuǎn)換完 MOVX A,@DPTR ;轉(zhuǎn)換后的值給A MOV 30H,A ;轉(zhuǎn)換的值給30H RET DELAY: ;延時(shí) MOV R2,#0FFH D14: MOV R3,#0FFH D12: DJNZ R3,D12 DJNZ R2,D14 RET SETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6H DB 0EEH,3EH,9CH,7AH,9EH,8EH 21 7.2 十六進(jìn)制兩位數(shù)加法器(數(shù)碼顯示) 程序介紹:將ADC0809輸入的兩個(gè)不同電壓(相同電 壓也可相加,只是為舉例說(shuō)明,所以取不同電壓)所對(duì)應(yīng) 的16進(jìn)制數(shù)相加顯示出來(lái)。實(shí)際應(yīng)用例如:取代加法運(yùn)放 電路。 程序操作:程序?qū)懲晟想娺\(yùn)行后,用本機(jī)配帶的鐘表 起微調(diào)圖16所示電位器,輸入兩個(gè)不同電壓,數(shù)碼管會(huì)顯 示兩個(gè)不同的對(duì)應(yīng)16進(jìn)制數(shù),隨后數(shù)碼管會(huì)顯示兩個(gè)16 進(jìn)制數(shù)相加的值。 程序?qū)嵗╝dd2.asm): ORG 0000H MAIN: ADNUMBER EQU 30H ;AD轉(zhuǎn)換值 ADDNUMBER EQU 31H ;加數(shù)值1 ADL EQU 32H ;// ADH EQU 33H ;ADL轉(zhuǎn)換高低位值 DISL EQU 34H ;// DISH EQU 35H ;顯示高低位值 ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值 ADDJW EQU 37H ;加法進(jìn)位數(shù) ADDHOLD EQU 38H ;賦初值//////////////////////////////////////////// MOV ADDHOLD,#00H MOV ADDNUMBER,#00H MOV ADL,#00H MOV ADH,#00H MOV DISL,#00H 22 MOV DISH,#00H MOV ADDJW,#00H MOV ADDTOTAL,#00H ;////////////////////////////////////////////////// MAIN1: ACALL AD ;呼叫AD子程序 ACALL DELAY ;延時(shí) ACALL CAIFEN ;呼叫AD值拆分為高 低的程序 ACALL DISPLAY ;呼叫顯示子程序 MOV A,ADNUMBER ;取AD值 CJNE A,ADDHOLD,ADD3 ;與上次AD值比 較,不相等,即輸入了新的AD值,去AD3執(zhí)行 AJMP MAIN1 ;是相等的,證 明沒(méi)有輸入新的AD值,回去顯示老的AD值 ADD3: MOV A,ADDHOLD CJNE A,#00H,ADD4 MOV ADDHOLD,ADNUMBER ;有一種情況就 是是第一次進(jìn)來(lái),AD保持值里面是放的初值00,與取的AD值 不同,是這種情況,也返回去 AJM MAIN1 ADD4: MOV ADDNUMBER,ADDHOLD ;是真的輸入 了新的AD值,將上次AD值給加數(shù),為調(diào)加法程序做準(zhǔn)備 MOV ADDHOLD,ADNUMBER ;將這次的AD 值也保持起來(lái)。準(zhǔn)備與上一個(gè)AD值相加 ;顯示這次輸入的AD值//////////////////////////////// ACALL DELAY ACALL CAIFEN 23 ACALL DISPLAY ;////////////////////////////////////////////////// DISPLAY1: ACALL DELAY ;延時(shí) ACALL ADD1 ;呼叫加法子程序 ACALL DISPLAY ;顯示 LOOP: AJMP LOOP ;返回主程序 ;///////////////////////////////////////AD轉(zhuǎn)換 AD: MOV DPTR,#7F00H;指向轉(zhuǎn)換地址 MOV A,#03H ;指向轉(zhuǎn)換口 MOVX @DPTR,A ;轉(zhuǎn)換 MOV R1,#64H D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完 MOVX A,@DPTR ;轉(zhuǎn)換后的值給A MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H RET ;////////////////////////////////////////////////// ;拆分AD值程序////////////////////////////////////// CAIFEN: MOV A,ADNUMBER ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADNUMBER ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV DISL,ADL 24 MOV DISH,ADH ;給顯示值 RET ;////////////////////////////////////////////////// ;顯示////////////////////////////////////////////// DISPLAY: MOV A,DISL MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D3: JNB TI,D3 CLR TI MOV A,DISH MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D4: JNB TI,D4 CLR TI MOV A,ADDJW MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D5: JNB TI,D5 CLR TI MOV SBUF,#00H D6: JNB TI,D6 CLR TI RET ;////////////////////////////////////////////////// 25 ;加法程序////////////////////////////////////////// ADD1: CLR C MOV A,ADDNUMBER ;取上次AD值 ADDC A,ADDHOLD ;與這次AD值相加 MOV ADDTOTAL,A ;將此次加的值給和 值 JNC ADDJW1 ;有無(wú)進(jìn)位? INC ADDJW ;有進(jìn)位,進(jìn)位值給 ADDJW ADDJW1: ANL A,#0FH MOV DISL,A ;加值取低位 MOV A,ADDTOTAL ANL A,#0F0H SWAP A MOV DISH,A ;加值取高位 RET ;////////////////////////////////////////////////// DELAY: ;延時(shí) MOV R3,#0AH DD1: MOV R1,#0FFH D2 : MOV R2,#0FFH DJNZ R2,$ DJNZ R1,D2 DJNZ R3,DD1 RET SETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 26 0FEH,0F6H DB 0EEH,3EH,9CH,7AH,9EH,8EH END 7.3 軟件濾波 程序介紹(7.31—7.34):您如果接觸過(guò)模電就知道, 在采集電壓量時(shí)經(jīng)常會(huì)碰到干擾,而在模電中經(jīng)常所采用 的方法就是加電容濾波,這是用硬件實(shí)現(xiàn)的。實(shí)際上軟件 完全可以達(dá)到濾波的效果,現(xiàn)在介紹的是一種最經(jīng)典的方 法。在一次電壓量的采集中,在很短的時(shí)間內(nèi)對(duì)它進(jìn)行6 次采集,將它轉(zhuǎn)換為數(shù)字量后求和(7.31),分析出6次 輸入中的最大值和最小值(7.32),然后減去最大值和最 小值(7.33),除以4(7.44)得到平均值。這樣實(shí)際上 就完成了一次軟件濾波。省去了復(fù)雜的硬件,而且取得了 好而精確的效果。實(shí)際應(yīng)用例如:精確數(shù)據(jù)采集。 程序操作:程序?qū)懭肷想娺\(yùn)行后,用本實(shí)驗(yàn)儀自帶的 鐘表起微調(diào)電位器依次輸入6個(gè)電壓量。7.31程序會(huì)顯示 和值,7.32會(huì)繼續(xù)顯示最大和最小值,7.33程序會(huì)繼續(xù)顯 示減后所剩的值,7.34程序會(huì)繼續(xù)顯示除4后的值。 算法說(shuō)明:為什么要選擇取6個(gè)數(shù)進(jìn)行計(jì)算呢?因?yàn)? 在匯編中做計(jì)算是非常麻煩的,取6個(gè)數(shù),減去最大值和 最小值后,取平均值是除4.計(jì)算機(jī)的內(nèi)部計(jì)算都是二進(jìn) 制,而二進(jìn)制每除一個(gè)2,實(shí)際上是向右移一次。所以為 了計(jì)算方便,我們選擇取6個(gè)數(shù),最后在算除法的時(shí)候, 只需要用單片機(jī)自帶的右移位命令移2次就行了。 27 7.31 十六進(jìn)制六位數(shù)加法(數(shù)碼顯示) 程序?qū)嵗?add6.asm): ORG 0000H MAIN: ADNUMBER EQU 30H ;AD轉(zhuǎn)換值 ADDNUMBER EQU 31H ;加數(shù)值1 ADL EQU 32H ;// ADH EQU 33H ;ADL轉(zhuǎn)換高低位值 DISL EQU 34H ;// DISH EQU 35H ;顯示高低位值 ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值 ADDJW EQU 37H ;加法進(jìn)位數(shù) ADDHOLD EQU 38H ADDFLAG EQU 39H ;加標(biāo)志 ENDFLAG EQU 40H ;賦初值//////////////////////////////////////////// MOV ADDHOLD,#00H MOV ADDNUMBER,#00H MOV ADL,#00H MOV ADH,#00H MOV DISL,#00H MOV DISH,#00H MOV ADDJW,#00H MOV ADDFLAG,#00H MOV ENDFLAG,#00H MOV ADDTOTAL,#00H ;////////////////////////////////////////////////// MAIN1: 28 ;顯示AD值////////////////////////////////////////// ACALL DELAY ACALL DELAY ACALL AD MAIN3: ACALL CAIFEN ACALL DISPLAY ;////////////////////////////////////////////////// ;加這次的AD值,并判是否加了六次,是的話就進(jìn)入死循環(huán) ACALL DELAY ACALL ADD1 ACALL DISPLAY INC ADDFLAG MOV A,ADDFLAG CJNE A,#06H,MAIN2 LOOP: AJMP LOOP ;////////////////////////////////////////////////// ;沒(méi)有加到六次,繼續(xù)取值加,如果沒(méi)有來(lái)新AD值,還是去 顯示上次加的值,有新AD值來(lái)了,顯示這次AD值,并加上上 次AD值,顯示/////////////////////////////////////// MAIN2: ACALL DELAY ACALL AD MOV A,ADNUMBER CJN A,ADDTOTAL,MAIN3 AJM MAIN2 ;////////////////////////////////////////////////// ;////////////////////////////////////////////AD轉(zhuǎn)換 AD: 29 MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址 MOV A,#03H ;指向轉(zhuǎn)換口 MOVX @DPTR,A ;轉(zhuǎn)換 MOV R1,#64H D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完 MOVX A,@DPTR ;轉(zhuǎn)換后的值給A MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H RET ;////////////////////////////////////////////////// ;拆分AD值程序////////////////////////////////////// CAIFEN: MOV A,ADNUMBER ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADNUMBER ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV DISL,ADL MOV DISH,ADH ;給顯示值 RET ;////////////////////////////////////////////////// ;顯示////////////////////////////////////////////// DISPLAY: MOV A,DISL MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A 30 D3: JNB TI,D3 CLR TI MOV A,DISH MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D4: JNB TI,D4 CLR TI MOV A,ADDJW MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D5: JNB TI,D5 CLR TI MOV SBUF,#00H D6: JNB TI,D6 CLR TI RET ;////////////////////////////////////////////////// ;加法程序////////////////////////////////////////// ADD1: CLR C MOV ADDTOTAL,ADNUMBER MOV A,ADNUMBER ADDC A,ADDHOLD MOV ADDHOLD,A JNC ADDJW1 INC ADDJW 31 ADDJW1: ANL A,#0FH MOV DISL,A ;加值取低位 MOV A,ADDHOLD ANL A,#0F0H SWAP A MOV DISH,A ;加值取高位 RET ;/////////////////////////////////////////////// DELAY: ;延時(shí) MOV R3,#0AH DD1: MOV R1,#0FFH D2 : MOV R2,#0FFH DJNZ R2,$ DJNZ R1,D2 DJNZ R3,DD1 RET SETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6H DB 0EEH,3EH,9CH,7AH,9EH,8EH END 7.32 求六位和中的最大值和最小值(數(shù)碼顯示) 程序?qū)嵗╝dd61.asm): ORG 0000H MAIN: ADNUMBER EQU 30H ;AD轉(zhuǎn)換值 ADL EQU 32H ;// 32 ADH EQU 33H ;ADL轉(zhuǎn)換高低位值 DISL EQU 34H ;// DISH EQU 35H ;顯示高低位值 ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值 ADDJW EQU 37H ;加法進(jìn)位數(shù) ADDHOLD EQU 38H ADDFLAG EQU 39H ;加標(biāo)志 ENDFLAG EQU 40H ADH1 EQU 41H ;AD中最大的值 ADL1 EQU 42H ;AD中最小的值 ADHOLDH EQU 43H ADHOLDL EQU 44H ;求AD最大值與最小 值時(shí)AD的比較值,即以此兩個(gè)值為比較中轉(zhuǎn) FOUR EQU 45H SUB EQU 46H ;減去高低位后的值 JWHOLD EQU 47H ;保存進(jìn)位值 ;賦初值//////////////////////////////////////////// MOV ADDHOLD,#00H MOV ADL,#00H MOV ADH,#00H MOV DISL,#00H MOV DISH,#00H MOV ADDJW,#00H MOV ADDFLAG,#00H MOV ENDFLAG,#00H MOV ADDTOTAL,#00H MOV ADH1,#00H MOV ADL1,#00H 33 MOV ADHOLDH,#00H MOV FOUR,#00H MOV ADHOLDL,#00H MOV JWHOLD,#00H MOV SUB,#00H ;////////////////////////////////////////////////// MAIN1: ACALL DELAY ACALL DELAY ACALL AD ;取AD值 MAIN3: ACALL CAIFEN ACALL DISPLAY ;顯示 ACALL DELAY ACALL DELAY ;算最大值和最小值////////////////////////////////// ACALL ADDH ACALL ADDL ;////////////////////////////////////////////////// ;加和值顯示/////////////////////////////////////// ACALL ADD1 ACALL DISPLAY ;////////////////////////////////////////////////// ;判是否加到了6次/////////////////////////////////// INC ADDFLAG MOV A,ADDFLAG CJNE A,#06H,MAIN2 ;///////////////////////////////////////////////// ACALL DELAY 34 ACALL DELAY ACALL DELAY ACALL DELAY ACALL DELAY ACALL DELAY ACALL CAIFEN1 ;拆最小值 ACALL CAIFEN2 ;拆最大值 ACALL DISPLAY ;顯示最大值最小值 LOOP: AJMP LOOP ;判有沒(méi)有來(lái)新AD值,沒(méi)有顯示以前,有顯示現(xiàn)在的/////// MAIN2: ACALL DELAY ACALL AD MOV A,ADNUMBER CJNE A,ADDTOTAL,MAIN3 AJMP MAIN2 ;////////////////////////////////////////////////// ;AD轉(zhuǎn)換//////////////////////////////////////////// AD: MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址 MOV A,#03H ;指向轉(zhuǎn)換口 MOVX @DPTR,A ;轉(zhuǎn)換 MOV R1,#64H D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完 MOVX A,@DPTR ;轉(zhuǎn)換后的值給A MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H RET ;////////////////////////////////////////////////// ;拆分AD值程序////////////////////////////////////// 35 CAIFEN: MOV A,ADNUMBER ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADNUMBER ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV DISL,ADL MOV DISH,ADH ;給顯示值 RET ;////////////////////////////////////////////////// ;顯示////////////////////////////////////////////// DISPLAY: MOV A,DISL MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D3: JNB TI,D3 CLR TI MOV A,DISH MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D4: JNB TI,D4 CLR TI MOV A,ADDJW MOV DPTR,#SETTAB 36 MOVC A,@A+DPTR MOV SBUF,A D5: JNB TI,D5 CLR TI MOV A,FOUR MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D6: JNB TI,D6 CLR TI RET ;//////////////////////////////////////////////// ;加法程序//////////////////////////////////////// ADD1: CLR C MOV ADDTOTAL,ADNUMBER MOV A,ADNUMBER ADDC A,ADDHOLD MOV ADDHOLD,A JNC ADDJW1 INC ADDJW ADDJW1: ANL A,#0FH MOV DISL,A ;加值取低位 MOV A,ADDHOLD ANL A,#0F0H SWAP A MOV DISH,A ;加值取高位 RET 37 ;////////////////////////////////////////////////// ;AD值中的最大值//////////////////////////////////// ADDH: MOV A,ADH1 CJNE A,#00H,ADDH1 MOV ADH1,ADNUMBER AJMP RE ADDH1: MOV A,ADNUMBER CLR C SUBB A,ADH1 JC RE MOV ADH1,ADNUMBER RE: RET ;////////////////////////////////////////////////// ;AD值中的最小值//////////////////////////////////// ADDL: MOV A,ADL1 CJNE A,#00H,ADDL1 MOV ADL1,ADNUMBER AJMP RE1 ADDL1: MOV A,ADNUMBER CLR C SUBB A,ADL1 JNC RE1 MOV ADL1,ADNUMBER RE1: RET ;////////////////////////////////////////////////// ;分解AD最小值的個(gè),十位//////////////////////////// 38 CAIFEN1: MOV A,ADL1 ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADL1 ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV DISL,ADL MOV DISH,ADH ;給顯示值 RET ;///////////////////////////////////////////// ;分解AD最大值的個(gè),十位/////////////////////// CAIFEN2: MOV A,ADH1 ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADH1 ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV JWHOLD,ADDJW MOV ADDJW,ADL MOV FOUR,ADH ;給顯示值 RET ;////////////////////////////////////////////////// DELAY: ;延時(shí) MOV R3,#0AH 39 DD1: MOV R1,#0FFH D2 : MOV R2,#0FFH DJNZ R2,$ DJNZ R1,D2 DJNZ R3,DD1 RET ;////////////////////////////////////////////////// SETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6H DB 0EEH,3EH,9CH,7AH,9EH,8EH END 7.33 求減去最大和最小值后的值(數(shù)碼顯示) 程序?qū)嵗╝dd62.asm) ORG 0000H MAIN: ADNUMBER EQU 30H ;AD轉(zhuǎn)換值 ADL EQU 32H ;// ADH EQU 33H ;ADL轉(zhuǎn)換高低位值 DISL EQU 34H ;// DISH EQU 35H ;顯示高低位值 ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值 ADDJW EQU 37H ;加法進(jìn)位數(shù) ADDHOLD EQU 38H ADDFLAG EQU 39H ;加標(biāo)志 ENDFLAG EQU 40H ADH1 EQU 41H ;AD中最大的值 40 ADL1 EQU 42H ;AD中最小的值 ADHOLDH EQU 43H ADHOLDL EQU 44H ;求AD最大值與最小 值時(shí)AD的比較值,即以此兩個(gè)值為比較中轉(zhuǎn) FOUR EQU 45H SUB EQU 46H ;減去高低位后的值 JWHOLD EQU 47H ;保存進(jìn)位值 ;賦初值/////////////////////////////////////////// MOV ADDHOLD,#00H MOV ADL,#00H MOV ADH,#00H MOV DISL,#00H MOV DISH,#00H MOV ADDJW,#00H MOV ADDFLAG,#00H MOV ENDFLAG,#00H MOV ADDTOTAL,#00H MOV ADH1,#00H MOV ADL1,#00H MOV ADHOLDH,#00H MOV FOUR,#00H MOV ADHOLDL,#00H MOV JWHOLD,#00H MOV SUB,#00H ;////////////////////////////////////////////////// MAIN1: ACALL DELAY ACALL DELAY 41 ACALL AD ;取AD值 MAIN3: ACALL CAIFEN ACALL DISPLAY ;顯示 ACALL DELAY ACALL DELAY ;算最大值和最小值////////////////////////////////// ACALL ADDH ACALL ADDL ;////////////////////////////////////////////////// ;加和值顯示/////////////////////////////////////// ACALL ADD1 ACALL DISPLAY ;///////////////////////////////////////////////// ;判是否加到了6次////////////////////////////////// INC ADDFLAG MOV A,ADDFLAG CJNE A,#06H,MAIN2 ;////////////////////////////////////////////////// ACALL DELAY ACALL DELAY ACALL DELAY ACALL DELAY ACALL DELAY ACALL DELAY ACALL CAIFEN1 ;拆最小值 ACALL CAIFEN2 ;拆最大值 ACALL DISPLAY ;顯示最大值最小值 ACALL DELAY 42 ACALL DELAY ACALL JIAN1 ;呼叫減最大值最小 值程序 ACALL CAIFEN3 ;拆分 ACALL DISPLAY ;顯示減去最大值最 小值后的值 ACALL DELAY ACALL DELAY ACALL DELAY LOOP: AJMP LOOP ;判有沒(méi)有來(lái)新AD值,沒(méi)有顯示以前,有顯示現(xiàn)在的/// MAIN2: ACALL DELAY ACALL AD MOV A,ADNUMBER CJNE A,ADDTOTAL,MAIN3 AJMP MAIN2 ;///////////////////////////////////////////////// ;AD轉(zhuǎn)換/////////////////////////////////////////// AD: MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址 MOV A,#03H ;指向轉(zhuǎn)換口 MOVX @DPTR,A ;轉(zhuǎn)換 MOV R1,#64H D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完 MOVX A,@DPTR ;轉(zhuǎn)換后的值給A MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H RET 43 ;////////////////////////////////////////////////// ;拆分AD值程序////////////////////////////////////// CAIFEN: MOV A,ADNUMBER ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADNUMBER ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV DISL,ADL MOV DISH,ADH ;給顯示值 RET ;////////////////////////////////////////////////// ;顯示////////////////////////////////////////////// DISPLAY: MOV A,DISL MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D3: JNB TI,D3 CLR TI MOV A,DISH MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D4: JNB TI,D4 CLR TI 44 MOV A,ADDJW MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D5: JNB TI,D5 CLR TI MOV A,FOUR MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,A D6: JNB TI,D6 CLR TI RET ;///////////////////////////////////////////// ;加法程序///////////////////////////////////// ADD1: CLR C MOV ADDTOTAL,ADNUMBER MOV A,ADNUMBER ADDC A,ADDHOLD MOV ADDHOLD,A JNC ADDJW1 INC ADDJW ADDJW1: ANL A,#0FH MOV DISL,A ;加值取低位 MOV A,ADDHOLD ANL A,#0F0H 45 SWAP A MOV DISH,A ;加值取高位 RET ;///////////////////////////////////////////////// ;AD值中的最大值/////////////////////////////////// ADDH: MOV A,ADH1 CJNE A,#00H,ADDH1 MOV ADH1,ADNUMBER AJMP RE ADDH1: MOV A,ADNUMBER CLR C SUBB A,ADH1 JC RE MOV ADH1,ADNUMBER RE: RET ;////////////////////////////////////////////////// ;AD值中的最小值//////////////////////////////////// ADDL: MOV A,ADL1 CJNE A,#00H,ADDL1 MOV ADL1,ADNUMBER AJMP RE1 ADDL1: MOV A,ADNUMBER CLR C SUBB A,ADL1 JNC RE1 MOV ADL1,ADNUMBER 46 RE1: RET ;////////////////////////////////////////////////// ;分解AD最小值的個(gè),十位//////////////////////////// CAIFEN1: MOV A,ADL1 ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADL1 ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV DISL,ADL MOV DISH,ADH ;給顯示值 RET ;///////////////////////////////////////////////// ;分解AD最大值的個(gè),十位/////////////////////////// CAIFEN2: MOV A,ADH1 ANL A,#0FH MOV ADL,A ;取低位 MOV A,ADH1 ANL A,#0F0H SWAP A MOV ADH,A ;取高位 MOV JWHOLD,ADDJW MOV ADDJW,ADL MOV FOUR,ADH ;給顯示值 RET 47 ;////////////////////////////////////////////////// ;分解減去最高位和最低位的數(shù)//////////////////////// CAIFEN3: MO- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
32 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 單片機(jī) 匯編語(yǔ)言 經(jīng)典 一百
鏈接地址:http://www.820124.com/p-1576145.html