|
;功能,串口中斷接收5個(gè)字節(jié)的上位機(jī)數(shù)據(jù),如果底個(gè)字節(jié)是04H就執(zhí)行循環(huán)
TmpData EQU 01H
AUXR EQU 08EH
P5 DATA 0C8H
P1M1 DATA 091H
P1M0 DATA 092H
P3M1 DATA 0B1H
P3M0 DATA 0B2H
P5M1 DATA 0C9H
P5M0 DATA 0CAH
T2H DATA 0D6H
T2L DATA 0D7H
Busy BIT 20H.0;呼吸模式循環(huán)標(biāo)志
ORG 0000H
LJMP MAIN ;上電,轉(zhuǎn)向主程序
ORG 0023H ;串行口的中斷入口地址
LJMP Uart1_Int_Recceive ;轉(zhuǎn)向中斷服務(wù)程序
ORG 0100H
;=======主程序開(kāi)始=====================================================================
MAIN: LCALL Uart1_Initial ;串口初始化
MOV R3,#0 ;亮度檔位標(biāo)識(shí)清零
Waitdata: SETB ES ;允許串行口中斷
SETB EA ;CPU開(kāi)中斷
MOV R0,#40H ;存放接受的數(shù)據(jù)首地址---------------------
MOV R2,#0 ;存放接受的數(shù)據(jù)長(zhǎng)度---------------------
;----------單字節(jié)16進(jìn)制數(shù)轉(zhuǎn)為3字節(jié)的ASCII碼-------------------------------
Save_UartData:
LOP:MOV A,TmpData ;等待新的數(shù)據(jù)
CJNE R2,#5,LOP ;判斷是否收到5個(gè)字節(jié)
CLR ES ;所有數(shù)據(jù)接收完畢,禁止串行中斷
CLR EA
;------------------------------------------------------------------------
;======根據(jù)語(yǔ)音模塊命令控制對(duì)應(yīng)燈具亮度(命令字放在43H的地址中?==========
MOV A,43H ;查看地址43H(接收到的5個(gè)字節(jié)的第四個(gè)字節(jié)內(nèi)容做相應(yīng)的功能判斷,為04H就執(zhí)行LOOP1循環(huán))
CJNE A,#04H,Waitdata
setb busy
LOOP1:;循環(huán)執(zhí)行LOPP1
jnb Busy,Waitdata;標(biāo)志位位0就退出循環(huán)
MOV DPTR,#LED_AC1 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC2 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC3 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC4 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC5 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly500ms
MOV DPTR,#LED_AC5 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC4 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC3 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC2 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
MOV DPTR,#LED_AC1 ; 調(diào)光3檔
LCALL SendString ; UART發(fā)送
LCALL Dly300ms
JMP LOOP1
RET
;串口初始化-----------------------------------
Uart1_Initial:
CLR A
CLR EA
MOV SP, #3FH
MOV SCON,#50H ;8位數(shù)據(jù),可變波特率
ORL AUXR,#01H ;串口1選擇定時(shí)器2為波特率發(fā)生器
ORL AUXR,#04H ;定時(shí)器2時(shí)鐘為Fosc,即1T
MOV T2L,#0E0H ;設(shè)定定時(shí)初值
MOV T2H,#0FEH ;設(shè)定定時(shí)初值
ORL AUXR,#10H ;啟動(dòng)定時(shí)器2
SETB ES ;允許串行口中斷
SETB EA ;CPU開(kāi)中斷
RET
;-------串口中斷接收數(shù)據(jù)-------------------------
UART1_Int_Recceive:
PUSH ACC
U1REC1:JBC RI,GetData1 ;是接收中斷,清除此標(biāo)志,轉(zhuǎn)向GetData1接收
CLR TI ;是發(fā)送中斷,清除此標(biāo)志,中斷返回
SJMP U1REC1
GetData1:MOV A,SBUF ;接收(讀入)數(shù)據(jù)
MOV @R0,A ;存放數(shù)據(jù)到30H開(kāi)頭的RAM-----------
MOV TmpData,A
INC R0 ;修改數(shù)據(jù)區(qū)指針-------------
INC R2 ;是否接收到5個(gè)字節(jié) ,數(shù)據(jù)長(zhǎng)度為5個(gè)字節(jié)
MOV FagHX,#00H
Clr busy
POP ACC
RETI;中斷返回
;=====串口發(fā)送字符串信息函數(shù)========================================
SendString:CLR A
MOVC A,@A+DPTR ; 到TABLE取碼
MOV SBUF,A ; 載入SBUF發(fā)送
SCONQ2:JBC TI,SCONQ3 ; 是否發(fā)送完?
SJMP SCONQ2
SCONQ3:INC DPTR ; 取下一個(gè)碼
CJNE A,#0AH,SendString ; 數(shù)據(jù)塊取碼未完成繼續(xù)取碼 發(fā)送AXXXV 如果發(fā)到0AH則結(jié)束
MOV A,FagHX
RET
;=========軟件延時(shí)函數(shù)================================================
Dly200ms: Mov R1,#20 ; 20X10MS=200ms秒延時(shí)子程序
DL3: Call Delay
Djnz R1,DL3
Ret
Dly100ms: Mov R1,#10 ; 20X10MS=200ms秒延時(shí)子程序
DL2: Call Delay
Djnz R1,DL2
Ret
Delay:MOV R7,#01H ;誤差 0.000000000000us 3.6864M 10ms
DL1:MOV R6,#0DEH
DL0:MOV R5,#28H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
;====PWM對(duì)應(yīng)亮度的可控硅電壓設(shè)置=============================
LED_OFF:DB 'A020V',0DH,0AH ;關(guān)機(jī)控制命令
LED_ON:DB 'A030V',0DH,0AH ;開(kāi)機(jī)默認(rèn)亮度
LED_AC1:DB 'A030V',0DH,0AH ;第一檔亮度控制
LED_AC2:DB 'A080V',0DH,0AH ;第二檔亮度控制
LED_AC3:DB 'A100V',0DH,0AH ;第三檔亮度控制
LED_AC4:DB 'A140V',0DH,0AH ;第四檔亮度控制
LED_AC5:DB 'A220V',0DH,0AH ;第五檔亮度控制
LED_Sleep:DB 'A030V',0DH,0AH ;睡眠模式亮度控制
LED_Warm:DB 'A070V',0DH,0AH ;溫馨模式亮度控制
LED_Reading:DB 'A190V',0DH,0AH ;閱讀模式亮度控制
LED_Bright:DB 'A220V',0DH,0AH ;明亮模式亮度控制
LED_Moon:DB 'A040V',0DH,0AH ;夜燈模式亮度控制
END
|
|