找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3412|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)匯編語言里面的一個(gè)循環(huán),有中斷時(shí)退不出循環(huán)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
;功能,串口中斷接收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
;=======主程序開始=====================================================================
       MAIN:  LCALL Uart1_Initial     ;串口初始化                 
                 MOV R3,#0                  ;亮度檔位標(biāo)識(shí)清零
       Waitdata: SETB ES                 ;允許串行口中斷
                 SETB EA                     ;CPU開中斷
                 MOV R0,#40H            ;存放接受的數(shù)據(jù)首地址---------------------
                 MOV R2,#0                ;存放接受的數(shù)據(jù)長度---------------------         
;----------單字節(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ī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開中斷
       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開頭的RAM-----------
                    MOV TmpData,A
                    INC R0          ;修改數(shù)據(jù)區(qū)指針-------------
                    INC R2          ;是否接收到5個(gè)字節(jié) ,數(shù)據(jù)長度為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對應(yīng)亮度的可控硅電壓設(shè)置=============================
LED_OFF:DB 'A020V',0DH,0AH     ;關(guān)機(jī)控制命令
LED_ON:DB 'A030V',0DH,0AH      ;開機(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

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

使用道具 舉報(bào)

沙發(fā)
ID:421538 發(fā)表于 2018-11-9 09:25 | 只看該作者
現(xiàn)在是如果第4字節(jié)是#04H,可以執(zhí)行LOOP1循環(huán),當(dāng)下次數(shù)據(jù)第4字節(jié)不是#04H時(shí),要退出LOOP1循環(huán),不不知道錯(cuò)在哪里。BUSY是判斷是否執(zhí)行循環(huán)的,為1執(zhí)行LOOP1循環(huán),為0不執(zhí)行LOOP1循環(huán)
回復(fù)

使用道具 舉報(bào)

板凳
ID:401564 發(fā)表于 2018-11-10 00:32 | 只看該作者
從這之后中斷就關(guān)了,BUSY就一直是1,不會(huì)再再有中斷去改變了,所以,就一直在LOOP1這循環(huán)了,檢測字節(jié)的條件滿足之后,應(yīng)該是要重新打開中斷的吧
回復(fù)

使用道具 舉報(bào)

地板
ID:421538 發(fā)表于 2018-11-10 11:54 | 只看該作者
感謝幫助,修改了一下,程序正常運(yùn)行,達(dá)到我的功能
在發(fā)送一幀數(shù)據(jù)前關(guān)閉中斷,發(fā)完一幀數(shù)據(jù)后重新打開中斷
;=====串口發(fā)送字符串信息函數(shù)========================================
      SendString:
                 CLR ES                     ; 禁止串行口中斷
                 CLR EA                     ; 禁止CPU中斷
                 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ā)到字母V(ACSII碼56H)則結(jié)束
                 SETB ES                    ; 允許串行口中斷
                 SETB EA                    ; CPU開中斷
            RET
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表