標題:
8通道車燈檢測程序(匯編)
[打印本頁]
作者:
daniu
時間:
2014-12-26 22:33
標題:
8通道車燈檢測程序(匯編)
;時鐘 11.0592MHz,波特率=9600.
CONTR EQU 0C5H ;A/D轉換寄存器
DAT EQU 0C6H ;A/D轉換結果寄存器
OUT EQU 30H ;測量后數(shù)值的8個地址的起始地址(30~37H)
BIAOS EQU 20H ;20H.0為發(fā)送串口數(shù)據(jù)標識位,為1時發(fā)送數(shù)據(jù),為0時不發(fā)送數(shù)據(jù)
ZHIL EOU 10H ;識別主機發(fā)來的指令代碼的,10H表示要顯示車燈狀態(tài)
P1M0 EQU 91H ;P1口模式選擇寄存器0
P1M1 EQU 92H ;P1口模式選擇寄存器1
;=================================================================================
;主程序
;=================================================================================
ORG 0000H
LJMP KS
ORG 0003H
LJMP INTO ;串口中斷
ORG 0100H
KS: MOV SP,#60H ;設置堆棧
MOV CHKOU,#00H ;清標識
ACALL POWER ;初始化AD轉換程序
********************** ;初始化串口中斷
ACALL RS232 ;初始化串口
KS1: ACALL ADZH ;調用AD轉換程序
ACALL ZTCB ;調用車燈狀態(tài)識別程序
JB BIAOS.0,KS2 ;檢測主機是否發(fā)來要求顯示數(shù)據(jù)代碼指令
ACALL FSDM ;收到指令,則發(fā)送車燈狀態(tài)標識代碼到主機
CLR BIAOS.0 ;發(fā)送數(shù)據(jù)完畢清標識
KS2: MOV R5,#100 ;100--延時1S
LP1: MOV R6,#200
ACALL DELAY
DJNZ R5,LP1
SJMP KS1 ;重新檢測
INTO: ;串口接收程序
CJNE A,#ZHIL,L1 ;收到主機發(fā)來10H指令代碼的表示要顯示車燈狀態(tài),其他代碼視為無效
SETB BIAOS.0 ;設顯示標識
L1: RET
;=================================================================================
;AD初始化程序
;=================================================================================
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
;開ADC電源,第一次使用時要打開內部模擬電源
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
POWER: ORL CONTR,#10000000H ;開A/D轉換電源
MOV R6,#2
ACALL DELAY ;開A/D轉換電源后要加延時,1mS以內就足夠了
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
;設置P1.*,設置A/D通道所在的I/O為開漏模式
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
OPEN: MOV P1M0,#11111111B ;把P1口設為高阻輸入
MOV P1M1,#00000000B
RET
;=================================================================================
;AD初始化結束
;=================================================================================
;=================================================================================
;串口初始化
;=================================================================================
RS232: CLR ES ;禁止串口中斷
MOV TMOD,#20H ;設置T1為波特率發(fā)生器
MOV SCON,#50H ;0101,0000 8位數(shù)據(jù)位,無奇偶校驗
MOV TH1,#0FDH ;11.0592MHz 晶振,波特率=9600,時長0.6695
MOV TL1,#96H
SETB TR1 ;啟動T1
RET
;=================================================================================
;串口初始化結束
;=================================================================================
;=================================================================================
;AD轉換程序
;=================================================================================
ADZH: MOV R0,#11100000B ;從P1.0通道開始測量,直到P1.7后返回再檢測
MOV R1,#OUT ;測量后的數(shù)值(16進制)分別放到OUT(30H)起8個地址內
LP2: ACALL SET_CH ;設置P1.*作為A/D轉換通道
ACALL GET_AD ;測量電壓并且取A/D轉換結果
INC R1 ;地址加1
INC R0 ;換另一端口
CJNE R0,#11101000B,LP3 ;直到P1.7
MOV R0,#11100000B ;再從P1.0來
MOV R1,#OUT ;重新設定存放AD轉換后數(shù)值的地址
SJMP LP2
LP3: RET ;返回
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;R0存通道地址代碼:11100000B~11100111B,R1存通道地址:分別為30H~37H
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;以下測量電壓程序
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
;設置P1.*作為A/D轉換通道
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
SET_CH: MOV CONTR,R0 ;選擇P1.*作為A/D轉換通道
MOV R6,#1 ;更換A/D轉換通道后要適當延時,使輸入電壓穩(wěn)定
ACALL DELAY ;切換A/D轉換通道,加延時20uS~200uS就可以了,
RET
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
;測量電壓并且取A/D轉換結果
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
GET_AD: MOV DAT,#0
ORL CONTR,#00001000B ;啟動 AD 轉換
WAIT: MOV A,#00010000B ;判斷 AD 轉換是否完成
ANL A,CONTR
JZ WAIT ;AD 轉換尚未完成,繼續(xù)等待
ANL CONTR,#11100111B ;清0 ADC_FLAG,ADC_START位,停止A/D轉換
MOV A,DAT
MOV @R1,A ;保存 AD 轉換結果
RET
;=================================================================================
;AD轉換結束
;=================================================================================
;=================================================================================
;車燈狀態(tài)識別程序
;=================================================================================
ZTCB: MOV A,30H
CJNE A,#00H,L11 ;讀取車燈狀態(tài),如果為0,表示沒有通電
CLR P2.0 ;給燈泡通電
ACALL ADZH2 ;AD轉換讀取數(shù)據(jù)
SETB P2.0 ;燈泡斷電
MOV A,30H
CJNE A,#00H,L12 ;讀取車燈狀態(tài),如果為0,表示短路
MOV 38H,#00010010B ;作標記,表示1#車燈短路
SJMP FAHUI
L12: CJNE A,#10H,L13 ;讀取車燈狀態(tài),如果為10H,表示正常
MOV 38H,#00010000B ;作標記,表示1#車燈正常
SJMP FAHUI
L13: CJNE A,#20H,L14 ;讀取車燈狀態(tài),如果為20H,表示缺燈
MOV 38H,#00010011B ;作標記,表示1#車燈缺燈
SJMP FAHUI
L14: CJNE A,#0F0H,FAHUI ;讀取車燈狀態(tài),如果為F0H,表示開路
MOV 38H,#00010011B ;作標記,表示1#車燈開路
SJMP FAHUI
L11: CJNE A,#0F0H,FAHUI ;讀取車燈狀態(tài),如果為F0H,表示正在通電
MOV 38H,#00011000B ;作標記,表示1#車燈通電
FAHUI; RET
ADZH2: MOV R0,#11100000B ;從P1.0通道開始測量,直到P1.7后返回再檢測
MOV R1,#OUT ;測量后的數(shù)值(16進制)分別放到OUT(30H)起8個地址內
ACALL SET_CH ;設置P1.*作為A/D轉換通道
ACALL GET_AD ;測量電壓并且取A/D轉換結果
RET
;=================================================================================
;車燈狀態(tài)識別結束
;=================================================================================
;=================================================================================
;向主機發(fā)送數(shù)據(jù)程序
;=================================================================================
FADM: CLR TI
MOV A,@R1
MOV SBUF,A
JNB TI,$
CLR TI
INC R1
CJNE R1,#38H,FADM
MOV R1,#30H
RET
;=================================================================================
;向主機發(fā)送數(shù)據(jù)結束
;=================================================================================
;=================================================================================
;延時子程序
;=================================================================================
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
;延時500微秒子程序
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
DELAY: MOV R7,#229 ;延時 500 微秒,此條2個機器周期
DJNZ R7,$
DJNZ R6,DELAY
RET ;此條2個機器周期,總延時(229*2+2+2)*(12/11.0592)≈500uS
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
END
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1