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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3401|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
;功能,串口中斷接收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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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這循環了,檢測字節的條件滿足之后,應該是要重新打開中斷的吧
回復

使用道具 舉報

地板
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区在线 | 欧美激情在线一区二区三区 | 久久香焦 | 看毛片的网站 | 在线播放国产一区二区三区 | 国产成人网 | 久久精品一区 | 国产精品亚洲二区 | 成人免费视频7777777 | 国产中文视频 | 91xxx在线观看 | av在线免费不卡 | 中文在线一区 | 亚洲天堂成人在线视频 | 久久99精品久久久久婷婷 | 国产不卡视频在线 | 精品九九 | 日本精品视频在线 | 视频一区二区三区在线观看 | 免费精品视频在线观看 | 免费看黄色国产 | 午夜激情视频在线 | 一区二区国产精品 | 欧美日韩免费 | 久久伊人操 | 日本高清视频在线播放 | 人成久久 | av三级 | 黄色大片观看 | 亚洲国产视频一区二区 | 亚洲精品一区二区另类图片 | 激情婷婷| 亚洲人成免费 | 欧洲一区在线观看 | 国外激情av| 中文字幕 在线观看 | 视频一区二区三区中文字幕 | 最新日韩在线 | 在线观看日韩精品视频 | 日韩精品亚洲专区在线观看 | 欧美 日韩 国产 成人 在线 |