標(biāo)題:
電壓檢測程序
[打印本頁]
作者:
daniu
時(shí)間:
2014-12-26 23:28
標(biāo)題:
電壓檢測程序
LCD_X EQU 23H ;LCD 地址變量(決定文字的在LCD上的顯示位置)
FSJCQ EQU 33H ;TMOD工作方式暫存寄存器
BJZC EQU 34H ;需要比較數(shù)據(jù)暫存寄存器,用于報(bào)警顯示
BJWX EQU 35H ;超標(biāo)設(shè)定值暫存寄存器
BJJG EQU 36H ;偏高設(shè)定值暫存寄存器
JJCQ EQU 37H ;酒精顯示0%暫存寄存器
YYBZ EQU 38H ;語音播放標(biāo)志
DJSJCQ EQU 39H ;10S倒計(jì)時(shí)寄存器
JJCYCS EQU 3AH ;酒精檢測采樣次數(shù)寄存器
SHZZ2 EQU 3BH ;數(shù)據(jù)中轉(zhuǎn)寄存器
XSYSSJ DATA 5 ;正常時(shí)顯示延時(shí)時(shí)間
YWBJCS EQU 5 ;缺油報(bào)警次數(shù)
WXBJZ1 EQU 100 ;有害氣體危險(xiǎn)報(bào)警設(shè)定值200PPM
;實(shí)際設(shè)定值=200(顯示設(shè)定值)/2(修正倍率)
JGBJZ1 EQU 60 ;有害氣體警告報(bào)警設(shè)定值120PPM
;實(shí)際設(shè)定值=120(顯示設(shè)定值)/2(修正倍率)
WXBJZ2 EQU 50 ;酒精危險(xiǎn)報(bào)警設(shè)定值0.05% BAC
;實(shí)際設(shè)定值=0.05%(顯示設(shè)定值)*1000(顯示位修正)/1(修正倍率)
JGBJZ2 EQU 20 ;酒精警告報(bào)警設(shè)定值0.02% BAC
;實(shí)際設(shè)定值=0.02%(顯示設(shè)定值)*1000(顯示位修正)/1(修正倍率)
XIUZ1 EQU 10 ;有害氣體濃度顯示數(shù)據(jù)修正值,設(shè)置大時(shí)則顯示數(shù)值小,反之顯示大
XIUZ2 EQU 34 ;酒精濃度顯示數(shù)據(jù)修正值,設(shè)置大時(shí)則顯示數(shù)值小,反之顯示大
;-----------------------------------------------------------
LCD_RS EQU P4.0 ;LCD 數(shù)據(jù)/命令選擇端
LCD_RW EQU P4.1 ;LCD 讀/寫選擇端
LCD_EN EQU P4.2 ;LCD 使能信號
LCD_BG EQU P4.3 ;LCD 背光控制端
LCD_SJ EQU P0 ;LCD 數(shù)據(jù)
BITE EQU 9 ;串口發(fā)送9位數(shù)據(jù)
FSSZ EQU 40H ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
JSSZ EQU 50H ;主機(jī)接收的數(shù)據(jù)塊首址
YY_DAT DATA 29H ;語音段地址存放單元
YYRST EQU P3.3 ;語音模塊復(fù)位信號引腳
BUSY EQU P1.0 ;語音忙控制端,0為正在播放1為沒有播放空閑時(shí)
YYSDA EQU P1.1 ;語音模塊數(shù)據(jù)線引腳
;===========================================================
ORG 0000H
AJMP MAIN
ORG 0100H
;=========================================
;以下為主程序
;=========================================
;以下為油位顯示和報(bào)警程序
MAIN: MOV SP,#60H
CLR LCD_BG ;打開LCD背光
LCALL SET_LCD ;初始化 LCD
CLR A
MOV R0,#20H ;將20H-7FH 單元清零
MOV R1,#63
CLEAR: MOV @R0,A
INC R0
DJNZ R1,CLEAR
MOV A,#5
MOV DPTR,#1000H ;查看語音報(bào)警次數(shù)
MOVX @DPTR,A
;MOV 08H,#5
YWJCCX: LCALL MENU_7 ;顯示菜單1
FFFF: LCALL YWJC ;調(diào)用油位檢測程序
LCALL DYXZ ;調(diào)用電瓶電壓檢測程序
LCALL DELAY3
LCALL DELAY3
SJMP FFFF
;***************************************************
;以下為子程序
;==============================================
;以下為LCD顯示有害氣體程序
;72H-70H 分別存放百位、十位、個(gè)位的數(shù)據(jù)
;==============================================
CONV400: MOV A,73H ;加載百位數(shù)據(jù)
MOV LCD_X,#0 ;設(shè)置顯示位置
CJNE A,#00H,CONV410
MOV A,#" " ;百位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP2
JMP CONV420
CONV410: CALL SHOW_DIG2 ;顯示數(shù)據(jù)
CONV420: INC LCD_X ;調(diào)整顯示地址
MOV A,72H ;十位
CALL SHOW_DIG2
INC LCD_X ;調(diào)整顯示地址
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2
INC LCD_X ;調(diào)整顯示地址
MOV A,71H ;十位
CALL SHOW_DIG2
RET
;=========================================
;LCD 顯示菜單1
;=========================================
MENU_7: MOV DPTR,#M_OK31 ;指針指到顯示信息區(qū)
MOV A,#1 ;顯示在第一行
CALL LCD_PRINT
MOV DPTR,#M_OK32 ;指針指到顯示信息區(qū)
MOV A,#2 ;顯示在第二行
CALL LCD_PRINT
MOV DPTR,#M_OK33 ;指針指到顯示信息區(qū)
MOV A,#3 ;顯示在第二行
CALL LCD_PRINT
MOV DPTR,#M_OK34 ;指針指到顯示信息區(qū)
MOV A,#4 ;顯示在第二行
CALL LCD_PRINT
RET
M_OK31: DB"油量: ",0
M_OK32: DB" 升 ",0
M_OK33: DB"電瓶電壓: ",0
M_OK34: DB" V ",0
;--------------------------------------------------------------------------
;以下為油位檢測和報(bào)警顯示程序
;--------------------------------------------------------------------------
YWJC: MOV R2,#0AH ;與10號從機(jī)串口通信,多功能板地址為0AH
MOV R3,#01H ;主機(jī)要求從機(jī)發(fā)送數(shù)據(jù)塊
LCALL COM ;主機(jī)與多功能檢測板串口通信,要求其發(fā)送9個(gè)字節(jié)數(shù)據(jù)塊
MOV A,JSSZ+3 ;取出傳感器檢測到的電壓讀數(shù)(原始數(shù)據(jù),16進(jìn)制)
MOV B,#2 ;顯示修正倍率,原始數(shù)*倍率=LCD顯示值
LCALL HEX2BCD1 ;調(diào)用數(shù)值轉(zhuǎn)換程序
MOV YYBZ,#JSSZ+3 ;設(shè)標(biāo)志
MOV DPTR,#BJ61 ;顯示油位過低
LCALL BTT5 ;顯示清屏
LCALL CONV400 ;調(diào)用LCD顯示程序
LCALL YWBJ ;調(diào)用報(bào)警比較程序
RET
YWBJ: MOV A,JSSZ+3 ;取出檢測到的電壓讀數(shù)(原始數(shù)據(jù),16進(jìn)制)
SUBB A,#19H ;比較,查看是否是低油位
JNC BTT6 ;油位沒有過低直接返回
MOV DPTR,#1000H ;查看語音報(bào)警次數(shù)
MOVX A,@DPTR
JZ YWBJ1 ;等于0FF說明首次打開此段語音
DEC A ;沒有播放完允許再播放
MOV DPTR,#1000H ;查看語音報(bào)警次數(shù)
MOVX @DPTR,A
;MOV A,08H ;查看語音報(bào)警次數(shù)
;JZ YWBJ1 ;等于0FF說明首次打開此段語音
;DEC A ;沒有播放完允許再播放
;MOV 08H,A ;查看語音報(bào)警次數(shù)
JNB BUSY,$ ;如果語言正在播放,則等待
MOV YY_DAT,#38 ;報(bào)出“油位過低請加油”
LCALL YUYIN ;開始語音播放
YWBJ1: LCALL DELAY3 ;延時(shí)
MOV DPTR,#BJ60 ;顯示油位過低
BTT5: MOV A,#90H ;設(shè)置 LCD 顯示的地址(第四行)
CALL WCOM ;寫入指令
BLC: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息區(qū)取出字符
CJNE A,#0,BLD ;判斷是否為結(jié)束碼
BTT6: RET
BLD: CALL WDATA ;寫入數(shù)據(jù)
INC DPTR ;指針加1
JMP BLC ;繼續(xù)填入字符
BJ60: DB "低油位,請加油 ",0
BJ61: DB " 升 ",0
;--------------------------------------------------------------------------
;以下為電瓶電壓檢測和報(bào)警顯示程序
;--------------------------------------------------------------------------
DYXZ: MOV R2,#0AH ;與10號從機(jī)串口通信,多功能板地址為0AH
MOV R3,#01H ;主機(jī)要求從機(jī)發(fā)送數(shù)據(jù)塊
LCALL COM ;主機(jī)與多功能檢測板串口通信,要求其發(fā)送9個(gè)字節(jié)數(shù)據(jù)塊
;電壓比較程序
MOV A,JSSZ+5 ;取出檢測到的電壓讀數(shù)(原始數(shù)據(jù),16進(jìn)制)
SUBB A,#7AH ;比較,查看電壓是否高于8V
JC BTT1 ;電壓高于8V小于15.5V顯示電壓值,超過不顯示只報(bào)警
MOV R1,A ;送暫存器
MOV A,JSSZ+5
SUBB A,#0C2H ;超過15.5V報(bào)警
JC BTT2
;電壓過高
JNB BUSY,$ ;如果語言正在播放,則等待
MOV YY_DAT,#20 ;報(bào)出“電瓶電壓過高,請檢查”
LCALL YUYIN ;開始語音播放
MOV DPTR,#BJ50 ;超標(biāo)顯示的內(nèi)容
LCALL DYBJXS ;超過15.5V報(bào)警顯示電壓過高
SJMP BTT3
;電壓正常顯示電壓值
BTT2: MOV DPTR,#BJ52 ;顯示清屏
LCALL DYBJXS
MOV A,R1
MOV DPTR,#DAB8 ;電壓值修正(實(shí)際電壓與檢測到的數(shù)值成非線性)
MOVC A,@A+DPTR
MOV B,#100 ;把十進(jìn)制數(shù)值分離出來
DIV AB
MOV 73H,A ;十位
MOV A,B
MOV B,#10
DIV AB
MOV 72H,A ;個(gè)位
MOV 71H,B ;小數(shù)點(diǎn)后1位
MOV YYBZ,#JSSZ+5 ;設(shè)標(biāo)志
LCALL CONV400 ;電壓值顯示
SJMP BTT3 ;返回主程序
;電壓過低
BTT1: JNB BUSY,$ ;如果語言正在播放,則等待
MOV YY_DAT,#19 ;報(bào)出“電瓶電壓過低,請檢查”
LCALL YUYIN ;開始語音播放
MOV DPTR,#BJ51 ;未達(dá)到8V報(bào)警電壓過低
LCALL DYBJXS ;調(diào)用報(bào)警顯示程序
BTT3: RET
DYBJXS: MOV A,#98H ;設(shè)置 LCD 顯示的地址(第四行)
CALL WCOM ;寫入指令
BLA: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息區(qū)取出字符
CJNE A,#0,BLB ;判斷是否為結(jié)束碼
RET
BLB: CALL WDATA ;寫入數(shù)據(jù)
INC DPTR ;指針加1
JMP BLA ;繼續(xù)填入字符
BJ50: DB "電壓過高,請檢查",0
BJ51: DB "電壓過低,請檢查",0
BJ52: DB" V ",0
DAB8: ;電壓值修正
DB 80,80,81,82,83,84,85,85,
DB 86,87,88,89,90,90,91,91,
DB 92,92,93,93,94,94,95,95,
DB 96,97,98,98,99,100,100,101,
DB 102,103,104,105,105,106,107,108,
DB 109,110,110,111,112,113,114,115,
DB 116,117,118,119,120,121,122,123,
DB 124,125,126,128,130,132,134,135,
DB 137,139,140,142,144,145,148,150,
DB 153,155,158,160,163,165,170,173,
DB 175,178,180,185,190,195,200,205,
DB 0,
;=========================================
;以下為兩個(gè)單字節(jié)十六進(jìn)制相乘
;入口:A*B
;出口:16位低字節(jié)放A中,高字節(jié)放B中
;=========================================
HEX2BCD1: MUL AB
MOV R6,B
MOV R7,A
MOV JJCQ,A ;為顯示0%作準(zhǔn)備
;=========================================
;以下為雙字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)
;入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在R6、R7中。
;出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。
;影響資源:PSW、A、R2~R7,堆棧需求:2字節(jié)
;=========================================
CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進(jìn)制整數(shù)
HB3: MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進(jìn)位自身相加,相當(dāng)于乘2
ADDC A,R5
DA A ;十進(jìn)制調(diào)整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節(jié)十六進(jìn)制數(shù)的萬位數(shù)不超過6,不用調(diào)整
DJNZ R2,HB3 ;處理完16bit
;=========================================
;以下為把BCD碼提取出并送顯示寄存器70H~73H
;入口:;三字節(jié)BCD碼整數(shù)在R3(高位為十萬低位為萬)、
;R4(高位為千低位為百)、R5(高位為十低位為個(gè))中。
;出口:73H-70H(舍去十萬、萬位)
;=========================================
MOV A,R4
ANL A,#00001111B
MOV 73H,A
MOV A,R5
ANL A,#11110000B
SWAP A
MOV 72H,A
MOV A,R5
ANL A,#00001111B
MOV 71H,A
MOV 70H,#0
RET
;=========================================
;以下為主機(jī)串行通信程序
;占用資源:R0~R4,A、40H、50H
;=========================================
COM: MOV A,TMOD ;設(shè)置T1工作方式為方式2、T0工作方式保持不變
MOV FSJCQ,A
ORL A,#00101111B
MOV TMOD,A
MOV TH1,#0FDH ;11.0592MHz 晶振,波特率=9600,時(shí)長0.6695
MOV TL1,#0FDH
MOV SCON,#0D8H ;置串行模式3,SM2=1,允許接收
SETB TR1 ;啟動T1
LCALL COM1 ;調(diào)用一線發(fā)碼子程序
MOV TMOD,FSJCQ ;恢復(fù)T1、T0原先的工作方式
RET
COM1: MOV A,R2 ;發(fā)送地址幀
MOV SBUF,A
JNB TI,$
CLR TI
JNB RI,$ ;等待從機(jī)應(yīng)答
CLR RI
MOV A,SBUF
XRL A,R2
JNZ MS104 ;判應(yīng)答地址是否相符
CLR TB8 ;地址符合,準(zhǔn)備發(fā)送命令
MOV SBUF,R3 ;發(fā)送發(fā)送或接收數(shù)據(jù)命令
JNB TI,$
CLR TI
JNB RI,$ ;等待從機(jī)應(yīng)答
CLR RI
MOV A,SBUF ;取應(yīng)答信息
JNB ACC.7,MS102 ;判斷是否出錯(cuò)
MS101: SETB TB8
MOV SBUF,#0FFH ;不相符重新聯(lián)絡(luò)
JNB TI,$
CLR TI
SJMP COM1 ;轉(zhuǎn)重發(fā)地址
MS102: CJNE R3,#00H,MS103 ;判是否要求從機(jī)接收數(shù)據(jù)
JNB ACC.0,MS101 ;從機(jī)接收數(shù)據(jù)準(zhǔn)備就緒否?
MOV R0,#FSSZ ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
MOV R4,#BITE ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
LPTX: MOV SBUF,@R0 ;主機(jī)發(fā)送數(shù)據(jù)塊
JNB TI,$ ;等待發(fā)送完1幀
CLR TI
INC R0 ;修改地址指針
DJNZ R4,LPTX ;判數(shù)據(jù)塊是否傳完
SJMP MS104 ;返回主程序
MS103: JNB ACC.1,MS101 ;從機(jī)發(fā)送數(shù)據(jù)準(zhǔn)備就緒否?
MOV R1,#JSSZ ;主機(jī)接收的數(shù)據(jù)塊首址
MOV R4,#BITE ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
LPRX: JNB RI,LPRX ;等待接收完1幀
CLR RI
MOV A,SBUF ;取出接收到的字符
MOV @R1,A
INC R1
DJNZ R4,LPRX ;未接收完則繼續(xù)
MS104: CLR TR1 ;關(guān)閉T1
RET
;=============================================
;在LCD的第二行顯示數(shù)據(jù)字符
;A=ASCII 數(shù)據(jù), B=位置變量
;==============================================
LCDP2: PUSH ACC ;在LCD的第二行顯示字符
MOV A,B ;設(shè)置顯示地址
MOV R0,YYBZ
CJNE R0,#JSSZ+3,LCDP3
ADD A,#90H ;設(shè)置LCD的第二行地址90
SJMP LCDP4
LCDP3: CJNE R0,#JSSZ+5,LCDP5
ADD A,#98H ;設(shè)置LCD的第四行地址98
LCDP4: CALL WCOM ;寫入命令
LCDP5: POP ACC ;由堆棧取出A
CALL WDATA ;寫入數(shù)據(jù)
RET
;-------------------------------------------------------
SHOW_DIG2: ;在 LCD 的第二行顯示數(shù)字
ADD A,#30H ;加30H,轉(zhuǎn)換為ASCII碼
MOV B,LCD_X ;確定顯示位置
CALL LCDP2 ;送顯示
RET
;=================================================
;對 LCD 做初始化設(shè)置
;=================================================
SET_LCD: MOV A,#34H ;34H--擴(kuò)充指令操作
CALL WCOM ;寫入命令
MOV A,#30H ;30H--基本指令操作
CALL WCOM ;寫入命令
MOV A,#01H ;清除顯示
CALL WCOM ;寫入命令
MOV A,#06H ;指定在資料寫入或讀取時(shí),光標(biāo)的移動方向
CALL WCOM ;DDRAM 的地址計(jì)數(shù)器(AC)加1
MOV A,#0CH ;開顯示,關(guān)光標(biāo),不閃爍
CALL WCOM ;寫入命令
RET
;===============================================
;命令寫入子程序
;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
;以8位控制方式將命令寫至LCD
;===============================================
WCOM: LCALL CHK_BUSY ;寫入指令
CLR LCD_RS
CLR LCD_RW
MOV LCD_SJ,A
SETB LCD_EN
NOP
NOP
CLR LCD_EN
RET
;===============================================
;數(shù)據(jù)寫入子程序
;RS=H,RW=L,D0-D7=指令碼,E=高脈沖
;以8位控制方式將數(shù)據(jù)寫至LCD
;===============================================
WDATA: MOV LCD_SJ,A ;寫入數(shù)據(jù)
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
CALL DE
CLR LCD_EN
CALL DE
RET
;===============================================
;測LCD忙碌子程序
;RS=0,RW=1,E=H,D0-D7=狀態(tài)字
;===============================================
CHK_BUSY: MOV LCD_SJ,#0FFH ;測忙碌子程序
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
JB LCD_SJ.7,$
CLR LCD_EN
RET
;==================================================
;在LCD的顯示字符串
;DPTR = 放字符串的地址
;==================================================
LCD_PRINT:CJNE A,#1,LINE2 ;判斷是否為第一行
LINE1: MOV A,#80H ;設(shè)置 LCD 的第一行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#80H ;設(shè)置 LCD 的第一行地址
CALL WCOM ;寫入命令
JMP FILL
LINE2: CJNE A,#2,LINE3 ;判斷是否為第二行
MOV A,#90H ;設(shè)置 LCD 的第二行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#90H ;設(shè)置 LCD 的第二行地址
CALL WCOM
JMP FILL
LINE3: CJNE A,#3,LINE4 ;判斷是否為第三行
MOV A,#88H ;設(shè)置 LCD 的第三行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#88H ;設(shè)置 LCD 的第三行地址
CALL WCOM
JMP FILL
LINE4: MOV A,#98H ;設(shè)置 LCD 的第四行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#98H ;設(shè)置 LCD 的第四行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息區(qū)取出字符
CJNE A,#0,LC1 ;判斷是否為結(jié)束碼
RET
LC1: CALL WDATA ;寫入數(shù)據(jù)
INC DPTR ;指針加1
JMP FILL ;繼續(xù)填入字符
;===============================================
;清除一行 LCD 的字符
;輸入一行空格,來替代原顯示字符
;===============================================
CLR_LINE: MOV R0,#16 ;清除該行 LCD 的字符
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;**********************************************************
;延時(shí)子程序
;**********************************************************
DE: MOV R7,#229 ;延時(shí) 500 微秒,此條2個(gè)機(jī)器周期
DJNZ R7,$
RET ;此條2個(gè)機(jī)器周期,總延時(shí)(229*2+2+2)*(12/11.0592)≈500uS
DELAY: MOV R5,#20 ;延時(shí)200MS
DELAY1: MOV R6,#96 ;100
DL1: MOV R7,#96 ;100
DJNZ R7,$
DJNZ R6,DL1
DJNZ R5,DELAY1 ;96*2*48*(12/11.0592)+2*(12/11.0592)≈10000uS=10mS
RET
DELAY2: MOV R6,#10 ;延時(shí)5MS
DL2: MOV R7,#229 ;100微秒
DJNZ R7,$
DJNZ R6,DL2
DJNZ R5,DELAY2
RET
DELAY3: MOV R5,#10 ;延時(shí)200MS
DELA: MOV R6,#255
DL3: MOV R7,#255
DJNZ R7,$
DJNZ R6,DL3
DJNZ R5,DELA
RET
;**********************************************************
;語音驅(qū)動和播放程序
;**********************************************************
;50H為語音段地址暫存器,1到210段,實(shí)際用到40
;50H為E0H~E7H時(shí)分別代表自低往高的8級音量
;在語音播放過程中發(fā)送F2H至50H可循環(huán)播放當(dāng)前地址語音
;發(fā)送FEH至50H停止播放語音
;****************************************************
YUYIN: MOV A,TMOD ;設(shè)置T1工作方式為方式1、T0工作方式保持不變
MOV FSJCQ,A
ORL A,#00011111B
MOV TMOD,A
MOV R6,#08H ;發(fā)碼8位循環(huán)數(shù)據(jù)
LCALL ONE_LINE ;調(diào)用一線發(fā)碼子程序
MOV TMOD,FSJCQ ;恢復(fù)T1、T0原先的工作方式
RET
ONE_LINE: ;////一線發(fā)碼子程序
SETB YYRST ;復(fù)位
MOV R7,#2 ;延時(shí)2MS
LCALL DELAY1MS
CLR YYRST ;延時(shí)使系統(tǒng)穩(wěn)定
MOV R7,#6 ;延時(shí)6MS
LCALL DELAY1MS
CLR YYSDA ;喚醒語音芯片
MOV R7,#17 ;延時(shí)17MS
LCALL DELAY1MS
MOV A,YY_DAT
LP1: SETB YYSDA
RRC A ;分辨50H內(nèi)的數(shù)據(jù)各位是高電平還是低電平
JNC DIDIANPIN ;高電平用高:低=2:1的脈寬表示
LCALL DELAY200US
LCALL DELAY200US
LCALL DELAY200US
CLR YYSDA
LCALL DELAY200US
LP2: DJNZ R6,LP1 ;查看數(shù)據(jù)是否發(fā)完,未發(fā)完繼續(xù)發(fā)
MOV R6,#08H
SETB YYSDA
RET
DIDIANPIN: ;低電平用高:低=1:2的脈寬表示
LCALL DELAY200US
CLR YYSDA
LCALL DELAY200US
LCALL DELAY200US
LCALL DELAY200US
SJMP LP2
;以下為延時(shí)子程序
DELAY200US: ;延時(shí)200US子程序,晶振11.0592MHz,方式1
MOV TH1,#0FFH
MOV TL1,#47H
SETB TR1
LOP1: JBC TF1,NEXT1
SJMP LOP1
NEXT1: CLR TR1
RET
DELAY1MS:MOV TH1,#0FCH ;延時(shí)1ms子程序
MOV TL1,#66H
SETB TR1
LOP2: JBC TF1,NEXT2
SJMP LOP2
NEXT2: DJNZ R7,DELAY1MS
CLR TR1
RET
END
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1