欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3587|回復: 3
收起左側

單片機匯編語言里面的一個循環,有中斷時退不出循環

[復制鏈接]
ID:421538 發表于 2018-11-9 09:20 | 顯示全部樓層 |閱讀模式
;功能,串口中斷接收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

回復

使用道具 舉報

ID:421538 發表于 2018-11-9 09:25 | 顯示全部樓層
現在是如果第4字節是#04H,可以執行LOOP1循環,當下次數據第4字節不是#04H時,要退出LOOP1循環,不不知道錯在哪里。BUSY是判斷是否執行循環的,為1執行LOOP1循環,為0不執行LOOP1循環
回復

使用道具 舉報

ID:401564 發表于 2018-11-10 00:32 | 顯示全部樓層
從這之后中斷就關了,BUSY就一直是1,不會再再有中斷去改變了,所以,就一直在LOOP1這循環了,檢測字節的條件滿足之后,應該是要重新打開中斷的吧 QQ截圖20181110002909.png
回復

使用道具 舉報

ID:421538 發表于 2018-11-10 11:54 | 顯示全部樓層
感謝幫助,修改了一下,程序正常運行,達到我的功能
在發送一幀數據前關閉中斷,發完一幀數據后重新打開中斷
;=====串口發送字符串信息函數========================================
      SendString:
                 CLR ES                     ; 禁止串行口中斷
                 CLR EA                     ; 禁止CPU中斷
                 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  如果發到字母V(ACSII碼56H)則結束
                 SETB ES                    ; 允許串行口中斷
                 SETB EA                    ; CPU開中斷
            RET
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表