51程式請教 |
答題得分者是:aki
|
HS_yap
一般會員 發表:1 回覆:2 積分:0 註冊:2009-03-07 發送簡訊給我 |
|
aki
版主 發表:30 回覆:696 積分:755 註冊:2004-01-15 發送簡訊給我 |
寫微電腦的軟體是要配合硬體來寫,沒有硬體的電路,軟體可是不知道要怎麼寫?
7 segment 是有 8051 的範例與 Sourc code 的耐心的找吧! 我建議從坊間 8051 的書內就有範例與 Source code. (1) 例說89S51-C語言 作者:張義和、王敏男、許宏昌、余春長 出版社:新文京 (C129) 出版日期:2007年05月20日 語言:繁體中文 ISBN:9789861506180 裝訂:平裝 (2) C 與 8051 單晶片實務設計-使用 Keil C》/賴麒文 書號:P6297 頁數:約 728 頁 ISBN:978-986-125-8 附件:光碟片 出版日期:2007年01月26日 出版廠商:文魁資訊股份有限公司 定價:560 售價:448 書理有詳盡的電路及軟體寫法解說. ===================引 用 HS_yap 文 章=================== 各位大大...小弟是新手! 想問如何用8051寫一個超音波測距的程式... 要把資料顯示在七段顯示器上! 再網絡上找的都是顯示在LCM的! 請問各位大大能否提供一些程式讓小弟參考! 小弟感激不盡! |
HS_yap
一般會員 發表:1 回覆:2 積分:0 註冊:2009-03-07 發送簡訊給我 |
|
aki
版主 發表:30 回覆:696 積分:755 註冊:2004-01-15 發送簡訊給我 |
|
aki
版主 發表:30 回覆:696 積分:755 註冊:2004-01-15 發送簡訊給我 |
你想秀資料於 7 segment 上,如貼圖,秀的是溫度,
用 MicroChip PIC 16F7xx 寫的, 其實是參考 8051 Keil C 的範例改寫的. 我不知道貼圖出來嗎? http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=97534 http://delphi.ktop.com.tw/download/upload/49b8dd7d3ebd5_DSC06785.JPG ===================引 用 HS_yap 文 章=================== 各位大大...小弟是新手! 想問如何用8051寫一個超音波測距的程式... 要把資料顯示在七段顯示器上! 再網絡上找的都是顯示在LCM的! 請問各位大大能否提供一些程式讓小弟參考! 小弟感激不盡! |
HS_yap
一般會員 發表:1 回覆:2 積分:0 註冊:2009-03-07 發送簡訊給我 |
以下是我在網上找到的程式...
但不知怎麽改成用七段顯示... ;腳位描述: ;P0.0 = LCM D0 P1.0 = 距離修正x1 1 P2.0 = NC P3.0 = NC ;P0.1 = LCM D1 P1.1 = 距離修正x1 2 P2.1 = NC P3.1 = TEST SW ;P0.2 = LCM D2 P1.2 = 距離修正x1 4 P2.2 = NC P3.2 = ALM SP ;P0.3 = LCM D3 P1.3 = 距離修正x1 8 P2.3 = NC P3.3 = TEST LED ;P0.4 = LCM D4 P1.4 = 距離修正x10 1 P2.4 = NC P3.4 = NC ;P0.5 = LCM D5 P1.5 = 距離修正x10 2 P2.5 = LCM_E P3.5 = NC ;P0.6 = LCM D6 P1.6 = 距離修正x10 4 P2.6 = LCM_RW P3.6 = OSC CONT ;P0.7 = LCM D7 P1.7 = 距離修正x10 8 P2.7 = LCM_RS P3.7 = SINGLE IN ;R0 = ;R1 = ;R2 = ;R3 = ;R4 = ;R5 = ;R6 = ;R7 = 通用暫存器 ;20H = 顯示距離用 仟公分 ;21H = 顯示距離用 百公分 ;22H = 顯示距離用 拾公分 ;23H = 顯示距離用 個公分 ;24H = ;25H = ;26H = ;27H = ;28H = ;29H = ;2AH = ;2BH = ;2CH = ;2DH = ;2EH = ;2FH = ;---------------------------------------- SYMBOLS ON ;起動符號除錯檔 LCM_E .REG P2.5 ;P2.5 = LCM E LCM_RW .REG P2.6 ;P2.6 = LCM RW LCM_RS .REG P2.7 ;P2.7 = LCM RS TEST_SW .REG P3.1 ;P3.1 = TEST SW ALM_SP .REG P3.2 ;P3.2 = SP TEST_LED .REG P3.3 ;P3.3 = TEST LED OSC_CONT .REG P3.6 ;P3.6 = OSC CONT SINGLE_IN .REG P3.7 ;P3.7 = SINGLE IN ;-------------------------------- ORG 0000H ;程式起點 LJMP MAIN ;GO 主程式 ;-------------------------------- ;# T1 中斷服務副程式 ;-------------------------------- ORG 001BH ;T1 中斷起點 LCALL T1_INT ;T1 中斷服務副程式 RETI ;中斷返回 ;---------------------------------------------------------- ;# 主程式區由此開始 ;---------------------------------------------------------- MAIN: LCALL SET_IO ;I/O PORT 初值設定 LCALL INIT_LCM ;LCM 初值化,2 行,8 BIT,AC = 0 LCALL LCM_TEST_OK ;LCM 顯示 LCM TEST OK ! LCALL SET_T0_T1 ;設定 T0 = 65.536MS LCALL LCM_STANDBY ;LCM 顯示 DEVICE STANDBY ! MAIN_L: LCALL D_1S ;延時 1SEC JNB TEST_SW,MAIN_N ;TEST SW = L,GO MAIN_N LCALL TEST_DISCONT ;測距離 LCALL SP_DIS ;蜂鳴器鳴叫 LCALL D_1S ;延 1 SEC LJMP MAIN_L ;GO MAIN_L MAIN_N: LCALL TEST_LED_ON ;TEST LED 亮 LCALL OSC_ON ;555 開始振盪 JNB TEST_SW,$ ;TEST_SW = L,等待放開 LCALL OSC_OFF ;TEST_SW = H,555 停止震盪 LCALL TEST_LED_OFF ;TEST LED 熄 LJMP MAIN_L ;GO MAIN_L ;---------------------------------------------------------- ; 副程式區由此開始 ;---------------------------------------------------------- ;# T1 中斷服務副程式 ;# 每隔 R1 X 20MS 反相一次 ALM_SP ;-------------------------------- T1_INT: MOV TH1,#>(65536 - 20000);┐20MS MOV TL1,#<(65536 - 20000);┘ DEC R2 ;R2 - 1 CJNE R2,#FFH,T1_INT_O ;R2 <> FFH,GO T1_INT_O MOV A,R1 ;ACC = R1 MOV R2,A ;R2 = ACC = R1 CPL ALM_SP ;ALM_SP 反相 T1_INT_O: RET ;返回 ;-------------------------------- ;# I/O PORT 初值設定 ;-------------------------------- SET_IO: SETB TEST_SW ;TEST_SW = H(設為輸入) SETB ALM_SP ;ALM SP = H(OFF) LCALL TEST_LED_OFF ;TEST_LED = L(LED 熄) LCALL OSC_OFF ;OSC_CONT = L(OSC OFF) SETB SINGLE_IN ;SINGLE_IN = H(設為輸入) SETB LCM_RS ;LCM RS = H CLR LCM_RW ;LCM_RW = L CLR LCM_E ;LCM E = L RET ;返回 ;-------------------------------- ;# LCM 初值化,2 行,8 BIT,AC = 0 ;-------------------------------- INIT_LCM: LCALL D_2MS ;延時 2MS MOV A,#38H ;┐ LCALL WRINS ;│1 行 = 30H,2 行=38H MOV A,#38H ;│ LCALL WRINS ;│LCM 為 2 行顯示, MOV A,#38H ;│8 位元介面,5X7 點字形 LCALL WRINS ;│ LCALL LCM_OFF ;LCM OFF LCALL LCM_RAM_CLR ;LCM RAM 填入 ASCII 碼 20H LCALL LCM_AC_1 ;LCM 每收一筆資料後 AC 1 LCALL LCM_ON ;LCM ON LCALL CURSOR_OFF ;LCM CURSOR OFF LCALL CURSOR_1_1 ;LCM CURSOR 第 1 列第 1 行 RET ;返回 ;-------------------------------- ;# LCM ON ;-------------------------------- LCM_ON: MOV A,#0CH ;ACC = 0CH LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# LCM OFF ;-------------------------------- LCM_OFF: MOV A,#08H ;ACC = 08H LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# LCM RAM 填入 ASCII 碼 20H ;-------------------------------- LCM_RAM_CLR: MOV A,#01H ;ACC = 01H LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# LCM 每收一筆資料後 AC 1 ;-------------------------------- LCM_AC_1: MOV A,#06H ;ACC = 06H LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# LCM CURSOR ON ;-------------------------------- CURSOR_ON: MOV A,#0EH ;ACC = 0EH LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# LCM CURSOR OFF ;-------------------------------- CURSOR_OFF: MOV A,#0CH ;ACC = 0CH LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# LCM CURSOR FLASH ;-------------------------------- CURSOR_FLASH: MOV A,#0FH ;ACC = 0FH LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# 游標指向第 1 列第 1 字 ;-------------------------------- CURSOR_1_1: MOV A,#10000000B ;游標歸位至第 1 列第 1 個字元 LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# 游標指向第 2 列第 1 字 ;-------------------------------- CURSOR_2_1: MOV A,#11000000B ;游標歸位至第 2 列第 1 個字元 LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# 游標指向第 2 列第 9 字 ;-------------------------------- CURSOR_2_9: MOV A,#11001000B ;游標歸位至第 2 列第 9 個字元 LCALL WRINS ;將指令碼寫入 LCM RET ;返回 ;-------------------------------- ;# 將指令碼寫入 LCM ;-------------------------------- WRINS: CLR LCM_RS ;RS = 0 CLR LCM_RW ;R/W = 0 CLR LCM_E ;E = 0 SETB LCM_E ;E = 1 MOV P0,A ;P0 = ACC = 指令碼送到 LCM DB0 - DB7 CLR LCM_E ;E = 0 LCALL D_2MS ;延時 2MS RET ;返回 ;-------------------------------- ;# 將字串送到 LCM 中 ;-------------------------------- WR_LCM_STR: PUSH 7 ;R7 推入堆疊 MOV R7,#00H ; ┐ WR_LCM_STR_L: ; │ MOV A,R7 ; │ MOVC A,@A DPTR ; │ CJNE A,#10H,WR_LCM_STR_N ; │將 RAM ?0H - ?FH 之字元碼 逐一送出 POP 7 ; │ RET ; │ WR_LCM_STR_N: ; │ LCALL WR_DATA_LCM ; │ INC R7 ; │ LJMP WR_LCM_STR_L ; ┘ ;-------------------------------- ;# 將 R0 所指起始位址 RAM 共 R7 個送到LCM ;-------------------------------- WR_R0_R7_LCM: MOV A,@R0 ;ACC = R0 所指內部 RAM 位址內容 DJNZ R7,WR_R0_R7_N ;R7 - 1 > 0,GO WR_R0_R7_N RET ;返回 WR_R0_R7_N: LCALL WR_DATA_LCM ;將資料寫入 LCM INC R0 ;R0 1 LJMP WR_R0_R7_LCM ;GO WR_R0_R7_LCM ;-------------------------------- ;# 將資料送入 LCM ;-------------------------------- WR_DATA_LCM: SETB LCM_RS ;RS = 1 CLR LCM_RW ;R/W = 0 CLR LCM_E ;E = 0 SETB LCM_E ;E = 1 MOV P0,A ;P0 = ACC = 指令碼送到 LCM DB0 - DB7 CLR LCM_E ;E = 0 LCALL D_80US ;延時 80US RET ;返回 ;-------------------------------- ;# "SUPERWAVE LENGTH" ;# "TEST.LCM TEST OK" ;-------------------------------- LCM_TEST_OK: LCALL CURSOR_1_1 ;游標指向第 1 列第 1 字 MOV DPTR,#LCM_STR1 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 LCALL CURSOR_2_1 ;游標指向第 2 列第 1 字 MOV DPTR,#LCM_STR2 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 RET ;返回 ;-------------------------------- ;# "STANDBY! " ;# "LENGTH = CM " ;-------------------------------- LCM_STANDBY: LCALL CURSOR_1_1 ;游標指向第 1 列第 1 字 MOV DPTR,#LCM_STR3 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 LCALL CURSOR_2_1 ;游標指向第 2 列第 1 字 MOV DPTR,#LCM_STR4 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 RET ;返回 ;-------------------------------- ;# "DISTANCE TEST..." ;-------------------------------- LCM_TEST: LCALL CURSOR_1_1 ;游標指向第 1 列第 1 字 MOV DPTR,#LCM_STR5 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 RET ;返回 ;-------------------------------- ;# "DISTANCE OVER..." ;# "LENGTH = ??? CM " ;-------------------------------- LCM_OVER: LCALL CURSOR_1_1 ;游標指向第 1 列第 1 字 MOV DPTR,#LCM_STR6 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 LCALL CURSOR_2_1 ;游標指向第 2 列第 1 字 MOV DPTR,#LCM_STR7 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 RET ;返回 ;-------------------------------- ;# 遮沒無效 0 ;-------------------------------- CLR_NO_ZERO: MOV R7,#00H ;R7 = 0 MOV R0,#20H ;R0 = 20H CLR_NO_ZERO_L: MOV A,@R0 ;ACC = R0 所指內部 RAM 位址內容 CJNE A,#30H,CLR_NO_ZERO_O;ACC <> 30H,GO CLR_NO_ZERO_O MOV A,#20H ;ACC = 30H,ACC = 20H MOV @R0,A ;R0 所指內部 RAM 位址內容 = ACC INC R0 ;R0 1 INC R7 ;R7 1 CJNE R7,#23H,CLR_NO_ZERO_L;R7 <> 23H,GO CLR_NO_ZERO_L CLR_NO_ZERO_O: RET ;返回 ;-------------------------------- ;# 將距離值寫到 LCM 第 2 列 9,10,11,12 位址 ;-------------------------------- WR_LENGTH_LCM: LCALL CURSOR_2_9 ;游標指向第 2 列第 9 字 MOV R0,#20H ;R0 = 20H MOV R7,#05H ;R7 = 5 LCALL WR_R0_R7_LCM ;將R0 所指起始位址RAM 共R7 個送 到 LCM RET ;返回 ;-------------------------------- ;# 設定 T0 MODE 1(65.5536MS) ;-------------------------------- SET_T0_T1: MOV TMOD,#00010001B ;T0 = MODE 1,T1 = MODE2 MOV TH0,#0 ;┐65.536MS MOV TL0,#0 ;┘ MOV TH1,#>(65536 - 20000);┐50MS MOV TL1,#<(65536 - 20000);┘ SETB EA ;中斷源致能 SETB ET1 ;T1 中斷致能 RET ;返回 ;-------------------------------- ;# 測距離 T > 3.58MS(62CM~840CM 實測有效距離) ;-------------------------------- TEST_DISCONT: CLR TR1 ;T1 OFF SETB ALM_SP ;ALM SP OFF LCALL TEST_LED_ON ;TEST_LED ON LCALL CLR_RAM ;RAM 20H - 23H = 30 LCALL LCM_TEST ;LCM 顯示測試中 LCALL D_2MS ;延時 2MS LCALL OSC_ON ;555 開始振盪 SETB TR0 ;T0 ON LCALL D_250US ;延時 250US LCALL OSC_OFF ;555 停止震盪 LCALL D_2500US ;延時 3.25MS TEST_L: JNB SINGLE_IN,TEST_N1 ;SINGLE IN = L,GO TEST_N1 JNB TF0,TEST_L ;SINGLE IN = H,TF0 = 0,GO TEST_L CLR TF0 ;TF0 = 1,TF0 = 0,超過距離(> 1130 CM) CLR TR0 ;T0 OFF LCALL LCM_OVER ;LCM 顯示 OVER LCALL D_1S ;延時 1S LCALL LCM_STANDBY ;LCM 顯示 STANDBY LJMP TEST_O ;GO TEST_O TEST_N1: LCALL CHK_L_10US ;檢查 SINGLE IN = L 超過 10US ? JNZ TEST_L ;ACC <> 0(假信號),GO TEST_L CLR TR0 ;ACC = 0,T0 OFF LCALL CONV_T0_RAM ;轉換 T0 值到 RAM 20H - 23H(除 58) LCALL CLR_NO_ZERO ;遮沒無效 0 LCALL WR_LENGTH_LCM ;將距離值寫到 LCM 第2 列10~13 字位址 LCALL TEST_LED_OFF ;TEST LED 熄 LCALL CURSOR_1_1 ;游標指向第 1 列第 1 字 MOV DPTR,#LCM_STR3 ;DPTR 指向欲顯示字串之起始位址 LCALL WR_LCM_STR ;將字串送到 LCM 中 TEST_O: MOV TH0,#0 ;┐65.536MS MOV TL0,#0 ;┘ RET ;返回 ;-------------------------------- ;# 蜂鳴器鳴叫 ;-------------------------------- SP_DIS: MOV A,22H ;ACC = RAM 22H ANL A,#0FH ;ACC 保留低四位元組 MOV R1,A ;R1 = ACC MOV A,21H ;ACC = RAM 21H ANL A,#0FH ;ACC 保留低四位元組 MOV B,#10 ;B = 10 MUL AB ;ACC * B(10) ADD A,R1 ;ACC R1 MOV R1,A ;R1 = ACC MOV A,20H ;ACC = RAM 20H ANL A,#0FH ;ACC 保留低四位元組 MOV B,#100 ;B = 100 MUL AB ;ACC * B(100) ADD A,R1 ;ACC R1 CLR C ;C = 0 SUBB A,#05H ;ACC - 5 - C MOV R1,A ;R1 = ACC MOV R2,A ;R2 = ACC = R1 CLR ALM_SP ;ALM_SP ON SETB TR1 ;T1 ON RET ;返回 ;-------------------------------- ;# RAM 20H - 23H = 30 ;-------------------------------- CLR_RAM: MOV 20H,#30H ;RAM 20H = 30H MOV 21H,#30H ;RAM 21H = 30H MOV 22H,#30H ;RAM 22H = 30H MOV 23H,#30H ;RAM 23H = 30H RET ;返回 ;-------------------------------- ;# TEST LED 亮 ;-------------------------------- TEST_LED_ON: CLR TEST_LED ;TEST LED 亮 RET ;返回 ;-------------------------------- ;# TEST LED 熄 ;-------------------------------- TEST_LED_OFF: SETB TEST_LED ;TEST LED 熄 RET ;返回 ;-------------------------------- ;# 555 輸出 40KHZ 方波 ;-------------------------------- OSC_ON: SETB OSC_CONT ;OSC CONT = H,555 致能 RET ;返回 ;-------------------------------- ;# 555 輸出 OFF ;-------------------------------- OSC_OFF: CLR OSC_CONT ;OSC CONT = L,555 除能 RET ;返回 ;-------------------------------- ;# 檢查 SINGLE IN = L 超過 10US ? ;# SINGLE IN = L > 10US ACC = 00H ;# SINGLE IN = L < 10US ACC = FFH ;-------------------------------- CHK_L_10US: NOP ;延時 1US NOP ;延時 1US JNB SINGLE_IN,CHK_L_10US_O;SINGLE_IN = L,GO CHK_L_10US_O MOV A,#FFH ;SINGLE_IN = H,ACC = FFH RET ;返回 CHK_L_10US_O: MOV A,#00H ;ACC = 00H RET ;返回 ;-------------------------------- CONV_T0_RAM: MOV 24H,TH0 ;RAM 24H = T0 高八位元 MOV 25H,TL0 ;RAM 25H = T0 低八位元 MOV R4,#00H ;R4 = 30(LCM 0 顯示碼) MOV R5,#00H ;R5 = 30(LCM 0 顯示碼) MOV A,P1 ;ACC = P1 值 SWAP A ;ACC 高低位元組互換 ANL A,#0FH ;ACC 保留低四位元 MOV R6,A ;R6 = ACC MOV A,P1 ;ACC = P1 值 ANL A,#0FH ;ACC 保留低四位元 MOV R7,A ;R7 = ACC MOV A,25H ;ACC = RAM 25H 位址值 CONV_T0_RAM_L: CLR C ;C = 0 SUBB A,#58 ;ACC - C - 58(1CM 基準值,室溫23 度) JNC CONV_T0_RAM_2 ;C <> 1,GO CONV_T0_RAM_2 CLR C ;C = 1,C = 0 DEC 24H ;RAM 24H - 1 MOV B,A ;B = ACC 值 MOV A,24H ;ACC = RAM 24H CJNE A,#FFH,CONV_T0_RAM_1;ACC <> FFH,GO CONV_T0_RAM_1 LJMP CONV_T0_RAM_X ;ACC = FFH,GO CONV_T0_RAM_X CONV_T0_RAM_1: MOV A,B ;ACC = B CONV_T0_RAM_2: INC R7 ;R7 1 CJNE R7,#0AH,CONV_T0_RAM_L;R7 <> 3AH,GO CONV_T0_RAM_L MOV R7,#00H ;R7 = 3AH,R7 = 30H INC R6 ;R6 1 CJNE R6,#0AH,CONV_T0_RAM_L;R6 <> 3AH,GO CONV_T0_RAM_L MOV R6,#00H ;R6 = 3AH,R6 = 30H INC R5 ;R5 1 CJNE R5,#0AH,CONV_T0_RAM_L;R5 <> 3AH,GO CONV_T0_RAM_L MOV R5,#00H ;R5 = 3AH,R5 = 30H INC R4 ;R4 1 CONV_T0_RAM_X: LCALL DAA_R4_R7 ;調整 R4 - R7 為 LCM 顯示碼 MOV 20H,R4 ;RAM 20H = R4 MOV 21H,R5 ;RAM 21H = R5 MOV 22H,R6 ;RAM 22H = R6 MOV 23H,R7 ;RAM 23H = R7 RET ;返回 ;-------------------------------- ;# 調整 R4 - R7 為 LCM 顯示碼 ;-------------------------------- DAA_R4_R7: MOV A,R4 ;ACC = R4 ORL A,#30H ;ACC .OR. 30H MOV R4,A ;R4 = ACC MOV A,R5 ;ACC = R5 ORL A,#30H ;ACC .OR. 30H MOV R5,A ;R5 = ACC MOV A,R6 ;ACC = R6 ORL A,#30H ;ACC .OR. 30H MOV R6,A ;R6 = ACC MOV A,R7 ;ACC = R7 ORL A,#30H ;ACC .OR. 30H MOV R7,A ;R7 = ACC RET ;返回 ;-------------------------------- ;# 延時80US ;-------------------------------- D_80US: PUSH 7 ;R7 推入堆疊 MOV R7,#40 ;R7 = 40 DJNZ R7,$ ;R7 - 1 > 0,重複執行 POP 7 ;取回 R7 RET ;返回 ;-------------------------------- ;# 延時250US ;-------------------------------- D_250US PUSH 7 ;R7 推入堆疊 MOV R7,#122 ;R7 = 122 DJNZ R7,$ ;R7 - 1 > 0,重複執行 POP 7 ;取回 R7 RET ;返回 ;-------------------------------- ;# 延時 2.5MS ;-------------------------------- D_2500US: PUSH 6 ;R6 推入堆疊 PUSH 7 ;R7 推入堆疊 MOV R6,#50 ;R6 = 50 D_2500US_L MOV R7,#25 ;R7 = 25 DJNZ R7,$ ;R7 - 1 > 0,重複執行 DJNZ R6,D_2500US_L ;R6 - 1 > 0,GO D_2500US_L POP 7 ;取回 R7 POP 6 ;取回 R6 RET ;返回 ;-------------------------------- ;# 延時 1MS ;-------------------------------- D_1MS: PUSH 6 ;R6 推入堆疊 PUSH 7 ;R7 推入堆疊 MOV R6,#2 ;R6 = 2 D_1MS_L: MOV R7,#250 ;R7 = 250 DJNZ R7,$ ;R7 - 1 > 0,重複執行 DJNZ R6,D_1MS_L ;R6 - 1 > 0,GO D_1MS_L POP 7 ;取回 R7 POP 6 ;取回 R6 RET ;返回 ;-------------------------------- ;# 延時 2MS ;-------------------------------- D_2MS: PUSH 6 ;R6 推入堆疊 PUSH 7 ;R7 推入堆疊 MOV R6,#4 ;R6 = 4 D_2MS_L: MOV R7,#250 ;R7 = 250 DJNZ R7,$ ;R7 - 1 > 0,重複執行 DJNZ R6,D_2MS_L ;R6 - 1 > 0,GO D_2MS_L POP 7 ;取回 R7 POP 6 ;取回 R6 RET ;返回 ;-------------------------------- ;# 延時 50MS ;-------------------------------- D_50MS: PUSH 6 ;R6 推入堆疊 PUSH 7 ;R7 推入堆疊 MOV R6,#100 ;R6 = 100 D_50MS_L: MOV R7,#250 ;R7 = 250 DJNZ R7,$ ;R7 - 1 > 0,重複執行 DJNZ R6,D_50MS_L ;R6 - 1 > 0,GO D_50MS_L POP 7 ;取回 R7 POP 6 ;取回 R6 RET ;返回 ;-------------------------------- ;# 延時 1SEC ;-------------------------------- D_1S: PUSH 5 ;R5 推入堆疊 PUSH 6 ;R6 推入堆疊 PUSH 7 ;R7 推入堆疊 MOV R5,#10 ;R5 = 20 D_1S_L1: MOV R6,#200 ;R6 = 200 D_1S_L2: MOV R7,#250 ;R7 = 250 DJNZ R7,$ ;R7 - 1 > 0,重複執行 DJNZ R6,D_1S_L2 ;R6 - 1 > 0,GO D_1S_L2 DJNZ R5,D_1S_L1 ;R6 - 1 > 0,GO D_1S_L1 POP 7 ;取回 R7 POP 6 ;取回 R6 POP 5 ;取回 R5 RET ;返回 ;-------------------------------- ;# 延時 2SEC ;-------------------------------- D_2S: PUSH 5 ;R5 推入堆疊 PUSH 6 ;R6 推入堆疊 PUSH 7 ;R7 推入堆疊 MOV R5,#20 ;R5 = 20 D_2S_L1: MOV R6,#200 ;R6 = 200 D_2S_L2: MOV R7,#250 ;R7 = 250 DJNZ R7,$ ;R7 - 1 > 0,重複執行 DJNZ R6,D_2S_L2 ;R6 - 1 > 0,GO D_2S_L2 DJNZ R5,D_2S_L1 ;R6 - 1 > 0,GO D_2S_L1 POP 7 ;取回 R7 POP 6 ;取回 R6 POP 5 ;取回 R5 RET ;返回 ;-------------------------------- ;# LCM 提示字串 ;-------------------------------- LCM_STR1: DB "SUPERWAVE LENGTH" ; DB 10H ;結束碼 LCM_STR2: DB "TEST.LCM TEST OK" ; DB 10H ;結束碼 LCM_STR3: DB "STANDBY! " ; DB 10H ;結束碼 LCM_STR4: DB "LENGTH = CM " ; DB 10H ;結束碼 LCM_STR5: DB "DISTANCE TEST..." ; DB 10H ;結束碼 LCM_STR6: DB "DISTANCE OVER..." ; DB 10H ;結束碼 LCM_STR7: DB "LENGTH = ??? CM " ; DB 10H ;結束碼 END |
aki
版主 發表:30 回覆:696 積分:755 註冊:2004-01-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |