?? received-part-of-supersonic-range-measured-that-mcs51_based.asm
字號:
;======================================================================
;項目名稱:超聲波測距接收部分程序
;功 能: 晶振采用12M,引腳定義:P0.1(SDA),P0.2(SCL),P3.2(即INT0,紅外輸入),P3.3(即INT1,超聲波輸入)
;硬件環境: 自制單片機實驗板,
;軟件環境: Windows操作系統
;使用軟件:偉福 V3.20,
; Easy 51Pro v2.0
;
;實驗步驟:
; 1.打開偉福V3.20,創建一新文件
; 2.編寫源代碼
; 3.保存文件,文件名后綴為.asm
; 4.編譯程序
; 5.打開Easy 51Pro v2.0將程序寫進實驗板
;程序范例:
; Create date: 2004_07_26
; First Modify: 2004_07_26
; second Modify:
; Last Modify: 2004_07_26
; Author: Sujiande
;==============================================================================
;===========預定義==============================================
SDA BIT P0.1; P0.1;定義數據線引腳
SCL BIT P0.2;P0.2;定義時鐘線引腳
LED0 EQU 40H ;預定義數碼管
LED1 EQU 41H
LED2 EQU 42H
LED3 EQU 43H
ORG 0000H ;主程序入口
AJMP MAIN ;跳轉到主程序
ORG 0100H ;主程序在ROM中存放的位置
MAIN: MOV R0,#70H
MOV R7,#0BH
MOV 40H,#00H
MOV 20H,#00H
CLEARDISP: MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
;===============================================================
RECEIVE:SETB EA ;中斷總允許
JNB P3.2,START_TIMER
JB P3.3,STOP_TIMER
;==============================================
START_TIMER:MOV TMOD,#0DDH; 計數工作方式,外中斷請求啟動,工作方式1
CLR P3.2;禁止計數器0外中斷
SETB TR0;開始計數
RET
;==============================================
STOP_TIMER:ACALL STOP
ACALL SAVE_4_DATA
ACALL CALCULATE
ACALL HB2
ACALL DISPLAY
;===================================
STOP:CLR TR0;停止計數
RET
;===================================
SAVE_4_DATA:MOV DPTR,#BRTAB;轉移指令表首址
CLR C;進位位CY清零
MOV A,44H
RLC A;A帶進位位循環左移,即分支序號值乘2,原因是AJMP指令是2字節指令,P53、P147
JMP @A+DPTR; 轉各分支程序
BRTAB:AJMP SAVE_DATA_1
AJMP SAVE_DATA_2
AJMP SAVE_DATA_3
AJMP SAVE_DATA_4
SAVE_DATA_1:CLR P3.3;禁止P3.3外中斷
SETB EX0;允許外中斷INT0
MOV 70H,TL0
MOV 71H,TH0
MOV R0,70H
MOV R1,71H
MOV 44H,#01H
AJMP RECEIVE
RET
SAVE_DATA_2:CLR P3.3;禁止P3.3外中斷
SETB EX0;允許外中斷INT0MOV R1,#04H
MOV 72H,TL0
MOV 73H,TH0
MOV R2,72H
MOV R3,73H
MOV 44H,#02H
AJMP RECEIVE
RET
SAVE_DATA_3:CLR P3.3;禁止P3.3外中斷
SETB EX0;允許外中斷INT0MOV R1,#04H
MOV 74H,TL0
MOV 75H,TH0
MOV R4,74H
MOV R6,75H
MOV 44H,#03H
AJMP RECEIVE
RET
SAVE_DATA_4:CLR P3.3;禁止P3.3外中斷
SETB EX0;允許外中斷INT0MOV R1,#04H
MOV 76H,TL0
MOV 77H,TH0
MOV R6,76H
MOV R7,77H
AJMP AVERAGE_4;轉求4個測量值的平均值
MOV 44H,#00H;重新開始檢測4個測量值
AJMP RECEIVE
RET
;=================以下程序求四個測量值平均值=====================
MOV R0,71H
MOV R1,74H
MOV R7,#02H
CLR C
LOOP:MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,LOOP
CLR A
ADDC A,#00H
MOV @R0,A ;前2個數相加結果存于71—73H
;=======================
MOV R0,71H
MOV R1,77H
MOV R7,#03H
CLR C
LOOP:MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,LOOP
CLR A
ADDC A,#00H
MOV @R0,A ;前3個數相加結果存于71—73H
;=======================
MOV R0,71H
MOV R1,80H
MOV R7,#03H
CLR C
LOOP:MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,LOOP
CLR A
ADDC A,#00H
MOV @R0,A ;4個測量值相加結果存于71—73H
;=======================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;=========================以下計算平均值方法不對!!!!==================
; AVERAGE_4:CLR C;
; MOV A,70H;第1個測量值低位,這里的測量值均為時間值
; ADDC A,72H;第2個測量值低位
; MOV 72H,A;前2個測量值的低位相加結果存于72H單元
; MOV A,71H;第1個測量值高位
; ADDC A,73H;第2個測量值高位
; MOV 73H,A;前2個測量值的低位相加結果存于72H單元
; CLR A;
; ADDC A,#00H;進位處理
; MOV 71H,A;進位存于71單元
;
; MOV A,72H;
; ADDC A,74H;第3個測量值低位
; MOV 72H,A;存低位相加結果
; MOV A,73H;
; ADDC A,75H;第3個測量值高位
; MOV 73H,A;存高位相加結果
; CLR A;
; ADDC A,71H;
; MOV 71H,A;進位存于71單元
;
; MOV A,72H;
; ADDC A,76H;第4個測量值低位
; MOV 72H,A;存低位相加結果
; MOV A,73H;
; ADDC A,77H;第4個測量值高位
; MOV 73H,A;存高位相加結果
; CLR A;
; ADDC A,71H;
; MOV 71H,A; 四個測量值相加結果的進位存于71單元,低位存于72H單元,高位存于73H單元
;
; MOV A,71H;
; RRC A;
; MOV 71H,A;
; MOV A,72H;
; RRC A;
; MOV 72H,A;
; MOV A,73H;
; RRC A;
; MOV 73H,A;求四個測量值平均值,進位存于71單元,低位存于72H單元,高位存于73單元,
;這里的測量值均為時間值
;=========================================================
;計算距離:S=v*t=340*t
CALCULATE:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BCD轉換 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2:CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙字節十六進制整數
HB3:MOV A,R7 ;從高端移出待轉換數的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A
DJNZ R2,HB3
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 顯示程序, 不用這個,用蘇老師的顯示模塊,見后面
;
; DISPLAY:MOV R1,#76H
; MOV R5,#0FEH
; PLAY:MOV A,R5
; MOV P3,A ;累加器A中的數值送P3口
; MOV A,@R1
; MOV DPTR,#TAB
; MOVC A,@A+DPTR ;
; MOV P1,A ;累加器A中的數值送P1口
; MOV R6,#14H
; DL1:MOV R7,#19H
; DL2:DJNZ R7,DL2
; DJNZ R6,DL1
; INC R1
; MOV A,R5
; JNB ACC.2,ENDOUT
; RL A
; MOV R5,A
; AJMP PLAY
; ENDOUT:SETB P3.5
; MOV P1,#0FFH ;立即數0FEH送P1口
; RET
; TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0c6H,3fh
; END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;===================================顯示模塊=====================================
DISPLAY:
MOV DPTR,#TAB ;賦顯示代碼首地址
LP1:
MOV A,LED0 ;將LED0中的數據送A
MOVC A,@A+DPTR ;將A與DPTR相加的值作為代碼地址,并將該代碼賦給A
ACALL SHIFT ;調用移位子程序
MOV A,LED1
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED2
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED3
MOVC A,@A+DPTR
ACALL SHIFT
RET
;--------------顯示代碼表-------------------------------------------------------------------------- ----
TAB: DB 0EEH,28H,0CDH,6DH,2BH ;11H,0D7H,032H,92H,0D4H
DB 67H,0E7H,2CH,0EFH,6FH ;98H,018H,0D3H,10H,090H
;------------------------------------------------------------------------
;================移位子程序============================
SHIFT: push A ;將A中的值入棧保護
MOV R2,#8 ;循環8次
CLR C ;清進位標志
CLR SCL ;將時鐘線拉底,準備發送數據
DL:
RLC A ;將要發送的數據左移,發送入位C
MOV SDA,C ;將C上的數據送上數據線
SETB SCL ;將時鐘線置高使數據線上的數據有效
CLR SCL ;將時鐘線拉底,準備下一次發送數據
DJNZ R2,DL
POP A ;出棧恢復A值
RET ;子程序返回
;===================================================
; 子程序名: Delay_1s
; 功能描述: 延時約一秒鐘
;===================================================
Delay_1s:
MOV R7,#0FFH;將數0FFH送給寄存器R7,確定外循環次數
LOOP7: MOV R6,#0FFH;將數0FFH送給寄存器R6,確定內循環次數
LOOP6: NOP ;空操作指令,指令執行時間為一個機械周期
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R6,LOOP6;循環轉移指令,次數減一,不為零轉移
DJNZ R7,LOOP7;循環轉移指令,次數減一,不為零轉移
RET ;子程序返回指令
;===================================================
END ;匯編結束偽指令
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -