|
- ;時鐘 11.0592MHz,波特率=9600.
- CONTR EQU 0C5H ;A/D轉換寄存器
- DAT EQU 0C6H ;A/D轉換結果寄存器
- OUT EQU 30H ;測量后數值的8個地址的起始地址(30~37H)
- BIAOS EQU 20H ;20H.0為發送串口數據標識位,為1時發送數據,為0時不發送數據
- ZHIL EOU 10H ;識別主機發來的指令代碼的,10H表示要顯示車燈狀態
- 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 ;調用車燈狀態識別程序
- JB BIAOS.0,KS2 ;檢測主機是否發來要求顯示數據代碼指令
- ACALL FSDM ;收到指令,則發送車燈狀態標識代碼到主機
- CLR BIAOS.0 ;發送數據完畢清標識
- KS2: MOV R5,#100 ;100--延時1S
- LP1: MOV R6,#200
- ACALL DELAY
- DJNZ R5,LP1
- SJMP KS1 ;重新檢測
- INTO: ;串口接收程序
- CJNE A,#ZHIL,L1 ;收到主機發來10H指令代碼的表示要顯示車燈狀態,其他代碼視為無效
- 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為波特率發生器
- MOV SCON,#50H ;0101,0000 8位數據位,無奇偶校驗
- 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 ;測量后的數值(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轉換后數值的地址
- 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轉換通道后要適當延時,使輸入電壓穩定
- 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 轉換尚未完成,繼續等待
- ANL CONTR,#11100111B ;清0 ADC_FLAG,ADC_START位,停止A/D轉換
- MOV A,DAT
- MOV @R1,A ;保存 AD 轉換結果
- RET
- ;=================================================================================
- ;AD轉換結束
- ;=================================================================================
-
-
- ;=================================================================================
- ;車燈狀態識別程序
- ;=================================================================================
- ZTCB: MOV A,30H
- CJNE A,#00H,L11 ;讀取車燈狀態,如果為0,表示沒有通電
- CLR P2.0 ;給燈泡通電
- ACALL ADZH2 ;AD轉換讀取數據
- SETB P2.0 ;燈泡斷電
- MOV A,30H
- CJNE A,#00H,L12 ;讀取車燈狀態,如果為0,表示短路
- MOV 38H,#00010010B ;作標記,表示1#車燈短路
- SJMP FAHUI
- L12: CJNE A,#10H,L13 ;讀取車燈狀態,如果為10H,表示正常
- MOV 38H,#00010000B ;作標記,表示1#車燈正常
- SJMP FAHUI
- L13: CJNE A,#20H,L14 ;讀取車燈狀態,如果為20H,表示缺燈
- MOV 38H,#00010011B ;作標記,表示1#車燈缺燈
- SJMP FAHUI
- L14: CJNE A,#0F0H,FAHUI ;讀取車燈狀態,如果為F0H,表示開路
- MOV 38H,#00010011B ;作標記,表示1#車燈開路
- SJMP FAHUI
- L11: CJNE A,#0F0H,FAHUI ;讀取車燈狀態,如果為F0H,表示正在通電
- MOV 38H,#00011000B ;作標記,表示1#車燈通電
- FAHUI; RET
- ADZH2: MOV R0,#11100000B ;從P1.0通道開始測量,直到P1.7后返回再檢測
- MOV R1,#OUT ;測量后的數值(16進制)分別放到OUT(30H)起8個地址內
- ACALL SET_CH ;設置P1.*作為A/D轉換通道
- ACALL GET_AD ;測量電壓并且取A/D轉換結果
- RET
- ;=================================================================================
- ;車燈狀態識別結束
- ;=================================================================================
-
-
-
- ;=================================================================================
- ;向主機發送數據程序
- ;=================================================================================
- FADM: CLR TI
- MOV A,@R1
- MOV SBUF,A
- JNB TI,$
- CLR TI
- INC R1
- CJNE R1,#38H,FADM
- MOV R1,#30H
- RET
- ;=================================================================================
- ;向主機發送數據結束
- ;=================================================================================
-
-
- ;=================================================================================
- ;延時子程序
- ;=================================================================================
- ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- ;延時500微秒子程序
- ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- DELAY: MOV R7,#229 ;延時 500 微秒,此條2個機器周期
- DJNZ R7,$
- DJNZ R6,DELAY
- RET ;此條2個機器周期,總延時(229*2+2+2)*(12/11.0592)≈500uS
- ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- END
復制代碼
|
|