久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機匯編語言里面的一個循環,有中斷時退不出循環 [打印本頁]

作者: lhxr    時間: 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


作者: lhxr    時間: 2018-11-9 09:25
現在是如果第4字節是#04H,可以執行LOOP1循環,當下次數據第4字節不是#04H時,要退出LOOP1循環,不不知道錯在哪里。BUSY是判斷是否執行循環的,為1執行LOOP1循環,為0不執行LOOP1循環
作者: Y_G_G    時間: 2018-11-10 00:32
從這之后中斷就關了,BUSY就一直是1,不會再再有中斷去改變了,所以,就一直在LOOP1這循環了,檢測字節的條件滿足之后,應該是要重新打開中斷的吧

作者: lhxr    時間: 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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产高清一区二区 | 中文字幕一区在线观看视频 | 亚洲一区二区三区视频免费观看 | 综合五月 | 亚洲精色 | 一级一片在线观看 | 亚洲高清视频一区二区 | 国产草草视频 | 国内自拍偷拍 | 一区二区三区国产在线观看 | 久久久精彩视频 | 在线看一区二区 | 日本免费小视频 | 久久久www | 在线观看成人精品 | 欧美一区二区三区高清视频 | 一级全黄视频 | 在线伊人 | 欧美在线观看一区 | 蜜桃av一区二区三区 | 91麻豆精品国产91久久久久久 | 午夜免费福利电影 | 欧洲亚洲一区二区三区 | 亚洲国产欧美在线人成 | 美女三区 | 91国内外精品自在线播放 | 中文字幕人成人 | 精品国产久 | 色免费在线视频 | 精品无码久久久久久久动漫 | 日韩av一区二区在线 | 日韩高清中文字幕 | 成年视频在线观看 | 久久四虎 | 久久精品无码一区二区三区 | 国产亚洲精品区 | 亚洲国产成人精品久久久国产成人一区 | 日韩中文不卡 | 国产一级淫片免费视频 | 久久久久久久久久久蜜桃 | 99久久国产综合精品麻豆 |