找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2358|回复: 0
收起左侧

8通道车灯检测程序(汇编)

[复制链接]
ID:70976 发表于 2014-12-26 22:33 | 显示全部楼层 |阅读模式
  1. ;时钟 11.0592MHz,波特率=9600.

  2.          CONTR EQU 0C5H         ;A/D转换寄存器
  3.          DAT   EQU 0C6H         ;A/D转换结果寄存器

  4.          OUT   EQU  30H         ;测量后数值的8个地址的起始地址(30~37H)
  5.          BIAOS EQU  20H         ;20H.0为发送串口数据标识位,为1时发送数据,为0时不发送数据
  6.          ZHIL  EOU  10H         ;识别主机发来的指令代码的,10H表示要显示车灯状态

  7.          P1M0  EQU  91H         ;P1口模式选择寄存器0
  8.          P1M1  EQU  92H         ;P1口模式选择寄存器1

  9. ;=================================================================================
  10. ;主程序
  11. ;=================================================================================
  12.          ORG 0000H
  13.          LJMP KS
  14.          ORG 0003H
  15.          LJMP INTO              ;串口中断
  16.          ORG 0100H

  17. KS:      MOV SP,#60H            ;设置堆栈
  18.          MOV CHKOU,#00H         ;清标识
  19.          ACALL POWER            ;初始化AD转换程序
  20.          ********************** ;初始化串口中断
  21.          ACALL RS232            ;初始化串口

  22. KS1:     ACALL ADZH             ;调用AD转换程序
  23.          ACALL ZTCB             ;调用车灯状态识别程序
  24.          JB BIAOS.0,KS2         ;检测主机是否发来要求显示数据代码指令
  25.          ACALL FSDM             ;收到指令,则发送车灯状态标识代码到主机
  26.          CLR BIAOS.0            ;发送数据完毕清标识

  27. KS2:     MOV R5,#100            ;100--延时1S
  28. LP1:     MOV R6,#200
  29.          ACALL DELAY
  30.          DJNZ R5,LP1
  31.          SJMP KS1               ;重新检测


  32. INTO:                    ;串口接收程序
  33.          CJNE A,#ZHIL,L1        ;收到主机发来10H指令代码的表示要显示车灯状态,其他代码视为无效
  34.          SETB BIAOS.0           ;设显示标识
  35. L1:      RET





  36. ;=================================================================================
  37. ;AD初始化程序
  38. ;=================================================================================
  39. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  40. ;开ADC电源,第一次使用时要打开内部模拟电源
  41. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  42. POWER:   ORL CONTR,#10000000H   ;开A/D转换电源
  43.          MOV R6,#2
  44.          ACALL DELAY            ;开A/D转换电源后要加延时,1mS以内就足够了
  45. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  46. ;设置P1.*,设置A/D通道所在的I/O为开漏模式
  47. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  48. OPEN:    MOV P1M0,#11111111B    ;把P1口设为高阻输入
  49.          MOV P1M1,#00000000B
  50.          RET

  51. ;=================================================================================
  52. ;AD初始化结束
  53. ;=================================================================================






  54. ;=================================================================================
  55. ;串口初始化
  56. ;=================================================================================
  57. RS232:   CLR ES                 ;禁止串口中断
  58.          MOV TMOD,#20H          ;设置T1为波特率发生器
  59.          MOV SCON,#50H          ;0101,0000 8位数据位,无奇偶校验
  60.          MOV TH1,#0FDH          ;11.0592MHz 晶振,波特率=9600,时长0.6695
  61.          MOV TL1,#96H  
  62.          SETB TR1               ;启动T1
  63.          RET

  64. ;=================================================================================
  65. ;串口初始化结束
  66. ;=================================================================================







  67. ;=================================================================================
  68. ;AD转换程序
  69. ;=================================================================================

  70. ADZH:    MOV R0,#11100000B      ;从P1.0通道开始测量,直到P1.7后返回再检测
  71.          MOV R1,#OUT            ;测量后的数值(16进制)分别放到OUT(30H)起8个地址内
  72. LP2:     ACALL SET_CH           ;设置P1.*作为A/D转换通道
  73.          ACALL GET_AD           ;测量电压并且取A/D转换结果
  74.          INC R1                 ;地址加1
  75.          INC R0                 ;换另一端口
  76.          CJNE R0,#11101000B,LP3 ;直到P1.7
  77.          MOV R0,#11100000B      ;再从P1.0来
  78.          MOV R1,#OUT            ;重新设定存放AD转换后数值的地址
  79.          SJMP LP2

  80. LP3:     RET                    ;返回

  81. ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  82. ;R0存通道地址代码:11100000B~11100111B,R1存通道地址:分别为30H~37H
  83. ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  84. ;以下测量电压程序
  85. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  86. ;设置P1.*作为A/D转换通道
  87. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  88. SET_CH:  MOV CONTR,R0           ;选择P1.*作为A/D转换通道
  89.          MOV R6,#1              ;更换A/D转换通道后要适当延时,使输入电压稳定
  90.          ACALL DELAY         ;切换A/D转换通道,加延时20uS~200uS就可以了,
  91.          RET

  92. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  93. ;测量电压并且取A/D转换结果
  94. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  95. GET_AD:  MOV DAT,#0
  96.          ORL CONTR,#00001000B   ;启动 AD 转换

  97. WAIT:    MOV A,#00010000B       ;判断 AD 转换是否完成
  98.          ANL A,CONTR
  99.          JZ WAIT                ;AD 转换尚未完成,继续等待
  100.          ANL CONTR,#11100111B   ;清0 ADC_FLAG,ADC_START位,停止A/D转换         
  101.          MOV A,DAT
  102.          MOV @R1,A              ;保存 AD 转换结果
  103.          RET

  104. ;=================================================================================
  105. ;AD转换结束
  106. ;=================================================================================






  107. ;=================================================================================
  108. ;车灯状态识别程序
  109. ;=================================================================================
  110. ZTCB:    MOV A,30H
  111.          CJNE A,#00H,L11        ;读取车灯状态,如果为0,表示没有通电
  112.          CLR P2.0               ;给灯泡通电
  113.          ACALL ADZH2            ;AD转换读取数据
  114.          SETB P2.0              ;灯泡断电
  115.          MOV A,30H
  116.          CJNE A,#00H,L12        ;读取车灯状态,如果为0,表示短路
  117.          MOV 38H,#00010010B     ;作标记,表示1#车灯短路
  118.          SJMP FAHUI
  119. L12:     CJNE A,#10H,L13        ;读取车灯状态,如果为10H,表示正常
  120.          MOV 38H,#00010000B     ;作标记,表示1#车灯正常
  121.          SJMP FAHUI
  122. L13:     CJNE A,#20H,L14        ;读取车灯状态,如果为20H,表示缺灯
  123.          MOV 38H,#00010011B     ;作标记,表示1#车灯缺灯
  124.          SJMP FAHUI
  125. L14:     CJNE A,#0F0H,FAHUI     ;读取车灯状态,如果为F0H,表示开路
  126.          MOV 38H,#00010011B     ;作标记,表示1#车灯开路
  127.          SJMP FAHUI

  128. L11:     CJNE A,#0F0H,FAHUI     ;读取车灯状态,如果为F0H,表示正在通电
  129.          MOV 38H,#00011000B     ;作标记,表示1#车灯通电

  130. FAHUI;  RET


  131. ADZH2:   MOV R0,#11100000B      ;从P1.0通道开始测量,直到P1.7后返回再检测
  132.          MOV R1,#OUT            ;测量后的数值(16进制)分别放到OUT(30H)起8个地址内
  133.          ACALL SET_CH           ;设置P1.*作为A/D转换通道
  134.          ACALL GET_AD           ;测量电压并且取A/D转换结果
  135.          RET
  136. ;=================================================================================
  137. ;车灯状态识别结束
  138. ;=================================================================================







  139. ;=================================================================================
  140. ;向主机发送数据程序
  141. ;=================================================================================
  142. FADM:    CLR TI
  143.          MOV A,@R1
  144.          MOV SBUF,A
  145.          JNB TI,$
  146.          CLR TI
  147.          INC R1
  148.          CJNE R1,#38H,FADM
  149.          MOV R1,#30H
  150.          RET
  151. ;=================================================================================
  152. ;向主机发送数据结束
  153. ;=================================================================================





  154. ;=================================================================================
  155. ;延时子程序
  156. ;=================================================================================
  157. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  158. ;延时500微秒子程序   
  159. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  160. DELAY:   MOV  R7,#229          ;延时 500 微秒,此条2个机器周期
  161.          DJNZ  R7,$
  162.          DJNZ R6,DELAY
  163.          RET                   ;此条2个机器周期,总延时(229*2+2+2)*(12/11.0592)≈500uS
  164. ;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

  165.          END
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表