找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 4260|回复: 1
打印 上一主题 下一主题
收起左侧

多功能检测仪程序(4路温度控制)

[复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-26 23:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. ;*******************************************************************
  2. ;*温度控制程序,在LCD屏幕上显示4路温度(车内外温度、水温、油温)
  3. ;分两页显示,每页显示2路温度,温度传感器开路时语音报警和显示故障
  4. ;水温、油温超温报警
  5. ;*LCD12864显示,晶振11.0592M
  6. ;*******************************************************************
  7. ;-----------------------------------------------------------
  8. ;以下参数可以修改
  9. ;-----------------------------------------------------------
  10.           XSYSSJ    DATA   40     ;显示延时时间
  11.           XSGZSJ    DATA   40     ;故障显示延时时间
  12.           CNBJCS    DATA   2      ;车内温度传感器出故障报警次数
  13.           CWBJCS    DATA   2      ;车外温度传感器出故障报警次数
  14.           SWBJCS    DATA   2      ;水温传感器故出障报警次数
  15.           YWBJCS    DATA   2      ;油温度传感器出故障报警次数
  16.           SWGWSD    DATA   50     ;水温超高报警值(单位℃)
  17.           SWDWSD    DATA   23     ;水温超低报警值(单位℃)
  18.           YWGWSD    DATA   40     ;油温超高报警值(单位℃)
  19.           YWDWSD    DATA   25     ;油温超低报警值(单位℃)
  20.          
  21. ;-----------------------------------------------------------
  22. ;以下参数不宜修改
  23. ;-----------------------------------------------------------
  24.           FLAG0     BIT   20H.0   ;车内温度传感器标志
  25.           FLAG1     BIT   20H.1   ;车外温度传感器标志
  26.           FLAG2     BIT   20H.2   ;水温传感器标志
  27.           FLAG3     BIT   20H.3   ;油温传感器标志

  28.           FLAG4     BIT   20H.4   ;车内温度传感器故障标志位,1为故障0为正常
  29.           FLAG5     BIT   20H.5   ;车外温度传感器故障标志位,1为故障0为正常
  30.           FLAG6     BIT   20H.6   ;水温传感器故障标志位,1为故障0为正常
  31.           FLAG7     BIT   20H.7   ;油温传感器故障标志位,1为故障0为正常

  32.           FLAH0     BIT   21H.0   ;温度正负标志,1为负0为正,正不显示
  33.           FLAH1     BIT   21H.1   ;水温过高标志,1为过高
  34.           FLAH2     BIT   21H.2   ;油温过高标志,1为过高

  35. ;-----------------------------------------------------------
  36.           XSYS      DATA  22H     ;显示延时时间存放单元
  37.           LCD_X     EQU   23H     ;LCD 地址变量

  38.           TEMP_ZH   DATA  24H     ;实时温度值存放单元
  39.           TEMPL     DATA  25H     ;温度低位值存放单元
  40.           TEMPH     DATA  26H     ;温度高位值存放单元
  41.           TEMP_TH   DATA  27H     ;高温报警值存放单元
  42.           TEMP_TL   DATA  28H     ;低温报警值存放单元
  43.           YY_DAT    DATA  29H     ;语音地址存放单元

  44.           CNBJ      DATA  2AH     ;车内温度传感器故障报警次数存放单元
  45.           CWBJ      DATA  2BH     ;车外温度传感器故障报警次数存放单元
  46.           SWBJ      DATA  2CH     ;水温传感器故障报警次数存放单元
  47.           YWBJ      DATA  2DH     ;油温传感器故障报警次数存放单元

  48.           YYDAT     DATA  2EH     ;语音发码值暂存地址
  49. ;-----------------------------------------------------------
  50.           CNCGBJ    DATA   30     ;“车内温度传感器出故障,请检查”语音地址
  51.           CWCGBJ    DATA   31     ;“车外温度传感器出故障,请检查”语音地址
  52.           SWCGBJ    DATA   32     ;“水温传感器出故障,请检查”语音地址
  53.           YWCGBJ    DATA   33     ;“油温传感器出故障,请检查”语音地址
  54. ;-----------------------------------------------------------
  55. ;以下参数是固定的,不要修改
  56. ;-----------------------------------------------------------
  57.           YYRST     EQU   P3.3    ;语音模块复位信号引脚
  58.           BUSY      EQU   P1.0    ;语音忙控制端,0为正在播放1为没有播放
  59.           YYSDA     EQU   P1.1    ;语音模块数据引脚

  60.           CG_CHENEI EQU   P1.4    ;车内温度传感器数据线
  61.           CG_CHEWAI EQU   P1.5    ;车外温度传感器数据线
  62.           CG_SHUIWE EQU   P1.6    ;水温传感器数据线
  63.           CG_YOUWEN EQU   P1.7    ;油温传感器数据线
  64. ;-----------------------------------------------------------
  65.           LCD_RS    EQU   P4.0    ;LCD 数据/命令选择端
  66.           LCD_RW    EQU   P4.1    ;LCD 读/写选择端
  67.           LCD_EN    EQU   P4.2    ;LCD 使能信号
  68.           LCD_BG    EQU   P4.3    ;LCD 背光控制端
  69.           LCD_SJ    EQU   P0      ;LCD 数据




  70. ;===========================================================
  71.           ORG  0000H
  72.           AJMP  MAIN
  73.           ORG  0100H
  74. ;===========================================================
  75. MAIN:     MOV  SP,#60H
  76.           MOV  A,#00H
  77.           MOV  R0,#20H         ;将 20H-2FH 单元清零
  78.           MOV  R1,#10H
  79. CLEAR:    MOV  @R0,A
  80.           INC  R0
  81.           DJNZ  R1,CLEAR
  82.           CLR  LCD_BG          ;打开LCD背光

  83.           CALL  SET_LCD        ;初始化 LCD

  84.           MOV   CNBJ,#CNBJCS   ;设置车内温度传感器故障报警次数
  85.           MOV   CWBJ,#CWBJCS   ;设置车外温度传感器故障报警次数
  86.           MOV   SWBJ,#SWBJCS   ;设置水温传感器故障报警次数
  87.           MOV   YWBJ,#YWBJCS   ;设置油温传感器故障报警次数

  88.           ;LCALL TEMP



  89. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  90. ;##########################################################
  91. ;以下温度显示程序(车内外温度、水温、油温)
  92. ;-----------------------------------------------------------
  93. ;用到的资源:R0~R7,A、B、C,20H~2EH,P4,P3.3,P1.0,P1.4~P1.7
  94. ;-----------------------------------------------------------
  95. ;##########################################################
  96. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  97. ;**************显示第一页温度(车内外温度)

  98. TEMP:     CALL  MENU_OK1       ;显示温度菜单1

  99.           MOV TEMP_TH,#00H     ;温度低位值存放单元
  100.           MOV TEMP_TL,#00H     ;温度低位值存放单元

  101.           SETB  FLAG0          ;开始读取车内温度传感器,设标志为1
  102.           CLR FLAG1
  103.           CLR FLAG2
  104.           CLR FLAG3
  105.           MOV  XSYS,#XSYSSJ    ;每页显示时间

  106. ;读取和显示车内温度
  107. L1:       CALL  RESET          ;18B20复位子程序
  108.           JB   FLAG4,L2        ;检查车外温度传感器是否正常
  109.           CALL  BJ1            ;调用报警程序
  110.           MOV  XSYS,#XSGZSJ    ;重新设每页显示时间
  111.           SJMP  L3             ;传感器出故障不再显示该温度
  112. L2:       CALL  READ_TEMP      ;读出温度与报警数据
  113.           CALL  CONVTEMP       ;转换处理温度为BCD码
  114.           CALL  CONV01         ;显示车内温度

  115. L3:       CLR FLAG0
  116.           SETB FLAG1
  117.           CLR FLAG2
  118.           CLR FLAG3

  119. ;读取和显示车外温度
  120.           CALL  RESET          ;18B20复位子程序
  121.           JB   FLAG5,L4        ;检查车内温度传感器是否正常
  122.           CALL  BJ2            ;调用报警程序
  123.           SJMP  L5             ;传感器出故障不再显示该温度
  124. L4:       CALL  READ_TEMP      ;读出温度与报警数据
  125.           CALL  CONVTEMP       ;转换处理温度为BCD码
  126.           CALL  CONV02         ;显示车外温度

  127. L5:       SETB FLAG0
  128.           CLR FLAG1
  129.           CLR FLAG2
  130.           CLR FLAG3

  131.           JB FLAG4,L71
  132.           JB FLAG5,L71

  133.           MOV R0,#XSGZSJ
  134. L70:      ACALL DELAY
  135.           DJNZ R0,L70
  136.           SJMP L6

  137. L71:      ACALL DELAY          ;延时
  138.           DEC XSYS             ;车内外温度显示页显示一段时间,以便观察
  139.           MOV A,XSYS
  140.           JZ L6
  141.           SJMP L1

  142. ;**************显示第二页温度(水温和油温)

  143. L6:       CALL  MENU_OK2       ;显示温度菜单2
  144.           MOV  XSYS,#XSYSSJ    ;重新设每页显示时间
  145.           CLR FLAG0
  146.           CLR FLAG1
  147.           SETB FLAG2
  148.           CLR FLAG3

  149. ;读取和显示水温
  150. L7:       CALL  RESET          ;传感器复位子程序
  151.           JB   FLAG6,L8        ;检查水温传感器是否正常
  152.           CALL  BJ3            ;调用报警程序
  153.           SJMP  L9
  154. L8:       CALL  READ_TEMP      ;读出温度与报警数据
  155.           CALL  CONVTEMP       ;转换处理温度为BCD码
  156.           CALL  TEMP_COMP      ;温度比较子程序
  157.           CALL  CONV01         ;显示水温

  158. L9:       CLR FLAG0
  159.           CLR FLAG1
  160.           CLR FLAG2
  161.           SETB FLAG3

  162. ;读取和显示油温
  163.           CALL  RESET          ;传感器复位子程序
  164.           JB   FLAG7,L10       ;检查油温传感器是否正常
  165.           CALL  BJ4            ;调用报警程序
  166.           SJMP  L11
  167. L10:      CALL  READ_TEMP      ;读出温度与报警数据
  168.           CALL  CONVTEMP       ;转换处理温度为BCD码
  169.           CALL  TEMP_COMP      ;温度比较子程序
  170.           CALL  CONV02         ;显示油温

  171. L11:      CLR FLAG0
  172.           CLR FLAG1
  173.           SETB FLAG2
  174.           CLR FLAG3

  175.           JB FLAG6,L81
  176.           JB FLAG7,L81

  177.           MOV R0,#XSGZSJ
  178. L80:      ACALL DELAY
  179.           DJNZ R0,L80
  180.           SJMP L82

  181. L81:      ACALL DELAY
  182.           DEC XSYS              ;水温、油温显示页显示一段时间,以便观察
  183.           MOV A,XSYS
  184.           JZ L82
  185.           AJMP L7
  186. L82:      AJMP MAIN
  187.           RET

  188. ;------------------------------------------------------
  189. ;报警程序,传感器故障声音报警和LCD显示
  190. ;------------------------------------------------------
  191. BJ1:      MOV A,CNBJ        ;车内温度故障报警和显示
  192.           JZ L13            ;声音报警N次后不再报警,只显示故障
  193.           MOV YY_DAT,#CNCGBJ;报出“车内温度传感器出故障,请检查”
  194.           JNB BUSY,L13      ;如果正在播放语音则跳过,只显示故障
  195.           DEC CNBJ          ;车内温度传感器语音报警次数倒计数
  196.           SJMP L12          ;故障语音报警

  197. BJ2:      MOV A,CWBJ        ;车外温度故障报警和显示
  198.           JZ L15            ;声音报警N次后不再报警,只显示故障
  199.           MOV YY_DAT,#CWCGBJ;报出“车外温度传感器出故障,请检查”
  200.           JNB BUSY,L15      ;如果正在播放语音则跳过,只显示故障
  201.           DEC CWBJ          ;车外温度传感器语音报警次数倒计数
  202.           SJMP L14          ;故障显示

  203. BJ3:      MOV A,SWBJ        ;水温故障报警和显示
  204.           JZ L13            ;声音报警N次后不再报警,只显示故障
  205.           MOV YY_DAT,#SWCGBJ;报出“水温传感器出故障,请检查”
  206.           JNB BUSY,L13      ;如果正在播放语音则跳过,只显示故障
  207.           DEC SWBJ          ;水温传感器语音报警次数倒计数
  208. L12:      ACALL YUYIN       ;语音播放
  209. L13:      MOV  A,#90H        ;显示在第二行
  210.           SJMP L16          ;故障显示

  211. BJ4:      MOV A,YWBJ        ;油温故障报警和显示
  212.           JZ L15            ;声音报警N次后不再报警,只显示故障
  213.           MOV YY_DAT,#YWCGBJ;报出“油温传感器出故障,请检查”
  214.           JNB BUSY,L15      ;如果正在播放语音则跳过,只显示故障
  215.           DEC YWBJ          ;油温传感器语音报警次数倒计数
  216. L14:      ACALL YUYIN       ;语音播放
  217. L15:      MOV  A,#98H       ;显示在第四行

  218. L16:      MOV  DPTR,#MUNE1  ;指针指到显示信息区
  219.           CALL  WCOM
  220. L203:     CLR  A            ;填入字符
  221.           MOVC  A,@A+DPTR   ;由信息区取出字符
  222.           CJNE  A,#0,L205   ;判断是否为结束码
  223.           RET

  224. L205:     CALL  WDATA       ;写入数据
  225.           INC  DPTR         ;指针加1
  226.           JMP  L203         ;继续填入字符

  227. MUNE1:    DB"探头故障请检查!",0 ;温度探头不正常报警程序

  228. ;--------------------------------------------------------------------
  229. ;传感器读温度子程序
  230. ; 将温度低位、高位、TH、TL从传感器中读出
  231. ; 分别存入 25H、26H、27H、28H 单元中
  232. ;--------------------------------------------------------------------
  233. READ_TEMP:MOV   A,#0CCH        ; 跳过ROM匹配
  234.          CALL  WRITE
  235.          MOV   A,#44H          ; 发出温度转换命令
  236.          CALL  WRITE
  237.          CALL  RESET
  238.          MOV   A,#0CCH         ; 跳过ROM匹配
  239.          CALL  WRITE
  240.          MOV   A,#0BEH         ; 发出读温度命令
  241.          CALL  WRITE           ;先写入命令

  242.          MOV R4,#4             ;存入4个单元中
  243.          MOV R1,#TEMPL         ;存入单元的首地址送入 R1
  244. RE00:    MOV R2,#8             ;8位数据长度
  245. RE01:    CLR CY
  246. ;***********************
  247.          JNB FLAG0,L01
  248.          SETB CG_CHENEI
  249.          NOP
  250.          NOP
  251.          CLR CG_CHENEI        ;读前总线保持为低
  252.          NOP
  253.          NOP
  254.          NOP
  255.          SETB CG_CHENEI       ;开始读总线释放
  256.          MOV R3,#07           ;延时15微妙
  257.          DJNZ R3,$
  258.          MOV C,CG_CHENEI      ;从传感器总线读得一个BIT
  259.          AJMP L5A

  260. L01:     JNB FLAG1,L02
  261.          SETB CG_CHEWAI
  262.          NOP
  263.          NOP
  264.          CLR CG_CHEWAI        ;读前总线保持为低
  265.          NOP
  266.          NOP
  267.          NOP
  268.          SETB CG_CHEWAI       ;开始读总线释放
  269.          MOV R3,#07           ;延时15微妙
  270.          DJNZ R3,$
  271.          MOV C,CG_CHEWAI      ;从传感器总线读得一个BIT
  272.          AJMP L5A

  273. L02:     JNB FLAG2,L03
  274.          SETB CG_SHUIWE
  275.          NOP
  276.          NOP
  277.          CLR CG_SHUIWE        ;读前总线保持为低
  278.          NOP
  279.          NOP
  280.          NOP
  281.          SETB CG_SHUIWE       ;开始读总线释放
  282.          MOV R3,#07           ;延时15微妙
  283.          DJNZ R3,$
  284.          MOV C,CG_SHUIWE      ;从传感器总线读得一个BIT
  285. L0:      AJMP L5A

  286. L03:     JNB FLAG3,L0
  287.          SETB CG_YOUWEN
  288.          NOP
  289.          NOP
  290.          CLR CG_YOUWEN        ;读前总线保持为低
  291.          NOP
  292.          NOP
  293.          NOP
  294.          SETB CG_YOUWEN       ;开始读总线释放
  295.          MOV R3,#07           ;延时15微妙
  296.          DJNZ R3,$
  297.          MOV C,CG_YOUWEN      ;从传感器总线读得一个BIT
  298. ;*****************************
  299. L5A:     MOV R3,#3CH
  300.          DJNZ R3,$            ;等待100微妙
  301.          RRC A                ;把读得的位值环移给A
  302.          DJNZ R2,RE01         ;读下一个BIT
  303.          MOV @R1,A
  304.          INC R1
  305.          DJNZ R4,RE00         ;没有读完,继续
  306. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  307. ;         JB FLAG0,L000
  308. ;         PUSH A
  309. ;         MOV A,#WENDSD
  310. ;         CLR C
  311. ;         SUBB  A,TEMPL      ;减数>被减数,则
  312. ;        JC L00
  313. ;         SETB FLAH3
  314. ;L00:     POP A
  315. L000:    RET
  316. ;*****************************************************
  317. ;处理温度 BCD 码子程序
  318. ;整数部分:取出 TEMPL 高四位和 TEMPH 低四位进行重新组合
  319. ;小数部分:取出 TEMPL 低四位,查小数码表
  320. ;****************************************************
  321. CONVTEMP:MOV  A,TEMPH       ;判温度是否零下
  322.          ANL  A,#80H
  323.          JZ  TEMPC1         ;温度零上转
  324.          SETB FLAH0         ;温度为负值
  325.          CLR  C
  326.          MOV  A,TEMPL       ;二进制数求补(双字节)
  327.          CPL  A             ;取反加1
  328.          ADD  A,#01H
  329.          MOV  TEMPL,A
  330.          MOV  A,TEMPH
  331.          CPL  A
  332.          ADDC  A,#00H
  333.          MOV  TEMPH,A
  334.          JMP  TEMPC2

  335. TEMPC1:  CLR  FLAH0               ;温度为正值
  336. TEMPC2:  MOV  A,TEMPL
  337.          ANL  A,#0FH              ;取出小数部分
  338.          MOV  B,#10               ;将TEMP_L的低四位X10/16得小数后一位数.
  339.          MUL  AB
  340.   MOV  B,#16
  341.   DIV  AB
  342.          MOV  70H,A               ;小数部分 BCD

  343.          MOV  A,TEMPL             ;整数部分
  344.          ANL  A,#0F0H             ;取出高四位
  345.          SWAP  A
  346.          MOV  TEMPL,A
  347.          MOV  A,TEMPH             ;取出低四位
  348.          ANL  A,#0FH
  349.          SWAP  A
  350.          ORL  A,TEMPL             ;重新组合温度数据
  351.          MOV  TEMP_ZH,A           ;重新组合的温度数据存入TEMP_ZH
  352.          LCALL  HEX2BCD1

  353.          MOV  TEMPL,A             ;(A)=十位数和个位数
  354.          ANL  A,#0F0H
  355.          SWAP  A
  356.          MOV  72H,A               ;十位数 BCD
  357.          MOV  A,TEMPL
  358.          ANL  A,#0FH
  359.          MOV  71H,A               ;个位数 BCD
  360.          MOV  A,R4                ;(R4)= 百位数
  361.          MOV  73H,A

  362. TEMPC3:  RET
  363. ;====================================================
  364. ;单字节十六进制转BCD
  365. ;入口:(A)=单字节十六进制的温度值
  366. ;出口:(R4)= 百位数,(A)=十位数和个位数
  367. ;====================================================
  368. HEX2BCD1:MOV  B,#64H
  369.          DIV  AB
  370.          MOV  R4,A             ;(R4)=百位数
  371.          MOV  A,#0AH
  372.          XCH  A,B
  373.          DIV  AB
  374.          SWAP  A
  375.          ORL  A,B             ;(A)=十位数和个位数
  376.          RET

  377. ;==========================================================
  378. ; LCD 温度值显示子程序
  379. ;73H-70H 分别存放百位、十位、个位、小数位的数据
  380. ;==========================================================
  381. CONV01:   MOV  A,73H         ;加载百位数据
  382.           MOV  LCD_X,#1      ;设置显示位置
  383.           JNB  FLAH0,CONV0   ;
  384.           MOV  A,#"-"        ;显示"-"
  385.           MOV  B,LCD_X
  386.           CALL  LCDP2

  387.           MOV  A,72H         ;十位
  388.           CJNE A,#00H,CONV3
  389.           INC  LCD_X         ;调整显示地址
  390.           MOV  A,#" "        ;十位数等于0显示空格
  391.           MOV  B,LCD_X
  392.           CALL  LCDP2
  393.           JMP  CONV4

  394. CONV0:    CJNE A,#00H,CONV2

  395. CONV1:    MOV  A,#" "        ;百位数等于0显示空格
  396.           MOV  B,LCD_X
  397.           CALL  LCDP2
  398.           MOV  A,72H         ;十位
  399.           CJNE A,#00H,CONV3
  400.           INC  LCD_X         ;调整显示地址
  401.           MOV  A,#" "        ;十位数等于0显示空格
  402.           MOV  B,LCD_X
  403.           CALL  LCDP2
  404.           JMP  CONV4

  405. CONV2:    CALL  SHOW_DIG2    ;显示数据

  406. CONV3:    INC  LCD_X         ;调整显示地址
  407.           MOV  A,72H         ;十位
  408.           CALL  SHOW_DIG2

  409. CONV4:    INC  LCD_X         ;调整显示地址
  410.           MOV  A,71H         ;个位
  411.           CALL  SHOW_DIG2
  412.           INC  LCD_X         ;调整显示地址
  413.           MOV  A,#'.'
  414.           MOV  B,LCD_X
  415.           CALL  LCDP2
  416.           MOV  A,70H         ;加载小数位
  417.           INC  LCD_X         ;设置位置
  418.           CALL  SHOW_DIG2    ;显示数据
  419.           RET
  420. ;=============================================
  421. ;在LCD的第二行显示数据字符
  422. ;A=ASCII 数据, B=位置变量
  423. ;==============================================
  424. LCDP2:   PUSH  ACC        ;在LCD的第二行显示字符
  425.          MOV  A,B         ;设置显示地址
  426.          ADD  A,#90H     ;设置LCD的第二行地址
  427.          CALL  WCOM       ;写入命令
  428.          POP  ACC         ;由堆栈取出A
  429.          CALL  WDATA      ;写入数据
  430.          RET
  431. ;-------------------------------------------------------
  432. SHOW_DIG2:                 ;在 LCD 的第二行显示数字
  433.           ADD  A,#30H      ;加30H,转换为ASCII码
  434.           MOV  B,LCD_X     ;确定显示位置
  435.           CALL  LCDP2      ;送显示
  436.           RET
  437. ;*************************************************************************
  438. ;==========================================================
  439. ; LCD 温度值显示子程序2,显示在第四行
  440. ;73H-70H 分别存放百位、十位、个位、小数位的数据
  441. ;==========================================================
  442. CONV02:   MOV  A,73H         ;加载百位数据
  443.           MOV  LCD_X,#1      ;设置显示位置
  444.           JNB  FLAH0,CONV10   ;
  445.           MOV  A,#"-"        ;显示"-"
  446.           MOV  B,LCD_X
  447.           CALL  LCDP4

  448.           MOV  A,72H         ;十位
  449.           CJNE A,#00H,CONV13
  450.           INC  LCD_X         ;调整显示地址
  451.           MOV  A,#" "        ;十位数等于0显示空格
  452.           MOV  B,LCD_X
  453.           CALL  LCDP4
  454.           JMP  CONV14

  455. CONV10:   CJNE A,#00H,CONV12

  456. CONV11:   MOV  A,#" "        ;百位数等于0显示空格
  457.           MOV  B,LCD_X
  458.           CALL  LCDP4
  459.           MOV  A,72H         ;十位
  460.           CJNE A,#00H,CONV13
  461.           INC  LCD_X         ;调整显示地址
  462.           MOV  A,#" "        ;十位数等于0显示空格
  463.           MOV  B,LCD_X
  464.           CALL  LCDP4
  465.           JMP  CONV14

  466. CONV12:   CALL  SHOW_DIG4    ;显示数据

  467. CONV13:   INC  LCD_X         ;调整显示地址
  468.           MOV  A,72H         ;十位
  469.           CALL  SHOW_DIG4

  470. CONV14:   INC  LCD_X         ;调整显示地址
  471.           MOV  A,71H         ;个位
  472.           CALL  SHOW_DIG4
  473.           INC  LCD_X         ;调整显示地址
  474.           MOV  A,#'.'
  475.           MOV  B,LCD_X
  476.           CALL  LCDP4
  477.           MOV  A,70H         ;加载小数位
  478.           INC  LCD_X         ;设置位置
  479.           CALL  SHOW_DIG4    ;显示数据
  480.           RET
  481. ;=============================================
  482. ;在LCD的第二行显示数据字符
  483. ;A=ASCII 数据, B=位置变量
  484. ;==============================================
  485. LCDP4:   PUSH  ACC        ;在LCD的第二行显示字符
  486.          MOV  A,B         ;设置显示地址
  487.          ADD  A,#98H      ;设置LCD的第二行地址
  488.          CALL  WCOM       ;写入命令
  489.          POP  ACC         ;由堆栈取出A
  490.          CALL  WDATA      ;写入数据
  491.          RET
  492. ;-------------------------------------------------------
  493. SHOW_DIG4:                 ;在 LCD 的第二行显示数字
  494.           ADD  A,#30H      ;加30H,转换为ASCII码
  495.           MOV  B,LCD_X     ;确定显示位置
  496.           CALL  LCDP4      ;送显示
  497.           RET
  498. ;*************************************************************************
  499. ;------------------------------------------------------------------
  500. ;传感器 写命令、数据子程序
  501. ;根据命令的内容,进行写操作
  502. ;------------------------------------------------------------------
  503. WRITE:  MOV R2,#8            ;8位数据长度
  504.         CLR  C
  505. WR1:    JNB FLAG0,L21
  506.         CLR CG_CHENEI        ;开始写入传感器总线要处于复位(低)状态
  507.         MOV R3,#08
  508.         DJNZ R3,$            ;总线复位保持16微妙以上
  509.         RRC A                ;把一个字节DATA 分成8个BIT环移给C
  510.         MOV CG_CHENEI,C      ;写入一个BIT
  511.         MOV R3,#3CH
  512.         DJNZ R3,$            ;等待120微妙
  513.         SETB CG_CHENEI       ;重新释放总线
  514.         NOP
  515.         DJNZ R2,WR1          ;写入下一个BIT
  516.         SETB CG_CHENEI
  517.         RET

  518. L21:    JNB FLAG1,L22
  519.         CLR CG_CHEWAI        ;开始写入传感器总线要处于复位(低)状态
  520.         MOV R3,#08
  521.         DJNZ R3,$            ;总线复位保持16微妙以上
  522.         RRC A                ;把一个字节DATA 分成8个BIT环移给C
  523.         MOV CG_CHEWAI,C      ;写入一个BIT
  524.         MOV R3,#3CH
  525.         DJNZ R3,$            ;等待120微妙
  526.         SETB CG_CHEWAI       ;重新释放总线
  527.         NOP
  528.         DJNZ R2,WR1          ;写入下一个BIT
  529.         SETB CG_CHEWAI
  530.         RET

  531. L22:    JNB FLAG2,L23
  532.         CLR CG_SHUIWE        ;开始写入传感器总线要处于复位(低)状态
  533.         MOV R3,#08
  534.         DJNZ R3,$            ;总线复位保持16微妙以上
  535.         RRC A                ;把一个字节DATA 分成8个BIT环移给C
  536.         MOV CG_SHUIWE,C      ;写入一个BIT
  537.         MOV R3,#3CH
  538.         DJNZ R3,$            ;等待120微妙
  539.         SETB CG_SHUIWE       ;重新释放总线
  540.         NOP
  541.         DJNZ R2,WR1          ;写入下一个BIT
  542.         SETB CG_SHUIWE
  543.         RET

  544. L23:    JNB FLAG3,L24
  545.         CLR CG_YOUWEN        ;开始写入传感器总线要处于复位(低)状态
  546.         MOV R3,#08
  547.         DJNZ R3,$            ;总线复位保持16微妙以上
  548.         RRC A                ;把一个字节DATA 分成8个BIT环移给C
  549.         MOV CG_YOUWEN,C      ;写入一个BIT
  550.         MOV R3,#3CH
  551.         DJNZ R3,$            ;等待120微妙
  552.         SETB CG_YOUWEN       ;重新释放总线
  553.         NOP
  554.         DJNZ R2,WR1          ;写入下一个BIT
  555.         SETB CG_YOUWEN
  556. L24:    RET

  557. ;=================================================
  558. MENU_OK1: MOV  DPTR,#M_OK11  ;指针指到显示信息区
  559.           MOV  A,#1          ;显示在第一行
  560.           CALL  LCD_PRINT
  561.           MOV  DPTR,#M_OK12  ;指针指到显示信息区
  562.           MOV  A,#2          ;显示在第二行
  563.           CALL  LCD_PRINT
  564.           MOV  DPTR,#M_OK13  ;指针指到显示信息区
  565.           MOV  A,#3          ;显示在第二行
  566.           CALL  LCD_PRINT
  567.           MOV  DPTR,#M_OK14  ;指针指到显示信息区
  568.           MOV  A,#4          ;显示在第二行
  569.           CALL  LCD_PRINT
  570.           RET
  571. M_OK11:   DB"车内温度:      ",0
  572. M_OK12:   DB"            ℃ ",0
  573. M_OK13:   DB"车外温度:      ",0
  574. M_OK14:   DB"            ℃ ",0
  575. ;=================================================
  576. MENU_OK2: MOV  DPTR,#M_OK21  ;指针指到显示信息区
  577.           MOV  A,#1          ;显示在第一行
  578.           CALL  LCD_PRINT
  579.           MOV  DPTR,#M_OK22  ;指针指到显示信息区
  580.           MOV  A,#2          ;显示在第二行
  581.           CALL  LCD_PRINT
  582.           MOV  DPTR,#M_OK23  ;指针指到显示信息区
  583.           MOV  A,#3          ;显示在第二行
  584.           CALL  LCD_PRINT
  585.           MOV  DPTR,#M_OK24  ;指针指到显示信息区
  586.           MOV  A,#4          ;显示在第二行
  587.           CALL  LCD_PRINT
  588.           RET
  589. M_OK21:   DB"水温:         ",0
  590. M_OK22:   DB"            ℃ ",0
  591. M_OK23:   DB"油温:         ",0
  592. M_OK24:   DB"            ℃ ",0

  593. ;==================================================
  594. ;在LCD的第一行或第二行显示字符串
  595. ;DPTR = 放字符串的地址
  596. ;==================================================
  597. LCD_PRINT:CJNE  A,#1,LINE2  ;判断是否为第一行
  598. LINE1:    MOV  A,#80H       ;设置 LCD 的第一行地址
  599.           CALL  WCOM        ;写入命令
  600.           CALL  CLR_LINE    ;清除该行字符数据
  601.           MOV  A,#80H       ;设置 LCD 的第一行地址
  602.           CALL  WCOM        ;写入命令
  603.           JMP  FILL

  604. LINE2:    CJNE  A,#2,LINE3  ;判断是否为第二行
  605.           MOV  A,#90H       ;设置 LCD 的第二行地址
  606.           CALL  WCOM        ;写入命令
  607.           CALL  CLR_LINE    ;清除该行字符数据
  608.           MOV  A,#90H       ;设置 LCD 的第二行地址
  609.           CALL  WCOM
  610.           JMP  FILL

  611. LINE3:    CJNE  A,#3,LINE4  ;判断是否为第三行
  612.           MOV  A,#88H       ;设置 LCD 的第三行地址
  613.           CALL  WCOM        ;写入命令
  614.           CALL  CLR_LINE    ;清除该行字符数据
  615.           MOV  A,#88H       ;设置 LCD 的第三行地址
  616.           CALL  WCOM
  617.           JMP  FILL

  618. LINE4:    MOV  A,#98H      ;设置 LCD 的第四行地址
  619.           CALL  WCOM        ;写入命令
  620.           CALL  CLR_LINE    ;清除该行字符数据
  621.           MOV  A,#98H      ;设置 LCD 的第四行地址
  622.           CALL  WCOM

  623. FILL:     CLR  A            ;填入字符
  624.           MOVC  A,@A+DPTR   ;由信息区取出字符
  625.           CJNE  A,#0,LC1    ;判断是否为结束码
  626.           RET

  627. LC1:      CALL  WDATA       ;写入数据
  628.           INC  DPTR         ;指针加1
  629.           JMP  FILL         ;继续填入字符
  630. ;===============================================
  631. ;清除一行 LCD 的字符
  632. ;输入一行空格,来替代原显示字符
  633. ;===============================================
  634. CLR_LINE: MOV  R0,#24       ;清除该行 LCD 的字符
  635. CL1:      MOV  A,#' '
  636.           CALL  WDATA
  637.           DJNZ  R0,CL1
  638.           RET
  639. ;====================================================
  640. ;传感器 复位与检测子程序
  641. ;传感器 正常 FLAG* 置 1,不正常 FLAG* 置 0。
  642. ;====================================================
  643. RESET:  JNB FLAG0,L31
  644.         SETB CG_CHENEI        ;
  645.         NOP
  646.         CLR CG_CHENEI
  647.         MOV R0,#6BH           ;主机发出延时复位低脉冲
  648.         MOV R1,#04H
  649. TSR11:  DJNZ R0,$             ;延时
  650.         MOV R0,#6BH
  651.         DJNZ R1,TSR11
  652.         SETB CG_CHENEI        ;然后拉高数据线
  653.         NOP
  654.         NOP
  655.         NOP
  656.         MOV R0,#32H
  657. TSR21:  JNB CG_CHENEI,TSR31   ;等待传感器回应
  658.         DJNZ R0,TSR21
  659.         JMP TSR41             ; 延时
  660. TSR31:  SETB FLAG4            ; 置标志位,表示DS1820存在
  661.         JMP TSR51
  662. TSR41:  CLR FLAG4             ; 清标志位,表示DS1820不存在
  663.         JMP TSR61
  664. TSR51:  MOV R0,#06BH
  665.         DJNZ R0,$             ; 时序要求延时一段时间
  666. TSR61:  SETB CG_CHENEI
  667.         RET
  668. ;------------------------
  669. L31:    JNB FLAG1,L32
  670.         SETB CG_CHEWAI        ;
  671.         NOP
  672.         CLR CG_CHEWAI
  673.         MOV R0,#6BH           ;主机发出延时复位低脉冲
  674.         MOV R1,#04H
  675. TSR12:  DJNZ R0,$             ;延时
  676.         MOV R0,#6BH
  677.         DJNZ R1,TSR12
  678.         SETB CG_CHEWAI        ;然后拉高数据线
  679.         NOP
  680.         NOP
  681.         NOP
  682.         MOV R0,#32H
  683. TSR22:  JNB CG_CHEWAI,TSR32   ;等待传感器回应
  684.         DJNZ R0,TSR22
  685.         JMP TSR42             ; 延时
  686. TSR32:  SETB FLAG5            ; 置标志位,表示DS1820存在
  687.         JMP TSR52
  688. TSR42:  CLR FLAG5             ; 清标志位,表示DS1820不存在
  689.         JMP TSR62
  690. TSR52:  MOV R0,#06BH
  691.         DJNZ R0,$             ; 时序要求延时一段时间
  692. TSR62:  SETB CG_CHEWAI
  693.         RET
  694. ;------------------------
  695. L32:    JNB FLAG2,L33
  696.         SETB CG_SHUIWE        ;
  697.         NOP
  698.         CLR CG_SHUIWE
  699.         MOV R0,#6BH           ;主机发出延时复位低脉冲
  700.         MOV R1,#04H
  701. TSR13:  DJNZ R0,$             ;延时
  702.         MOV R0,#6BH
  703.         DJNZ R1,TSR13
  704.         SETB CG_SHUIWE        ;然后拉高数据线
  705.         NOP
  706.         NOP
  707.         NOP
  708.         MOV R0,#32H
  709. TSR23:  JNB CG_SHUIWE,TSR33   ;等待传感器回应
  710.         DJNZ R0,TSR23
  711.         JMP TSR43             ; 延时
  712. TSR33:  SETB FLAG6            ; 置标志位,表示DS1820存在
  713.         JMP TSR53
  714. TSR43:  CLR FLAG6             ; 清标志位,表示DS1820不存在
  715.         JMP TSR63
  716. TSR53:  MOV R0,#06BH
  717.         DJNZ R0,$             ; 时序要求延时一段时间
  718. TSR63:  SETB CG_SHUIWE
  719.         RET
  720. ;------------------------
  721. L33:    JNB FLAG3,L34
  722.         SETB CG_YOUWEN        ;
  723.         NOP
  724.         CLR CG_YOUWEN
  725.         MOV R0,#6BH           ;主机发出延时复位低脉冲
  726.         MOV R1,#04H
  727. TSR14:  DJNZ R0,$             ;延时
  728.         MOV R0,#6BH
  729.         DJNZ R1,TSR14
  730.         SETB CG_YOUWEN        ;然后拉高数据线
  731.         NOP
  732.         NOP
  733.         NOP
  734.         MOV R0,#32H
  735. TSR24:  JNB CG_YOUWEN,TSR34   ;等待传感器回应
  736.         DJNZ R0,TSR24
  737.         JMP TSR44             ; 延时
  738. TSR34:  SETB FLAG7            ; 置标志位,表示DS1820存在
  739.         JMP TSR54
  740. TSR44:  CLR FLAG7             ; 清标志位,表示DS1820不存在
  741.         JMP TSR64
  742. TSR54:  MOV R0,#06BH
  743.         DJNZ R0,$             ; 时序要求延时一段时间
  744. TSR64:  SETB CG_YOUWEN
  745. L34:    RET
  746. ;------------------------

  747. ;==========================================================
  748. ;=================================================
  749. ;对 LCD 做初始化设置
  750. ;=================================================
  751. SET_LCD:  MOV A,#34H      ;34H--扩充指令操作
  752.           CALL  WCOM         ;写入命令
  753.    MOV A,#30H      ;30H--基本指令操作
  754.           CALL  WCOM         ;写入命令
  755.    MOV A,#01H      ;清除显示
  756.           CALL  WCOM         ;写入命令
  757.           MOV A,#06H      ;指定在资料写入或读取时,光标的移动方向
  758.           CALL  WCOM         ;DDRAM 的地址计数器(AC)加1
  759.    MOV A,#0CH      ;开显示,关光标,不闪烁
  760.           CALL  WCOM         ;写入命令

  761.           RET

  762. ;==================================================
  763. ;===============================================
  764. ;命令写入子程序
  765. ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
  766. ;以8位控制方式将命令写至LCD
  767. ;===============================================
  768. WCOM:    LCALL CHK_BUSY
  769.   CLR LCD_RS
  770.   CLR LCD_RW
  771.   MOV LCD_SJ,A
  772.   SETB LCD_EN
  773.   NOP
  774.   NOP
  775.   CLR LCD_EN
  776.   RET
  777. ;===============================================
  778. ;数据写入子程序
  779. ;RS=H,RW=L,D0-D7=指令码,E=高脉冲
  780. ;以8位控制方式将数据写至LCD
  781. ;===============================================
  782. WDATA:    MOV  LCD_SJ,A       ;写入数据
  783.           SETB  LCD_RS
  784.           CLR  LCD_RW
  785.           SETB  LCD_EN
  786.           CALL  DE
  787.           CLR  LCD_EN
  788.           CALL  DE
  789.           RET
  790. ;**********************************************************

  791. ;测忙碌子程序
  792. ;RS=0,RW=1,E=H,D0-D7=状态字

  793. ;**********************************************************
  794. CHK_BUSY:  MOV LCD_SJ,#0FFH    ;测忙碌子程序
  795.     CLR LCD_RS
  796.     SETB LCD_RW
  797.     SETB LCD_EN
  798.     JB LCD_SJ.7,$
  799.     CLR LCD_EN
  800.     RET

  801. ;====================================================
  802. ;实时温度值与设定报警温度值 TH、TL 比较子程序
  803. ;当实际温度大于 TH 的设定值时,显示“过高”并闪动显示
  804. ;当实际温度小于 TH 的设定值时,显示“正常”
  805. ;当实际温度小于 TL 的设定值时,显示“过低”
  806. ;====================================================
  807. TEMP_COMP:JNB FLAG2,L101
  808.           MOV TEMP_TH,#SWGWSD
  809.           MOV TEMP_TL,#SWDWSD      ;设置 LCD 的第一行地址
  810.           SJMP L102
  811. L101:     JNB FLAG3,L103
  812.           MOV TEMP_TH,#YWGWSD
  813.           MOV TEMP_TL,#YWDWSD

  814. L102:     MOV  A,TEMP_ZH
  815.           CJNE  A,TEMP_TH,T_COMP0
  816. T_COMP0:  JNC   CHULI1
  817.           MOV  A,TEMP_ZH
  818.           SUBB  A,TEMP_TL       ;减数>被减数,则
  819.           JC  CHULI2            ;借位标志位C=1,转

  820.           MOV  DPTR,#BJ50       ;显示"正常"
  821.           CALL  TEMP_BJ3
  822.           CLR   FLAG1           ;清除报警标志
  823. L103:     RET

  824. CHULI1:   MOV  DPTR,#BJ60       ;形成闪烁效果
  825.           CALL  TEMP_BJ3
  826.           MOV  R5,#10           ;延时10MS
  827.           ACALL DELAY1
  828.           MOV  DPTR,#BJ30       ;显示"过高"
  829.           CALL  TEMP_BJ3
  830.           SETB  FLAG1           ;设置报警标志
  831.           RET

  832. CHULI2:   MOV  DPTR,#BJ40       ;显示"过低"
  833.           CALL  TEMP_BJ3
  834.           CLR   FLAG1           ;清除报警标志
  835.           RET
  836. ;=========================================
  837. ;标记字符写入子程序
  838. ;=========================================
  839. TEMP_BJ3: JNB FLAG2,L001
  840.           MOV  A,#86H       ;设置 LCD 的第一行地址
  841.           SJMP L002
  842. L001:     JNB FLAG3,L004
  843.           MOV  A,#8EH       ;设置 LCD 的第三行地址
  844. L002:     CALL  WCOM
  845. L003:     CLR  A            ;填入字符
  846.           MOVC  A,@A+DPTR   ;由信息区取出字符
  847.           CJNE  A,#0,L005   ;判断是否为结束码
  848. L004:     RET

  849. L005:     CALL  WDATA       ;写入数据
  850.           INC  DPTR         ;指针加1
  851.           JMP  L003         ;继续填入字符

  852. BJ30:     DB  "过高",0      ;过高标记
  853. BJ40:     DB  "过低",0      ;正常标记
  854. BJ50:     DB  "正常",0      ;过低标记
  855. BJ60:     DB  "    ",0      ;过低标记
  856. ;**********************************************************
  857. ;语音驱动和播放程序
  858. ;**********************************************************
  859. ;50H为语音段地址暂存器,1到210段,实际用到40
  860. ;50H为E0H~E7H时分别代表自低往高的8级音量
  861. ;在语音播放过程中发送F2H至50H可循环播放当前地址语音
  862. ;发送FEH至50H停止播放语音
  863. ;****************************************************
  864. YUYIN: RET        ;$$$$$$$$$$$$$
  865.        MOV TMOD,#00000001B ;定时/计数器0工作于方式1
  866.        MOV R6,#08H         ;发码8位循环数据
  867.        LCALL ONE_LINE      ;调用一线发码子程序
  868.        RET

  869. ONE_LINE:                  ;////一线发码子程序
  870.        SETB YYRST          ;复位
  871.        MOV R7,#2           ;延时2MS
  872.        LCALL DELAY1MS
  873.        CLR YYRST           ;延时使系统稳定
  874.        MOV R7,#6           ;延时6MS
  875.        LCALL DELAY1MS
  876.        CLR YYSDA           ;唤醒语音芯片
  877.        MOV R7,#17          ;延时17MS
  878.        LCALL DELAY1MS
  879.        MOV A,YY_DAT

  880. LP1:   SETB YYSDA
  881.        RRC A               ;分辨50H内的数据各位是高电平还是低电平
  882.        JNC DIDIANPIN       ;高电平用高:低=2:1的脉宽表示
  883.        LCALL DELAY200US
  884.        LCALL DELAY200US
  885.        LCALL DELAY200US
  886.        CLR YYSDA
  887.        LCALL DELAY200US
  888. LP2:   DJNZ R6,LP1         ;查看数据是否发完,未发完继续发
  889.        MOV R6,#08H
  890.        SETB YYSDA
  891.        RET

  892. DIDIANPIN:                 ;低电平用高:低=1:2的脉宽表示
  893.        LCALL DELAY200US
  894.        CLR YYSDA
  895.        LCALL DELAY200US
  896.        LCALL DELAY200US
  897.        LCALL DELAY200US
  898.        SJMP LP2

  899. ;以下为延时子程序
  900. DELAY200US:                ;延时200US子程序,晶振11.0592MHz,方式1
  901.        MOV  TH0,#0FFH
  902.        MOV  TL0,#47H
  903.        SETB TR0
  904. LOP1:  JBC  TF0,NEXT1
  905.        SJMP LOP1
  906. NEXT1: CLR TR0
  907.        RET

  908. DELAY1MS:                  ;延时1ms子程序
  909.        MOV  TH0,#0FCH
  910.        MOV  TL0,#66H
  911.        SETB TR0
  912. LOP2:  JBC  TF0,NEXT2
  913.        SJMP LOP2
  914. NEXT2: DJNZ R7,DELAY1MS
  915.        CLR TR0
  916.        RET
  917. ;**********************************************************
  918. ;延时子程序
  919. ;**********************************************************
  920. DE:       MOV  R7,#250        ;延时 500 微秒
  921.           DJNZ  R7,$
  922.           RET
  923. ;===============================================
  924. DELAY:   MOV  R5,#20      ;延时20MS
  925. DELAY1:  MOV  R6,#48      ;50
  926. DL1:     MOV  R7,#96      ;100
  927.          DJNZ  R7,$
  928.          DJNZ  R6,DL1
  929.          DJNZ  R5,DELAY1
  930.          RET              ;96*2*48*(12/11.0592)+2*(12/11.0592)≈10000uS=10mS

  931.           END
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

举报

沙发
ID:72846 发表于 2015-1-28 11:46 | 只看该作者
我测试下,感谢分享
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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