;功能,串口中斷接收5個字節的上位機數據,如果底個字節是04H就執行循環
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;呼吸模式循環標志
ORG 0000H
LJMP MAIN ;上電,轉向主程序
ORG 0023H ;串行口的中斷入口地址
LJMP Uart1_Int_Recceive ;轉向中斷服務程序
ORG 0100H
;=======主程序開始=====================================================================
MAIN: LCALL Uart1_Initial ;串口初始化
MOV R3,#0 ;亮度檔位標識清零
Waitdata: SETB ES ;允許串行口中斷
SETB EA ;CPU開中斷
MOV R0,#40H ;存放接受的數據首地址---------------------
MOV R2,#0 ;存放接受的數據長度---------------------
;----------單字節16進制數轉為3字節的ASCII碼-------------------------------
Save_UartData:
LOP:MOV A,TmpData ;等待新的數據
CJNE R2,#5,LOP ;判斷是否收到5個字節
CLR ES ;所有數據接收完畢,禁止串行中斷
CLR EA
;------------------------------------------------------------------------
;======根據語音模塊命令控制對應燈具亮度(命令字放在43H的地址中?==========
MOV A,43H ;查看地址43H(接收到的5個字節的第四個字節內容做相應的功能判斷,為04H就執行LOOP1循環)
CJNE A,#04H,Waitdata
setb busy
LOOP1:;循環執行LOPP1
jnb Busy,Waitdata;標志位位0就退出循環
MOV DPTR,#LED_AC1 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC2 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC3 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC4 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC5 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly500ms
MOV DPTR,#LED_AC5 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC4 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC3 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC2 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
MOV DPTR,#LED_AC1 ; 調光3檔
LCALL SendString ; UART發送
LCALL Dly300ms
JMP LOOP1
RET
;串口初始化-----------------------------------
Uart1_Initial:
CLR A
CLR EA
MOV SP, #3FH
MOV SCON,#50H ;8位數據,可變波特率
ORL AUXR,#01H ;串口1選擇定時器2為波特率發生器
ORL AUXR,#04H ;定時器2時鐘為Fosc,即1T
MOV T2L,#0E0H ;設定定時初值
MOV T2H,#0FEH ;設定定時初值
ORL AUXR,#10H ;啟動定時器2
SETB ES ;允許串行口中斷
SETB EA ;CPU開中斷
RET
;-------串口中斷接收數據-------------------------
UART1_Int_Recceive:
PUSH ACC
U1REC1:JBC RI,GetData1 ;是接收中斷,清除此標志,轉向GetData1接收
CLR TI ;是發送中斷,清除此標志,中斷返回
SJMP U1REC1
GetData1:MOV A,SBUF ;接收(讀入)數據
MOV @R0,A ;存放數據到30H開頭的RAM-----------
MOV TmpData,A
INC R0 ;修改數據區指針-------------
INC R2 ;是否接收到5個字節 ,數據長度為5個字節
MOV FagHX,#00H
Clr busy
POP ACC
RETI;中斷返回
;=====串口發送字符串信息函數========================================
SendString:CLR A
MOVC A,@A+DPTR ; 到TABLE取碼
MOV SBUF,A ; 載入SBUF發送
SCONQ2:JBC TI,SCONQ3 ; 是否發送完?
SJMP SCONQ2
SCONQ3:INC DPTR ; 取下一個碼
CJNE A,#0AH,SendString ; 數據塊取碼未完成繼續取碼 發送AXXXV 如果發到0AH則結束
MOV A,FagHX
RET
;=========軟件延時函數================================================
Dly200ms: Mov R1,#20 ; 20X10MS=200ms秒延時子程序
DL3: Call Delay
Djnz R1,DL3
Ret
Dly100ms: Mov R1,#10 ; 20X10MS=200ms秒延時子程序
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對應亮度的可控硅電壓設置=============================
LED_OFF:DB 'A020V',0DH,0AH ;關機控制命令
LED_ON:DB 'A030V',0DH,0AH ;開機默認亮度
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
|