?? shxj1.asm
字號:
;名稱:
;日期:2006年7月10日
;編寫:李洪佳
;芯片:CYGNAL C8051F021
;語言:匯編
;單片機用CYGNAL的C8051F021,調試用新華龍C8051F020開發板
;上位機發送控制命令給單片機,控制攝像機聚焦變倍,無命令時單片機向上位機傳送深度數據
;UART0及UART1波特率設定為9600,波特率發生器為T2與T4,上位機發送每個命令的時間間隔為500毫秒
;單片機用UART0通過RS485與上位機通信,用UART1與攝像機通信實現對攝像機的控制
;---------------------------------------------------------------------------
;波特率=9600
;設定對攝像機控制的命令分別為:變倍-放大為“#,Z,+,CR,LF”,縮小為“#,Z,-,CR,LF”;聚焦-拉近為“#,F,+,CR,LF”,推遠為“#,F,-,CR,LF”。
; * * * * *
;------------------------------------------------------------* 頭文件*--------------------------------------------------------------------
; * * * * *
$include (c8051f020.inc) ; Include register definition file.定義寄存器
; ----------------
;----------------------------------------------------------)定義接收存儲區(------------------------------------------------------------------
; ----------------
CTX485 BIT P3.7
DEEP_ADJ1 EQU 20H ;深度調整數據區
DEEP_ADJ2 EQU 21H
CTRL1 EQU 50H ;設定接收命令控制存儲區1
CTRL2 EQU 51H ;設定接收命令控制存儲區2
CTRL3 EQU 52H ;設定接收命令控制存儲區3
CTRL4 EQU 53H ;設定接收命令控制存儲區4
CTRL5 EQU 54H ;設定接收命令控制存儲區5
DEEP_BUF0 EQU 55H ;深度數據緩存
DEEP_BUF1 EQU 56H
DEEP_BUF2 EQU 57H
DEEP_BUF3 EQU 58H
DEEP_BUF4 EQU 59H
DEEP_BUF5 EQU 5AH
DEEP_BUF6 EQU 5BH
DEEP_BUF7 EQU 5CH
PAGE_ADR1 EQU 5DH ;深度調整存儲頁
PAGE_ADR2 EQU 5EH
REC_COUNT EQU 5FH ;接收數據計數器
; ^^^VV^^^
;----------------------------------------------------------(中斷向量)---------------------------------------------
ORG 0000H
LJMP START
ORG 0023H
LJMP DETERMINE
;---------------------------------------------------------iii禁止看門狗iii--------------------------------------------
; ^^^^^^^^^^^^^^^^
ORG 1000H
START: MOV WDTCN, #0DEH ;
MOV WDTCN, #0ADH ;禁止看門狗
MOV OSCXCN, #67H ;使用外部振蕩22.1184MHz
; ~~~~~~~~~~~~~~~~~~
;------------------------------------------------------->等待外部時鐘穩定<---------------------------------------------
; -_- -_-
CLR A ; wait at least 1ms
DJNZ ACC, $ ; wait ~512us
DJNZ ACC, $ ; wait ~512us
OSC_WAIT: ; poll for XTLVLD-->1
MOV A, OSCXCN
JNB ACC.7, OSC_WAIT
ORL OSCICN, #08H ; 選擇外部振蕩作為系統時鐘源
ORL OSCXCN, #80H ; 使能時鐘丟失檢測
; **********
;------------------------------------------------------------*準備設置*----------------------------------------------------
; **********
MOV XBR2,#44H ;交叉開關允許,串口1允許
MOV XBR0,#04H ;使用串口0,TX0=P0.0,RX0=P0.1
MOV ADC0CN,#00H ;使能ADC0
MOV ADC0CF,#60H ;轉換時鐘1Mhz,增益1
MOV AMX0CF,#00H ;單端輸入方式
MOV AMX0SL,#00H ;channel 0 即AIN0
MOV REF0CN,#03H ;ADC0 基準電壓 VREF0
MOV EMI0CF,#00H ;片內存儲方式
ORL P1MDIN,#0FFH ;設置P1數字輸入方式
ORL P0MDOUT,#0F5H ;設置P0.0為推挽輸出P0.1漏極輸出P0.2推挽輸出P0.3漏極輸出
;ORL P1MDOUT,#40H ;設置P1.6為推挽輸出(試驗用)
ORL P3MDOUT,#0FFH ;P3為推挽輸出
MOV SCON0,#50H ;設置串口0,工作方式1,REN0=1允許接收
MOV SCON1,#50H ;設置串口1,工作方式1,REN1=1允許接收
MOV RCAP2L,#0B8H ;設置定時器2波特率9600
MOV RCAP2H,#0FFH ;
MOV RCAP4L,#0B8H ;設置定時器4波特率9600
MOV RCAP4H,#0FFH ;
MOV T2CON,#34H ;啟動定時器2作為串口uart0波特率發生器
MOV T4CON,#34H ;啟動定時器4作為串口uart1波特率發生器
MOV PCON,#00H ;SMOD0=0波特率倍數為1,訪問SCON的UART0方式設置位
MOV TCON,#00H
MOV REC_COUNT,#1 ;數據接收計數器初始值設定為1
MOV IE,#90H ;UART0中斷使能
;-_-_-_-_-_-_-_-_-^_^-_-_-_-_-_-_------------------------------------------------------------------------------^_^
DATA_SEND: LCALL GETAD ;調用深度采集子程序
LCALL CONV ;調用碼轉換子程序
MOV IE,#90H ;ADC轉換中斷使ES0被硬件清零,此處重置UART0中斷使能
CLR A ;清累加器
CLR TI ;清發送中斷標志
MOV A,#24H ;發送$識別碼
MOV SBUF0,A
JNB TI,$
CLR TI
MOV A,DEEP_BUF1 ;將深度數據第一位存入累加器
MOV SBUF0,A ;發送第一位深度數據
JNB TI,$
CLR TI
MOV A,DEEP_BUF2
MOV SBUF0,A
JNB TI,$
CLR TI
MOV A,DEEP_BUF3
MOV SBUF0,A
JNB TI,$
CLR TI
MOV A,DEEP_BUF4
MOV SBUF0,A
JNB TI,$
CLR TI
MOV A,DEEP_BUF5
MOV SBUF0,A
JNB TI,$
CLR TI
MOV A,DEEP_BUF6
MOV SBUF0,A
JNB TI,$
CLR TI
MOV A,DEEP_BUF7
MOV SBUF0,A ;發送第七位深度數據
CLR A
JNB TI,$
CLR TI
MOV R3,#10 ;延時89毫秒
DLOOP: LCALL DELAY ;調用延時子程序
DJNZ R3,DLOOP
LJMP DATA_SEND ;一組深度數據發送完成,返回發送下一組
;-----------------------------------------------------深度采集碼段--------------------------------------------------------
GETAD: MOV R3,#10H ;1US;---------------------A/D CONVERTION SUB_PROGRAM,GET DEPTH DATA FROM A/D
MOV R5,#0H ;1US
MOV R6,#0H ;1US
MOV DEEP_BUF6,#00H
MOV DEEP_BUF7,#00H
CLR C
GETAD1: SETB AD0EN ;使能ADC0
LCALL GETADS ;2US call one AD convertion
MOV A,DEEP_BUF6
ADD A,R5 ;1US
MOV R5,A ;1US
MOV A,DEEP_BUF7 ;1US
ADDC A,R6 ;1US overflow carry
MOV R6,A ;1US
DJNZ R3,GETAD1 ;sampling 16 times and sum(quite to shift to left 4 bits),2US
CLR AD0EN
MOV A,R5 ;1US,sum 25US deal with low 8 bits
ANL A,#0F0H ;1US reserve the high half byte
SWAP A ;1US high half byte swap to low half byte
MOV R5,A ;1US
MOV A,R6 ;1US deal with high 8 bits
ANL A,#0FH ;1US
SWAP A ;1US
ORL A,R5 ;1US combinate into low 8 bits
MOV R5,A ;1US
MOV A,R6 ;1US
SWAP A ;1US
ANL A,#0FH ;1US
MOV R6,A ;calculate the average(quite to shift to right 4 bits),1US
CLR C ;1US
;----------------------------------------subtract AIR DEEP DATA -----------------------------------------------
;----------------------------------------------------------------------------------------------------------------
LCALL DAR
MOV A,R5 ;1US
SUBB A,DEEP_ADJ2 ;1US
MOV R5,A ;1US
MOV A,R6 ;1US
SUBB A,DEEP_ADJ1 ;1US
MOV R6,A ;1US
JNC GETAD2 ;2US
MOV R5,#00 ;1US the carry bit is a 1?if less than 400mV ,depth=00
MOV R6,#00 ;1US
SJMP GETAD6 ;2US
GETAD2: MOV DEEP_BUF6,R5 ;2US
MOV DEEP_BUF7,R6 ;2US
MOV R3,#8 ;1US
CLR C
GETAD3: MOV A,R5 ;1US,sum 120US
ADD A,DEEP_BUF6 ;1US
MOV R5,A ;1US
MOV A,R6 ;1US
ADDC A,DEEP_BUF7 ;1US
MOV R6,A ;1US
DJNZ R3,GETAD3 ;multiply 9,add 9 time,2US
MOV A,R5 ;1US,sum 19US
ANL A,#0F0H ;1US
SWAP A ;1US
MOV R5,A ;1US
MOV A,R6 ;1US
ANL A,#0FH ;1US
SWAP A ;1US
ORL A,R5 ;1US
MOV R5,A ;1US
MOV A,R6 ;1US
SWAP A ;1US
ANL A,#0FH ;1US00
MOV R6,A ;divide 16,1US(multiply 9/16,0.5625,exchange to mV,actually to decimeter(0.1m))
GETAD6: MOV DEEP_BUF6,R5 ;2US
MOV DEEP_BUF7,R6 ;2US
RET ;2US
;------------------------------------------------------- one AD conversion--------------------------------------------------
GETADS: CLR AD0EN ;關斷ADC0,停止采集
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -