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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

大俠們幫忙指點一下這個單片機匯編程序,幾天了找不到原因

[復制鏈接]
跳轉到指定樓層
樓主
50黑幣
單片機STC15W404AS的串口中斷方式接收上位機的命令(5個字節,5F 01 02 XX  FE,其中第四字節XX是變量,根據XX做相應的判斷執行不同動作)
當第四字節為#11H時,串口發送遞增再遞減的電壓值(做呼吸燈控制)現在只能執行一次,第二次就不行,死機了。如果上電后接收到命令,不是11H
都能正常工作,只要有#11H,可以執行循環,但是要是有新的命令過來,就會死機了
TmpData  EQU    01H
AUXR     EQU    08EH
P5   DATA 0C8H
P1M1 DATA 091H
P1M0 DATA 092H

T2H  DATA 0D6H
T2L  DATA 0D7H
FagHX BIT P1.0       ;呼吸模式循環標志
TmpVset EQU 17H      ;臨時電壓變量地址
TmpVsetL EQU 18H     ;遞增初始電壓值地址
TmpVsetH EQU 19H     ;遞減終止電壓值地址

    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         ;存放接受的數據長度---------------------
   Save_UartData:
             LOP:MOV A,TmpData     ;等待新的數據
                 CJNE R2,#5,LOP
                 CLR FagHX         ; 呼吸循環標志:0---退出 ,1---執行
                 CLR ES            ;所有數據接收完畢,禁止串行中斷
                 CLR EA
;------------------------------------------------------------------------
;======根據上位機命令(5F 01 FE 11 FE,第四字節是變量)控制對應燈具亮度(變量放在43H的地址中)
        KK:   MOV A,43H                 ;查看地址43H(接收到的5個字節數據的第四個字節內容做相應的功能判斷)
              CJNE A,#11H,JJ
              SETB FagHX
              JMP HuxiMode
        JJ:   CJNE A,#12H,HH
              MOV  DPTR,#LED_AC5      ; 調光5檔
              LCALL SendString        ; UART發送 A220V
              JMP Waitdata
        HH:   CJNE A,#13H,WW
              MOV  DPTR,#LED_AC1      ; 調光1檔
              LCALL SendString        ; UART發送 A030V
              JMP Waitdata
        WW:   CJNE A,#14H,WW
              MOV  DPTR,#LED_AC3      ; 調光1檔
              LCALL SendString        ; UART發送 A100V
              JMP Waitdata
;--------呼吸模式串口控制--------------------------------------
    HuxiMode:
             JNB FagHX,ExitHuxi   ; 呼吸循環標志:0---退出 ,1---執行
             MOV 10H,#41H  ;A
             MOV 11H,#30H  ;可控硅電壓值百位  0
             MOV 12H,#30H  ;可控硅電壓值十位  0
             MOV 13H,#30H  ;可控硅電壓值個位  0
             MOV 14H,#56H  ;V
             MOV 15H,#0DH  ;0D
             MOV 16H,#0AH  ;0A
             MOV TmpVsetH,#0AAH    ;6EH=110V,78H=120V,82=130v 8CH=140V 96H=150V A0H=160V  AAH=170V  B4H=180V  BEH=190V  C8H=200V
             MOV TmpVsetL, #4BH    ;1EH=30v 23H=35v  28H=40v,2DH=45v 32H=50V   37H=55V 3CH=60v  41H=65v 46H=70v 4BH=75v 50H=80v
  AdjVsetUP:
             MOV A,TmpVsetL       ;起始電壓遞增
             MOV TmpVset,A
     VsetUP: JNB FagHX,ExitHuxi   ; 呼吸循環標志:0---退出 ,1---執行
             MOV A,TmpVset     ;起始電壓遞增
             ADD A,#02H        ;遞增步進值
             MOV TmpVset,A     ;步進增加的值保存
             LCALL HextoASC    ;轉ASCC字符
             LCALL Uart1_Send  ;發送控制值
             LCALL Dly200ms    ;延時
        
               ;  Mov  R1,#30            ; 30X10MS=300ms秒延時子程序
          ; DL44: LCall  Delay
              ;   JNB FagHX,XX  ; 呼吸循環標志:0---退出 ,1---執行
              ;   Djnz  R1,DL44
              ;  XX:
             MOV A,TmpVset
             CJNE A,TmpVsetH,UPstop  ;遞增后是否超過最大值
             JMP  VsetDonw
      UPstop:JC VsetUP               ;小于最大值繼續遞增
    VsetDonw:
             JNB FagHX,ExitHuxi  ; 呼吸循環標志:0---退出 ,1---執行
             MOV A,TmpVset       ;起始電壓遞減
             SUBB A,#02H         ;遞減步進值
             MOV TmpVset,A       ;步進遞減的值保存
             LCALL HextoASC      ;轉ASCC字符
             LCALL Uart1_Send    ;發送控制值
             LCALL Dly200ms
          ;   Mov R1,#30            ; 30X10MS=300ms秒延時子程序
     ; DL444: LCall  Delay
           ;  JNB FagHX,YY  ; 呼吸循環標志:0---退出 ,1---執行
           ;  Djnz  R1,DL444
           ;YY:  
             MOV A,TmpVset
             CJNE A,TmpVsetL,DownStop  ;遞減后的值與設定的最小值比較
             JMP LOOPSTOP
    DownStop:JC  LOOPSTOP          ;大于最小值繼續遞減
             JMP VsetDonw
    LOOPSTOP:JMP HuxiMode          ;繼續下一次繼續循環
    ExitHuxi:Ljmp MAIN
;----------單字節16進制數轉為3字節的ASCII碼-------------------------------
   HextoASC: MOV      A,TmpVset        ;待轉的16進制數
             MOV      B,#100
             DIV      AB
             ADD      A,#30H
             MOV      11H,A            ;百位數存入地址11H
             MOV      A,B
             MOV      B,#10
             DIV       AB
             ADD      A,#30H
             MOV      12H,A             ;十位數存入地址12H
             MOV      A,B
             ADD      A,#30H
             MOV     13H,A              ;個位數存入地址13H
        RET
;---------串口初始化-------------------------------------------------------        
Uart1_Initial:
       ; CLR A
       ; CLR BUSY
       ; 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個字節
                    CLR  FagHX      ;呼吸模式循環標志置零
                    POP ACC                  
              RETI;中斷返回
;16進制發送---------------------------------------------------            
Uart1_Send:     CLR ES                     ; 禁止串行口中斷
                 CLR EA                     ; 禁止CPU中斷
                 CLR A
                 MOV R0,#10H  ;發送從10H地址開始中的數據
                 MOV R2,#07   ;轉發的數據長度7個字節
             S1: MOV A,@R0                  ; 串口發送子程序/取碼指針
                 MOV  SBUF,A                ; 載入SBUF發送
              S2:JBC  TI,S3                 ; 是否發送完?
                 SJMP S2
              S3:INC  R0                    ; 取下一個碼
                 DJNZ R2,S1
                 SETB ES                    ; 允許串行口中斷
                 SETB EA                    ; CPU開中斷
               RET
;----串口發送字符串-------------------------------------------------
      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
;-----------軟件延時----------------------------------------------
     Dly800ms:  Mov    R1,#80               ; 80X10MS=800ms秒延時子程序
          DL6:  Call   Delay
                Djnz   R1,DL6
               Ret
      Dly500ms:  Mov    R1,#50             ; 50X10MS=500ms秒延時子程序
           DL5:  Call   Delay
                 Djnz   R1,DL5
               Ret
     Dly300ms:  Mov    R1,#30            ; 20X10MS=200ms秒延時子程序
           DL4:  Call   Delay              
                 Djnz   R1,DL4         
               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              ; 222
           DL0:MOV R5,#28H               ;40
               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:401564 發表于 2018-11-11 20:15 | 只看該作者
你又來了,我告訴你吧,這在用匯編的人不多的,你的程序越大越看不明白
你還是自己找問題吧,你的程序有點亂,跳轉的和主循環盡量分開,盡量短一點,盡量把一些初始化的操作放在前面,相關的操作盡量放在子程序中
我有時候一個很簡單的錯誤也是搞上三四天也找不到問題的,匯編就是這樣的了
給你參考一下我的格式,如果覺得可以,就改動一下代碼的風格,如果覺得不可以,我也是照著前輩抄的.....

回復

使用道具 舉報

板凳
ID:111634 發表于 2018-11-11 21:20 | 只看該作者
本帖最后由 zl2168 于 2018-11-12 08:28 編輯

實例77  雙機串行通信方式1

Proteus仿真一下,確認有效。
實例77 雙機通信方式1.rar (40.4 KB, 下載次數: 5)

以上c程序摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。
匯編和c程序摘自張志良編著《單片機原理與控制技術——雙解匯編和C51》第3版例6-9,ISBN 978-7-111-42393-5機械工業出版社
回復

使用道具 舉報

地板
ID:111634 發表于 2018-11-11 21:22 | 只看該作者
實例78  雙機串行通信方式2
回復

使用道具 舉報

5#
ID:111634 發表于 2018-11-11 21:22 | 只看該作者
本帖最后由 zl2168 于 2018-11-12 08:42 編輯

實例79  雙機串行通信方式3

Proteus仿真一下,確認有效。
實例79 雙機通信方式3.rar (45.3 KB, 下載次數: 2)

以上c程序摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。
匯編和c程序摘自張志良編著《單片機學習指導及習題解答——雙解匯編和C51》第2版例6-10,ISBN 978-7-111-42431-4機械工業出版社
回復

使用道具 舉報

6#
ID:387733 發表于 2018-11-11 21:55 | 只看該作者
找問題不能光靠看程序,自己寫的程序有錯誤,自己很難看出來的。為了糾正程序中的問題,一定要掌握DEBUG方式,根據自己的編程思路,一小段一小段的跟蹤,可以設置斷點,設置中間變量,跟蹤運行,檢查是否按照自己的思路在運行。
回復

使用道具 舉報

7#
ID:123289 發表于 2018-11-12 12:00 | 只看該作者
畫個流程序圖就明白了,做匯編的必須畫流程圖!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费观看一级毛片 | 人和拘一级毛片c | 成人在线免费观看 | 91久久精品日日躁夜夜躁欧美 | 久久国产秒 | 国产不卡视频在线 | 一区二区在线观看av | 日日操操| 久久专区 | 日韩欧美不卡 | 一区二区精品 | 国产精品视频在线观看 | 欧美一区二区在线看 | 99精品一级欧美片免费播放 | 特级黄一级播放 | 久久久2o19精品 | 久草在线青青草 | 精品一区二区av | 精品久久久久久久 | 精品久久精品 | 国产免费一区二区三区 | 欧美一级欧美一级在线播放 | 久久久国产视频 | 拍戏被cao翻了h承欢 | 日韩一区二区三区精品 | 99国产精品久久久 | 国产一级电影在线观看 | 一区二区三区国产精品 | 高清免费av| 久久伊人影院 | 久久久久久久网 | 成人av一区| 992tv人人草 久久精品超碰 | 精品九九久久 | 日韩欧美中文字幕在线观看 | 日本爱爱视频 | 午夜久久久 | 羞羞视频在线观看网站 | 欧美成人综合 | 在线免费观看黄网 | 日韩一级不卡 |