找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4544|回复: 0
打印 上一主题 下一主题
收起左侧

电压检测程序

[复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-26 23:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1.           LCD_X  EQU   23H        ;LCD 地址变量(决定文字的在LCD上的显示位置)
  2.           FSJCQ  EQU   33H        ;TMOD工作方式暂存寄存器
  3.           BJZC   EQU   34H        ;需要比较数据暂存寄存器,用于报警显示
  4.           BJWX   EQU   35H        ;超标设定值暂存寄存器
  5.           BJJG   EQU   36H        ;偏高设定值暂存寄存器
  6.           JJCQ   EQU   37H        ;酒精显示0%暂存寄存器
  7.           YYBZ   EQU   38H        ;语音播放标志
  8.           DJSJCQ EQU   39H        ;10S倒计时寄存器
  9.           JJCYCS EQU   3AH        ;酒精检测采样次数寄存器
  10.           SHZZ2  EQU   3BH        ;数据中转寄存器

  11.           XSYSSJ  DATA   5        ;正常时显示延时时间
  12.           YWBJCS  EQU   5        ;缺油报警次数
  13.           WXBJZ1  EQU   100       ;有害气体危险报警设定值200PPM
  14.                                   ;实际设定值=200(显示设定值)/2(修正倍率)
  15.           JGBJZ1  EQU   60        ;有害气体警告报警设定值120PPM
  16.                                   ;实际设定值=120(显示设定值)/2(修正倍率)
  17.           WXBJZ2  EQU   50        ;酒精危险报警设定值0.05% BAC
  18.                                   ;实际设定值=0.05%(显示设定值)*1000(显示位修正)/1(修正倍率)
  19.           JGBJZ2  EQU   20        ;酒精警告报警设定值0.02% BAC
  20.                                   ;实际设定值=0.02%(显示设定值)*1000(显示位修正)/1(修正倍率)
  21.           XIUZ1   EQU   10        ;有害气体浓度显示数据修正值,设置大时则显示数值小,反之显示大
  22.           XIUZ2   EQU   34        ;酒精浓度显示数据修正值,设置大时则显示数值小,反之显示大

  23. ;-----------------------------------------------------------
  24.           LCD_RS    EQU   P4.0    ;LCD 数据/命令选择端
  25.           LCD_RW    EQU   P4.1    ;LCD 读/写选择端
  26.           LCD_EN    EQU   P4.2    ;LCD 使能信号
  27.           LCD_BG    EQU   P4.3    ;LCD 背光控制端
  28.           LCD_SJ    EQU   P0      ;LCD 数据

  29.           BITE      EQU   9       ;串口发送9位数据
  30.           FSSZ      EQU   40H     ;主机发送的数据块首址
  31.           JSSZ      EQU   50H     ;主机接收的数据块首址

  32.           YY_DAT    DATA  29H     ;语音段地址存放单元
  33.           YYRST     EQU   P3.3    ;语音模块复位信号引脚
  34.           BUSY      EQU   P1.0    ;语音忙控制端,0为正在播放1为没有播放空闲时
  35.           YYSDA     EQU   P1.1    ;语音模块数据线引脚

  36. ;===========================================================
  37.           ORG  0000H
  38.           AJMP  MAIN

  39.           ORG  0100H

  40. ;=========================================
  41. ;以下为主程序
  42. ;=========================================
  43. ;以下为油位显示和报警程序
  44. MAIN:     MOV  SP,#60H
  45.           CLR  LCD_BG         ;打开LCD背光
  46.           LCALL  SET_LCD      ;初始化 LCD
  47.           CLR A
  48.           MOV  R0,#20H        ;将20H-7FH 单元清零
  49.           MOV  R1,#63
  50. CLEAR:    MOV  @R0,A
  51.           INC  R0
  52.           DJNZ  R1,CLEAR

  53.           MOV A,#5
  54.           MOV DPTR,#1000H     ;查看语音报警次数
  55.           MOVX @DPTR,A

  56.           ;MOV 08H,#5

  57. YWJCCX:   LCALL MENU_7        ;显示菜单1

  58. FFFF:     LCALL YWJC          ;调用油位检测程序
  59.           LCALL DYXZ          ;调用电瓶电压检测程序
  60.           LCALL DELAY3
  61.           LCALL DELAY3
  62.           SJMP FFFF

  63. ;***************************************************
  64. ;以下为子程序
  65. ;==============================================
  66. ;以下为LCD显示有害气体程序
  67. ;72H-70H 分别存放百位、十位、个位的数据
  68. ;==============================================
  69. CONV400:  MOV  A,73H         ;加载百位数据
  70.           MOV  LCD_X,#0      ;设置显示位置
  71.           CJNE A,#00H,CONV410
  72.           MOV  A,#" "        ;百位数等于0显示空格
  73.           MOV  B,LCD_X
  74.           CALL  LCDP2
  75.           JMP  CONV420

  76. CONV410:  CALL  SHOW_DIG2    ;显示数据

  77. CONV420:  INC  LCD_X         ;调整显示地址
  78.           MOV  A,72H         ;十位
  79.           CALL  SHOW_DIG2

  80.           INC  LCD_X         ;调整显示地址
  81.           MOV  A,#'.'
  82.           MOV  B,LCD_X
  83.           CALL  LCDP2

  84.           INC  LCD_X         ;调整显示地址
  85.           MOV  A,71H         ;十位
  86.           CALL  SHOW_DIG2

  87.           RET
  88. ;=========================================
  89. ;LCD 显示菜单1
  90. ;=========================================
  91. MENU_7:   MOV  DPTR,#M_OK31  ;指针指到显示信息区
  92.           MOV  A,#1          ;显示在第一行
  93.           CALL  LCD_PRINT
  94.           MOV  DPTR,#M_OK32  ;指针指到显示信息区
  95.           MOV  A,#2          ;显示在第二行
  96.           CALL  LCD_PRINT
  97.           MOV  DPTR,#M_OK33  ;指针指到显示信息区
  98.           MOV  A,#3          ;显示在第二行
  99.           CALL  LCD_PRINT
  100.           MOV  DPTR,#M_OK34  ;指针指到显示信息区
  101.           MOV  A,#4          ;显示在第二行
  102.           CALL  LCD_PRINT
  103.           RET
  104. M_OK31:   DB"油量:          ",0
  105. M_OK32:   DB"        升      ",0
  106. M_OK33:   DB"电瓶电压:      ",0
  107. M_OK34:   DB"        V       ",0


  108. ;--------------------------------------------------------------------------
  109. ;以下为油位检测和报警显示程序
  110. ;--------------------------------------------------------------------------
  111. YWJC:     MOV R2,#0AH         ;与10号从机串口通信,多功能板地址为0AH
  112.           MOV R3,#01H         ;主机要求从机发送数据块
  113.           LCALL COM           ;主机与多功能检测板串口通信,要求其发送9个字节数据块

  114.           MOV A,JSSZ+3        ;取出传感器检测到的电压读数(原始数据,16进制)
  115.           MOV B,#2            ;显示修正倍率,原始数*倍率=LCD显示值
  116.           LCALL HEX2BCD1      ;调用数值转换程序
  117.           MOV YYBZ,#JSSZ+3    ;设标志
  118.           MOV  DPTR,#BJ61     ;显示油位过低
  119.           LCALL BTT5          ;显示清屏
  120.           LCALL CONV400       ;调用LCD显示程序
  121.           LCALL YWBJ          ;调用报警比较程序
  122.           RET

  123. YWBJ:     MOV A,JSSZ+3        ;取出检测到的电压读数(原始数据,16进制)
  124.           SUBB A,#19H         ;比较,查看是否是低油位
  125.           JNC BTT6            ;油位没有过低直接返回

  126.           MOV DPTR,#1000H     ;查看语音报警次数
  127.           MOVX A,@DPTR
  128.           JZ YWBJ1            ;等于0FF说明首次打开此段语音
  129.           DEC A               ;没有播放完允许再播放
  130.           MOV DPTR,#1000H     ;查看语音报警次数
  131.           MOVX @DPTR,A

  132.           ;MOV A,08H     ;查看语音报警次数
  133.           ;JZ YWBJ1   ;等于0FF说明首次打开此段语音
  134.           ;DEC A               ;没有播放完允许再播放
  135.           ;MOV 08H,A     ;查看语音报警次数

  136.           JNB BUSY,$          ;如果语言正在播放,则等待
  137.           MOV YY_DAT,#38      ;报出“油位过低请加油”
  138.           LCALL YUYIN         ;开始语音播放

  139. YWBJ1:    LCALL DELAY3        ;延时
  140.           MOV  DPTR,#BJ60     ;显示油位过低
  141. BTT5:     MOV  A,#90H         ;设置 LCD 显示的地址(第四行)
  142.           CALL  WCOM          ;写入指令
  143. BLC:      CLR  A              ;填入字符
  144.           MOVC  A,@A+DPTR     ;由信息区取出字符
  145.           CJNE  A,#0,BLD      ;判断是否为结束码
  146. BTT6:     RET
  147. BLD:      CALL  WDATA         ;写入数据
  148.           INC  DPTR           ;指针加1
  149.           JMP  BLC            ;继续填入字符

  150. BJ60:     DB "低油位,请加油  ",0
  151. BJ61:     DB "        升      ",0

  152. ;--------------------------------------------------------------------------
  153. ;以下为电瓶电压检测和报警显示程序
  154. ;--------------------------------------------------------------------------
  155. DYXZ:     MOV R2,#0AH         ;与10号从机串口通信,多功能板地址为0AH
  156.           MOV R3,#01H         ;主机要求从机发送数据块
  157.           LCALL COM           ;主机与多功能检测板串口通信,要求其发送9个字节数据块
  158. ;电压比较程序
  159.           MOV A,JSSZ+5        ;取出检测到的电压读数(原始数据,16进制)
  160.           SUBB A,#7AH         ;比较,查看电压是否高于8V
  161.           JC BTT1             ;电压高于8V小于15.5V显示电压值,超过不显示只报警
  162.           MOV R1,A            ;送暂存器
  163.           MOV A,JSSZ+5
  164.           SUBB A,#0C2H        ;超过15.5V报警
  165.           JC BTT2
  166. ;电压过高
  167.           JNB BUSY,$          ;如果语言正在播放,则等待
  168.           MOV YY_DAT,#20      ;报出“电瓶电压过高,请检查”
  169.           LCALL YUYIN         ;开始语音播放
  170.           MOV  DPTR,#BJ50     ;超标显示的内容
  171.           LCALL DYBJXS        ;超过15.5V报警显示电压过高
  172.           SJMP BTT3

  173. ;电压正常显示电压值
  174. BTT2:     MOV  DPTR,#BJ52     ;显示清屏
  175.           LCALL DYBJXS
  176.           MOV A,R1
  177.           MOV  DPTR,#DAB8     ;电压值修正(实际电压与检测到的数值成非线性)
  178.           MOVC  A,@A+DPTR
  179.           MOV B,#100          ;把十进制数值分离出来
  180.           DIV AB
  181.           MOV 73H,A           ;十位
  182.           MOV A,B
  183.           MOV B,#10
  184.           DIV AB
  185.           MOV 72H,A           ;个位
  186.           MOV 71H,B           ;小数点后1位
  187.           MOV YYBZ,#JSSZ+5    ;设标志
  188.           LCALL CONV400       ;电压值显示
  189.           SJMP BTT3           ;返回主程序
  190. ;电压过低
  191. BTT1:     JNB BUSY,$          ;如果语言正在播放,则等待
  192.           MOV YY_DAT,#19      ;报出“电瓶电压过低,请检查”
  193.           LCALL YUYIN         ;开始语音播放
  194.           MOV  DPTR,#BJ51     ;未达到8V报警电压过低
  195.           LCALL DYBJXS        ;调用报警显示程序
  196. BTT3:     RET


  197. DYBJXS:   MOV  A,#98H          ;设置 LCD 显示的地址(第四行)
  198.           CALL  WCOM           ;写入指令
  199. BLA:      CLR  A               ;填入字符
  200.           MOVC  A,@A+DPTR      ;由信息区取出字符
  201.           CJNE  A,#0,BLB       ;判断是否为结束码
  202.           RET
  203. BLB:      CALL  WDATA          ;写入数据
  204.           INC  DPTR            ;指针加1
  205.           JMP  BLA             ;继续填入字符

  206. BJ50:     DB "电压过高,请检查",0
  207. BJ51:     DB "电压过低,请检查",0
  208. BJ52:     DB"        V       ",0


  209. DAB8:                          ;电压值修正
  210. DB  80,80,81,82,83,84,85,85,
  211. DB  86,87,88,89,90,90,91,91,
  212. DB  92,92,93,93,94,94,95,95,
  213. DB  96,97,98,98,99,100,100,101,
  214. DB  102,103,104,105,105,106,107,108,
  215. DB  109,110,110,111,112,113,114,115,
  216. DB  116,117,118,119,120,121,122,123,
  217. DB  124,125,126,128,130,132,134,135,
  218. DB  137,139,140,142,144,145,148,150,
  219. DB  153,155,158,160,163,165,170,173,
  220. DB  175,178,180,185,190,195,200,205,
  221. DB  0,





  222. ;=========================================
  223. ;以下为两个单字节十六进制相乘
  224. ;入口:A*B
  225. ;出口:16位低字节放A中,高字节放B中
  226. ;=========================================
  227. HEX2BCD1: MUL AB
  228.           MOV R6,B
  229.           MOV R7,A
  230.           MOV JJCQ,A        ;为显示0%作准备
  231. ;=========================================
  232. ;以下为双字节十六进制整数转换成双字节BCD码整数
  233. ;入口条件:待转换的双字节十六进制整数在R6、R7中。
  234. ;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
  235. ;影响资源:PSW、A、R2~R7,堆栈需求:2字节
  236. ;=========================================
  237.           CLR A             ;BCD码初始化
  238.           MOV R3,A
  239.           MOV R4,A
  240.           MOV R5,A
  241.           MOV R2,#10H       ;转换双字节十六进制整数
  242. HB3:      MOV A,R7          ;从高端移出待转换数的一位到CY中
  243.           RLC A
  244.           MOV R7,A
  245.           MOV A,R6
  246.           RLC A
  247.           MOV R6,A
  248.           MOV A,R5          ;BCD码带进位自身相加,相当于乘2
  249.           ADDC A,R5
  250.           DA A              ;十进制调整
  251.           MOV R5,A
  252.           MOV A,R4
  253.           ADDC A,R4
  254.           DA A
  255.           MOV R4,A
  256.           MOV A,R3
  257.           ADDC A,R3
  258.           MOV R3,A          ;双字节十六进制数的万位数不超过6,不用调整
  259.           DJNZ R2,HB3       ;处理完16bit

  260. ;=========================================
  261. ;以下为把BCD码提取出并送显示寄存器70H~73H
  262. ;入口:;三字节BCD码整数在R3(高位为十万低位为万)、
  263. ;R4(高位为千低位为百)、R5(高位为十低位为个)中。
  264. ;出口:73H-70H(舍去十万、万位)
  265. ;=========================================
  266.           MOV A,R4
  267.           ANL A,#00001111B
  268.           MOV 73H,A
  269.           MOV A,R5
  270.           ANL A,#11110000B
  271.           SWAP A
  272.           MOV 72H,A
  273.           MOV A,R5
  274.           ANL A,#00001111B
  275.           MOV 71H,A
  276.           MOV 70H,#0
  277.           RET

  278. ;=========================================
  279. ;以下为主机串行通信程序
  280. ;占用资源:R0~R4,A、40H、50H
  281. ;=========================================
  282. COM:   MOV A,TMOD           ;设置T1工作方式为方式2、T0工作方式保持不变
  283.        MOV FSJCQ,A
  284.        ORL A,#00101111B
  285.        MOV TMOD,A
  286.        MOV TH1,#0FDH        ;11.0592MHz 晶振,波特率=9600,时长0.6695
  287.        MOV TL1,#0FDH
  288.        MOV SCON,#0D8H       ;置串行模式3,SM2=1,允许接收
  289.        SETB TR1             ;启动T1
  290.        LCALL COM1           ;调用一线发码子程序
  291.        MOV TMOD,FSJCQ       ;恢复T1、T0原先的工作方式
  292.        RET

  293. COM1:   MOV A,R2            ;发送地址帧
  294.         MOV SBUF,A
  295.         JNB TI,$
  296.         CLR TI
  297.         JNB RI,$            ;等待从机应答
  298.         CLR RI
  299.         MOV A,SBUF
  300.         XRL A,R2
  301.         JNZ MS104           ;判应答地址是否相符
  302.         CLR TB8             ;地址符合,准备发送命令
  303.         MOV SBUF,R3         ;发送发送或接收数据命令
  304.         JNB TI,$
  305.         CLR TI
  306.         JNB RI,$            ;等待从机应答
  307.         CLR RI
  308.         MOV A,SBUF          ;取应答信息
  309.         JNB ACC.7,MS102     ;判断是否出错
  310. MS101:  SETB TB8
  311.         MOV SBUF,#0FFH      ;不相符重新联络
  312.         JNB TI,$
  313.         CLR TI
  314.         SJMP COM1           ;转重发地址

  315. MS102:  CJNE R3,#00H,MS103  ;判是否要求从机接收数据
  316.         JNB ACC.0,MS101     ;从机接收数据准备就绪否?
  317.         MOV R0,#FSSZ        ;主机发送的数据块首址
  318.         MOV R4,#BITE        ;设数据块长度(9字节)
  319. LPTX:   MOV SBUF,@R0        ;主机发送数据块
  320.         JNB TI,$            ;等待发送完1帧
  321.         CLR TI
  322.         INC R0              ;修改地址指针
  323.         DJNZ R4,LPTX        ;判数据块是否传完
  324.         SJMP MS104          ;返回主程序

  325. MS103:  JNB ACC.1,MS101     ;从机发送数据准备就绪否?
  326.         MOV R1,#JSSZ        ;主机接收的数据块首址
  327.         MOV R4,#BITE        ;设数据块长度(9字节)
  328. LPRX:   JNB RI,LPRX         ;等待接收完1帧
  329.         CLR RI
  330.         MOV A,SBUF          ;取出接收到的字符
  331.         MOV @R1,A
  332.         INC R1
  333.         DJNZ R4,LPRX        ;未接收完则继续

  334. MS104:  CLR TR1             ;关闭T1
  335.         RET

  336. ;=============================================
  337. ;在LCD的第二行显示数据字符
  338. ;A=ASCII 数据, B=位置变量
  339. ;==============================================
  340. LCDP2:    PUSH  ACC           ;在LCD的第二行显示字符
  341.           MOV  A,B            ;设置显示地址
  342.           MOV R0,YYBZ
  343.           CJNE R0,#JSSZ+3,LCDP3
  344.           ADD  A,#90H         ;设置LCD的第二行地址90
  345.           SJMP LCDP4
  346. LCDP3:    CJNE R0,#JSSZ+5,LCDP5
  347.           ADD  A,#98H         ;设置LCD的第四行地址98
  348. LCDP4:    CALL  WCOM          ;写入命令
  349. LCDP5:    POP  ACC            ;由堆栈取出A
  350.           CALL  WDATA         ;写入数据
  351.           RET
  352. ;-------------------------------------------------------
  353. SHOW_DIG2:                   ;在 LCD 的第二行显示数字
  354.           ADD  A,#30H        ;加30H,转换为ASCII码
  355.           MOV  B,LCD_X       ;确定显示位置
  356.           CALL  LCDP2        ;送显示
  357.           RET

  358. ;=================================================
  359. ;对 LCD 做初始化设置
  360. ;=================================================
  361. SET_LCD:  MOV A,#34H      ;34H--扩充指令操作
  362.           CALL  WCOM         ;写入命令
  363.    MOV A,#30H      ;30H--基本指令操作
  364.           CALL  WCOM         ;写入命令
  365.    MOV A,#01H      ;清除显示
  366.           CALL  WCOM         ;写入命令
  367.           MOV A,#06H      ;指定在资料写入或读取时,光标的移动方向
  368.           CALL  WCOM         ;DDRAM 的地址计数器(AC)加1
  369.    MOV A,#0CH      ;开显示,关光标,不闪烁
  370.           CALL  WCOM         ;写入命令
  371.           RET

  372. ;===============================================
  373. ;命令写入子程序
  374. ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
  375. ;以8位控制方式将命令写至LCD
  376. ;===============================================
  377. WCOM:    LCALL CHK_BUSY       ;写入指令
  378.   CLR LCD_RS
  379.   CLR LCD_RW
  380.   MOV LCD_SJ,A
  381.   SETB LCD_EN
  382.   NOP
  383.   NOP
  384.   CLR LCD_EN
  385.   RET
  386. ;===============================================
  387. ;数据写入子程序
  388. ;RS=H,RW=L,D0-D7=指令码,E=高脉冲
  389. ;以8位控制方式将数据写至LCD
  390. ;===============================================
  391. WDATA:    MOV  LCD_SJ,A       ;写入数据
  392.           SETB  LCD_RS
  393.           CLR  LCD_RW
  394.           SETB  LCD_EN
  395.           CALL  DE
  396.           CLR  LCD_EN
  397.           CALL  DE
  398.           RET
  399. ;===============================================
  400. ;测LCD忙碌子程序
  401. ;RS=0,RW=1,E=H,D0-D7=状态字
  402. ;===============================================
  403. CHK_BUSY: MOV LCD_SJ,#0FFH   ;测忙碌子程序
  404.    CLR LCD_RS
  405.    SETB LCD_RW
  406.    SETB LCD_EN
  407.    JB LCD_SJ.7,$
  408.    CLR LCD_EN
  409.    RET

  410. ;==================================================
  411. ;在LCD的显示字符串
  412. ;DPTR = 放字符串的地址
  413. ;==================================================
  414. LCD_PRINT:CJNE  A,#1,LINE2  ;判断是否为第一行
  415. LINE1:    MOV  A,#80H       ;设置 LCD 的第一行地址
  416.           CALL  WCOM        ;写入命令
  417.           CALL  CLR_LINE    ;清除该行字符数据
  418.           MOV  A,#80H       ;设置 LCD 的第一行地址
  419.           CALL  WCOM        ;写入命令
  420.           JMP  FILL

  421. LINE2:    CJNE  A,#2,LINE3  ;判断是否为第二行
  422.           MOV  A,#90H       ;设置 LCD 的第二行地址
  423.           CALL  WCOM        ;写入命令
  424.           CALL  CLR_LINE    ;清除该行字符数据
  425.           MOV  A,#90H       ;设置 LCD 的第二行地址
  426.           CALL  WCOM
  427.           JMP  FILL

  428. LINE3:    CJNE  A,#3,LINE4  ;判断是否为第三行
  429.           MOV  A,#88H       ;设置 LCD 的第三行地址
  430.           CALL  WCOM        ;写入命令
  431.           CALL  CLR_LINE    ;清除该行字符数据
  432.           MOV  A,#88H       ;设置 LCD 的第三行地址
  433.           CALL  WCOM
  434.           JMP  FILL

  435. LINE4:    MOV  A,#98H       ;设置 LCD 的第四行地址
  436.           CALL  WCOM        ;写入命令
  437.           CALL  CLR_LINE    ;清除该行字符数据
  438.           MOV  A,#98H       ;设置 LCD 的第四行地址
  439.           CALL  WCOM

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

  444. LC1:      CALL  WDATA       ;写入数据
  445.           INC  DPTR         ;指针加1
  446.           JMP  FILL         ;继续填入字符
  447. ;===============================================
  448. ;清除一行 LCD 的字符
  449. ;输入一行空格,来替代原显示字符
  450. ;===============================================
  451. CLR_LINE: MOV  R0,#16       ;清除该行 LCD 的字符
  452. CL1:      MOV  A,#' '
  453.           CALL  WDATA
  454.           DJNZ  R0,CL1
  455.           RET
  456. ;**********************************************************
  457. ;延时子程序
  458. ;**********************************************************
  459. DE:      MOV  R7,#229        ;延时 500 微秒,此条2个机器周期
  460.          DJNZ  R7,$
  461.          RET    ;此条2个机器周期,总延时(229*2+2+2)*(12/11.0592)≈500uS

  462. DELAY:   MOV  R5,#20         ;延时200MS
  463. DELAY1:  MOV  R6,#96         ;100
  464. DL1:     MOV  R7,#96         ;100
  465.          DJNZ  R7,$
  466.          DJNZ  R6,DL1
  467.          DJNZ  R5,DELAY1     ;96*2*48*(12/11.0592)+2*(12/11.0592)≈10000uS=10mS
  468.          RET

  469. DELAY2:  MOV  R6,#10         ;延时5MS
  470. DL2:     MOV  R7,#229        ;100微秒
  471.          DJNZ  R7,$
  472.          DJNZ  R6,DL2
  473.          DJNZ  R5,DELAY2
  474.          RET

  475. DELAY3:  MOV  R5,#10         ;延时200MS
  476. DELA:    MOV  R6,#255
  477. DL3:     MOV  R7,#255
  478.          DJNZ  R7,$
  479.          DJNZ  R6,DL3
  480.          DJNZ  R5,DELA
  481.          RET
  482. ;**********************************************************
  483. ;语音驱动和播放程序
  484. ;**********************************************************
  485. ;50H为语音段地址暂存器,1到210段,实际用到40
  486. ;50H为E0H~E7H时分别代表自低往高的8级音量
  487. ;在语音播放过程中发送F2H至50H可循环播放当前地址语音
  488. ;发送FEH至50H停止播放语音
  489. ;****************************************************
  490. YUYIN: MOV A,TMOD          ;设置T1工作方式为方式1、T0工作方式保持不变
  491.        MOV FSJCQ,A
  492.        ORL A,#00011111B
  493.        MOV TMOD,A
  494.        MOV R6,#08H         ;发码8位循环数据
  495.        LCALL ONE_LINE      ;调用一线发码子程序
  496.        MOV TMOD,FSJCQ          ;恢复T1、T0原先的工作方式
  497.        RET

  498. ONE_LINE:                  ;////一线发码子程序
  499.        SETB YYRST          ;复位
  500.        MOV R7,#2           ;延时2MS
  501.        LCALL DELAY1MS
  502.        CLR YYRST           ;延时使系统稳定
  503.        MOV R7,#6           ;延时6MS
  504.        LCALL DELAY1MS
  505.        CLR YYSDA           ;唤醒语音芯片
  506.        MOV R7,#17          ;延时17MS
  507.        LCALL DELAY1MS
  508.        MOV A,YY_DAT

  509. LP1:   SETB YYSDA
  510.        RRC A               ;分辨50H内的数据各位是高电平还是低电平
  511.        JNC DIDIANPIN       ;高电平用高:低=2:1的脉宽表示
  512.        LCALL DELAY200US
  513.        LCALL DELAY200US
  514.        LCALL DELAY200US
  515.        CLR YYSDA
  516.        LCALL DELAY200US
  517. LP2:   DJNZ R6,LP1         ;查看数据是否发完,未发完继续发
  518.        MOV R6,#08H
  519.        SETB YYSDA
  520.        RET

  521. DIDIANPIN:                 ;低电平用高:低=1:2的脉宽表示
  522.        LCALL DELAY200US
  523.        CLR YYSDA
  524.        LCALL DELAY200US
  525.        LCALL DELAY200US
  526.        LCALL DELAY200US
  527.        SJMP LP2

  528. ;以下为延时子程序
  529. DELAY200US:                ;延时200US子程序,晶振11.0592MHz,方式1
  530.        MOV  TH1,#0FFH
  531.        MOV  TL1,#47H
  532.        SETB TR1
  533. LOP1:  JBC  TF1,NEXT1
  534.        SJMP LOP1
  535. NEXT1: CLR TR1
  536.        RET

  537. DELAY1MS:MOV  TH1,#0FCH    ;延时1ms子程序
  538.        MOV  TL1,#66H
  539.        SETB TR1
  540. LOP2:  JBC  TF1,NEXT2
  541.        SJMP LOP2
  542. NEXT2: DJNZ R7,DELAY1MS
  543.        CLR TR1
  544.        RET


  545.          END
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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