線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3856
推到 Plurk!
推到 Facebook!

51程式請教  

答題得分者是:aki
HS_yap
一般會員


發表:1
回覆:2
積分:0
註冊:2009-03-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-07 14:07:58 IP:163.17.xxx.xxx 訂閱
各位大大...小弟是新手!
想問如何用8051寫一個超音波測距的程式...
要把資料顯示在七段顯示器上!
再網絡上找的都是顯示在LCM的!
請問各位大大能否提供一些程式讓小弟參考!
小弟感激不盡!
aki
版主


發表:30
回覆:696
積分:755
註冊:2004-01-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-09 07:45:47 IP:61.229.xxx.xxx 訂閱
寫微電腦的軟體是要配合硬體來寫,沒有硬體的電路,軟體可是不知道要怎麼寫?
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-09 09:05:04 IP:163.17.xxx.xxx 訂閱
如以下這兩張發射一接收的電路...我該怎麽做呢?
該如何計算?
計算完了....該怎麽以掃描的方式輸出到七段顯示器上呢?

RX 接收電路

TX 發射電路
aki
版主


發表:30
回覆:696
積分:755
註冊:2004-01-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-10 07:22:25 IP:61.229.xxx.xxx 訂閱
>
>如以下這兩張發射一接收的電路...我該怎麽做呢?
>該如何計算?
1.這個電路很眼熟, 好像是某機器人網站公布的電路,你確定了解了動作原理嗎?
2.了解用超音波來計算距離的方式嗎?請回想一下國中的 "牛頓定理" 吧!
>計算完了....該怎麽以掃描的方式輸出到七段顯示器上呢?
3. 7 segment display 的電路圖?
4.這個電路是個獨立的方塊,你給甚麼數字資料, 就秀出來,你給溫度資料,就秀溫度資料.
書本上範例多了!


aki
版主


發表:30
回覆:696
積分:755
註冊:2004-01-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-12 18:02:54 IP:61.229.xxx.xxx 訂閱
你想秀資料於 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-12 19:45:38 IP:163.17.xxx.xxx 訂閱
以下是我在網上找到的程式...
但不知怎麽改成用七段顯示...



;腳位描述:
;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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-12 20:01:23 IP:61.229.xxx.xxx 訂閱
 我上面寫的書就有畫了電路圖,及附有 8051 的 Keil C Source code.
系統時間:2024-05-03 2:32:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!