|
- ;时钟 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
复制代码
|
|