标题:
8通道车灯检测程序(汇编)
[打印本页]
作者:
daniu
时间:
2014-12-26 22:33
标题:
8通道车灯检测程序(汇编)
;时钟 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
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1