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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

程序在單片機STC8G1K08A上死機

[復制鏈接]
跳轉到指定樓層
樓主
ID:257760 發表于 2021-8-21 12:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
程序分主程序和PCA定時器。寫入器件(STC8G1K08A):按啟動開關(P3.3),PCA運行正常有輸出,而主程序有時有輸出,有時沒有輸出。且沒有輸出時,按啟動開關(P3.3)不起作用也不能關閉PCA。經判斷程序在(32位除16位 即程序:第2步算:雙字節無符號除法)處于死循環!但關閉PCA定時器,主程序輸出又正常,程序仿真也正常!這是為什么?用T0,T1 定時器也是這情況!
未開啟看門狗
程序用匯編寫的
  1. ;器件STC8G1K08A

  2.           ORG    0000H
  3.           LJMP   MAIN1
  4.           ORG    003BH         ;PCA中斷
  5.           LJMP   PCAISR
  6.           ORG  0100H

  7. //************************IO口*************************
  8.           P5      EQU     0C8H
  9.           P5M1    EQU     0C9H
  10.           P5M0    EQU     0CAH
  11.           P3M1    EQU     0B1H
  12.           P3M0    EQU     0B2H
  13. //************************ADC*************************
  14.         AUXR        EQU  8EH       ;輔助寄存器
  15.         ADC_CONTR   EQU  0BCH      ;ADC控制寄存器
  16.         ADC_RES     EQU  0BDH      ;ADC高2位結果
  17.         ADC_RESL    EQU  0BEH      ;ADC低8位結果
  18.         ADCCFG    EQU  0DEH        //ADC 配置寄存器
  19.         P_SW2 DATA 0BAH
  20.         ADCTIM XDATA 0FEA8H    //ADC速度控制器
  21. //************************PCA*************************
  22.         CCON DATA 0D8H          //PCA控制寄存器
  23.         CF BIT CCON.7              //PCA控制寄存器B7位,  計數器溢出中斷標志
  24.         CR BIT CCON.6              //PCA控制寄存器B6位.  計數器啟動控制位
  25.         CCF2 BIT CCON.2          //PCA控制寄存器B2位,  模塊2中斷標志,需軟件清零
  26.         CCF1 BIT CCON.1          //PCA控制寄存器B1位,  模塊1中斷標志,需軟件清零
  27.         CCF0 BIT CCON.0          //PCA控制寄存器B0位,  模塊0中斷標志,需軟件清零
  28.         CMOD DATA 0D9H         //PCA模式寄存器,     空閑時是否繼續計數及時鐘設定
  29.         CL DATA 0E9H                  //PCA計數器低字節
  30.         CH DATA 0F9H                   //PCA計數器高字節

  31.         CCAPM0 DATA 0DAH      //PCA模塊0模式控制寄存器
  32.         CCAP0L DATA 0EAH         //PCA模塊0低字節
  33.         CCAP0H DATA 0FAH         //PCA模塊0高字節
  34.         PCA_PWM0 DATA 0F2H    //PCA0的PWM模式寄存器

  35.         CCAPM1 DATA 0DBH      //PCA模塊1模式控制寄存器
  36.         CCAP1L DATA 0EBH           //PCA模塊1低字節
  37.         CCAP1H DATA 0FBH          //PCA模塊1高字節
  38.         PCA_PWM1 DATA 0F3H    //PCA1的PWM模式寄存器

  39.         CCAPM2 DATA 0DCH        //PCA模塊2模式控制寄存器
  40.         CCAP2L DATA  0ECH          //PCA模塊2低字節
  41.         CCAP2H DATA  0FCH         //PCA模塊2高字節
  42.         PCA_PWM2 DATA 0F4H    //PCA2的PWM模式寄存器
  43.         T50HZ  EQU  0029H               //此調頻率 0030H為10K

  44. //************************常用*************************

  45.         E_DATAS_L  EQU    34H          ;有效定時器值L
  46.         E_DATAS_H  EQU    35H          ;有效定時器值H
  47.         E_DUTY_L   EQU    37H       //有效占空L
  48.         E_DUTY_H   EQU    38H      //有效占空H
  49.         I_DUTY_L  EQU    39H         //無效占空L
  50.         I_DUTY_H  EQU    3AH       //無效占空H
  51.         I_DATAS_L  EQU    3DH          ;無效定時器值L
  52.         I_DATAS_H  EQU    3EH          ;無效定時器值H
  53.         BUTTON EQU 3FH                 ;ADC按鈕控制
  54.         IPH  EQU  0B7H                    //高中斷優先級控制寄存器

  55. MAIN1:   MOV SP, #5FH        //設置堆棧指針為5FH
  56.               SETB EA                           //開中斷
  57.               MOV IP,#080H                  //PCA中斷最高級,T1中斷最低級
  58.               MOV IPH,#080H               //PCA中斷最高級,T1中斷最低級

  59.               MOV  P3M1,#00000100B        
  60.               MOV  P3M0,#00000000B      
  61.               MOV  P5M1,#00100000B
  62.               MOV  P5M0,#00000000B        

  63.               SETB P5.4              
  64.               CLR P3.0               
  65.               CLR P3.1               

  66.               MOV CCON ,#00H         //PCA配置
  67.               MOV CMOD ,#00H        //PCA配置

  68.         ANL AUXR,#0BFH                ;定時器1時鐘12T模式
  69.         ANL TMOD,#0FH                ;設置定時器模式
  70.         ORL TMOD,#10H                ;設置定時器模式

  71.               CALL  GET_ADC    //初始化,開ADC電源,
  72. ;.....................................................準備

  73. JSM06:   SETB P5.4              
  74.               CLR TR1

  75.               CLR  CR
  76.               CLR P3.0
  77.               CLR P3.1

  78.               CALL DELAY100MS      
  79.               JB P3.3,JSM06         
  80. ;...................................................主程序

  81. JSM01:    JNB P3.3,JSM01          ;防止開關抖動
  82.               CALL DELAY100MS       ;防止開關抖動
  83.               JNB P3.3,JSM01         

  84.              LCALL PCA_ON               //開PCA定時器

  85.               CALL  AUT_DUTY    //占空計算
  86.               CALL FREQUENCY   //頻率計算

  87.               MOV TH1,I_DATAS_H
  88.               MOV TL1 ,I_DATAS_L
  89.               SETB  TR1
  90.               SETB P5.4              ;關后級

  91. JSM04:   JNB P3.3,JSM06          ;開關是否放開
  92.              JNB TF1,JSM04
  93.              CLR TR1
  94.              CLR TF1
  95.              JB P5.4,LLLL

  96.              MOV TH1, I_DATAS_H
  97.              MOV TL1, I_DATAS_L
  98.              SETB TR1
  99.              SETB P5.4               
  100.              ACALL  AUT_DUTY    //占空計算
  101.              ACALL FREQUENCY   //頻率計算
  102.              AJMP JSM04
  103.              RET
  104.         
  105. LLLL:   
  106.              MOV TH1,E_DATAS_H
  107.              MOV TL1,E_DATAS_L

  108.              SETB TR1
  109.              CLR P5.4                  ;開后級  
  110.              AJMP JSM04      
  111.              RET




  112. //****************PCA啟動********************
  113. PCA_ON:

  114.             MOV CL ,#00H
  115.             MOV CH ,# 00H
  116.             MOV CCAPM0,#49H
  117.             MOV CCAP0L,#LOW T50HZ
  118.             MOV CCAP0H,# HIGH T50HZ
  119.             SETB  CR
  120.             SETB P3.0
  121.             RET


  122. ;********************************************************************ADC初始化
  123. GET_ADC:            //初始化

  124.           MOV P_SW2,#80H
  125.           MOV DPTR,#ADCTIM ;設置 ADC 內部時序
  126.           MOV A,#3FH
  127.           MOVX @DPTR,A
  128.           MOV P_SW2,#00H
  129.           MOV ADCCFG,#02FH ;設置 ADC 時鐘為系統時鐘/2/16/16, 結果右對齊
  130.           MOV ADC_CONTR,#080H ;開啟 ADC 模塊電源,
  131.           RET


  132. ;****************************************占空計算************************************
  133. AUT_DUTY:
  134. ;********************************************************************ADC2轉換

  135. GET_ADC2:
  136.           MOV ADC_CONTR,#082H ;使能 ADC 模塊,設P3.2為ADC2
  137.           ORL ADC_CONTR,#40H     ;啟動 AD 轉換"ORL或運算=逢1等于1"
  138.            NOP
  139.            NOP
  140.            MOV A,ADC_CONTR     ;查詢 ADC 完成標志
  141.            JNB ACC.5,$-2              ;ACC.5是否為‘1’,不為‘1’原址等待
  142.            ANL ADC_CONTR,#NOT 20H        ;清完成標志


  143. //單字節無符號數乘法
  144.                  MOV R3,ADC_RES
  145.                  MOV R4,ADC_RESL
  146.                  MOV R7,#00AH
  147. NMUL21 : MOV A,R4
  148.                 MOV B,R7
  149.                 MUL AB
  150.                 MOV R4,A
  151.                 MOV A,B
  152.                 XCH A,R3
  153.                 MOV B,R7
  154.                 MUL AB
  155.                 ADD A,R3
  156.                 MOV R3,A
  157.                 CLR A
  158.                 ADDC A,B
  159.                 MOV R2,A
  160.                 CLR OV
  161. //單字節無符號除法程序
  162.                  MOV R7,#066H
  163. NDIV31 :   MOV A,R2
  164.                 MOV B,R7
  165.                 DIV AB
  166.                 PUSH ACC
  167.                 MOV R2,B
  168.                 MOV B,#10H
  169. NDV311 : CLR C
  170.                MOV A,R4
  171.                RLC A
  172.                MOV R4,A
  173.                MOV A,R3
  174.                RLC A
  175.                MOV R3,A
  176.                MOV A,R2
  177.                RLC A
  178.                MOV R2,A
  179.                MOV F0,C
  180.                CLR C
  181.                SUBB A,R7
  182.                JB F0,NDV312
  183.                JC NDV313
  184. NDV312 : MOV R2,A
  185.                INC R4
  186. NDV313 : DJNZ B,NDV311
  187.                POP ACC
  188.                CLR OV
  189.                JZ NDV314
  190.                SETB OV
  191. NDV314 : XCH A,R2
  192.                MOV R7,A
  193.                MOV E_DUTY_L,R4      
  194.                MOV E_DUTY_H,R3     

  195. //雙字節無符號數減法
  196.             MOV R3,#03H  
  197.             MOV R4,#0E8H
  198.             MOV R6,E_DUTY_H
  199.             MOV R7,E_DUTY_L   
  200. NSUB : MOV A,R4
  201.             CLR C
  202.             SUBB A,R7
  203.             MOV R4,A
  204.             MOV A,R3
  205.             SUBB A,R6
  206.             MOV R3,A
  207.             MOV I_DUTY_L,R4         
  208.             MOV I_DUTY_H,R3      
  209.             RET

  210. //*********************************頻率計算***********************************
  211. FREQUENCY:
  212. ;**************************************ADC5轉換
  213. GET_ADC5:
  214.           MOV ADC_CONTR,#085H ;使能 ADC 模塊,設P5.5為ADC5
  215.           ORL ADC_CONTR,#40H     ;啟動 AD 轉換"ORL或運算=逢1等于1"
  216.            NOP
  217.            NOP

  218.            MOV A,ADC_CONTR     ;查詢 ADC 完成標志
  219.            JNB ACC.5,$-2              ;ACC.5是否為‘1’,不為‘1’原址等待
  220.            ANL ADC_CONTR,#NOT 20H        ;清完成標志

  221. ;計算有效定時器值。。。。。。。
  222.                MOV R3,#01BH
  223.                MOV R4,#058H
  224.                MOV R6,E_DUTY_H
  225.                MOV R7,E_DUTY_L

  226.                ACALL STEP_1                   //第1步算

  227.                MOV R6,ADC_RES
  228.                MOV R7,ADC_RESL

  229.                ACALL STEP_2                  //第2步算

  230.                MOV A,R3
  231.                MOV R6,A
  232.                MOV A,R4
  233.                MOV R7,A
  234.                MOV R3,#0FFH
  235.                MOV R4,#0FFH

  236.                ACALL STEP_3                  //第3步算
  237.                MOV E_DATAS_L,R4         
  238.                MOV E_DATAS_H,R3         

  239. ;計算無效定時器值。。。。。。。
  240.                MOV R3,#01BH
  241.                MOV R4,#058H
  242.                MOV R6,I_DUTY_H
  243.                MOV R7,I_DUTY_L

  244.                ACALL STEP_1                //;第1步算

  245.                MOV R6,ADC_RES
  246.                MOV R7,ADC_RESL

  247.                ACALL STEP_2                 //第2步算

  248.                MOV A,R3
  249.                MOV R6,A
  250.                MOV A,R4
  251.                MOV R7,A
  252.                MOV R3,#0FFH
  253.                MOV R4,#0FFH

  254.                ACALL STEP_3                  //第3步算
  255.                MOV I_DATAS_L,R4         
  256.                MOV I_DATAS_H,R3         
  257.                RET

  258. //第1步算:雙字節無符號數乘法
  259. STEP_1:
  260. NMUL22 : MOV A,R4
  261.                 MOV B,R7
  262.                 MUL AB
  263.                 XCH A,R4
  264.                 MOV R5,B
  265.                 MOV B,R6  
  266.                 MUL AB
  267.                 ADD A,R5
  268.                 MOV R5,A
  269.                 CLR A
  270.                 ADDC A,B
  271.                 MOV R2,A
  272.                 MOV A,R3
  273.                 MOV B,R7
  274.                 MUL AB
  275.                 ADD A,R5
  276.                 MOV R5,A
  277.                 MOV A,B
  278.                 ADDC A,R2
  279.                 MOV R2,A
  280.                 CLR A
  281.                 ADDC A,#00H
  282.                 XCH A,R3
  283.                 MOV B,R6
  284.                 MUL AB
  285.                 ADD A,R2
  286.                 MOV R2,A
  287.                 MOV A,B
  288.                 ADDC A,R3
  289.                 XCH A,R5
  290.                 MOV R3,A
  291.                 CLR OV
  292.                 RET
  293. //第2步算:雙字節無符號除法
  294. STEP_2:
  295. NDIV42 :  MOV A,R1
  296.                 PUSH ACC
  297.                 MOV B,#00H
  298. NDV421 : MOV A,R2
  299.                CLR C
  300.                SUBB A,R7
  301.                MOV R1,A
  302.                MOV A,R5
  303.                SUBB A,R6
  304.                JC NDV422
  305.                MOV R5,A
  306.                MOV A,R1
  307.                MOV R2,A
  308.                INC B
  309.                SJMP NDV421
  310. NDV422 : PUSH B
  311.                 MOV B,#10H
  312. NDV423 : CLR C
  313.                 MOV A,R4
  314.                 RLC A
  315.                 MOV R4,A
  316.                 MOV A,R3
  317.                 RLC A
  318.                 MOV R3,A
  319.                 MOV A,R2
  320.                 RLC A
  321.                 MOV R2,A
  322.                 XCH A,R5
  323.                 RLC A
  324.                 XCH A,R5
  325.                 MOV F0,C
  326.                 CLR C
  327.                 SUBB A,R7
  328.                 MOV R1,A
  329.                 MOV A,R5
  330.                 SUBB A,R6
  331.                 JB F0,NCV424
  332.                 JC NDV425
  333. NCV424 : MOV R5,A
  334.                MOV A,R1
  335.                MOV R2,A
  336.                INC R4
  337. NDV425 : DJNZ B,NDV423
  338.                POP ACC
  339.                CLR OV
  340.                JNZ NDV426
  341.                SETB OV
  342. NDV426 : XCH A,R2
  343.                MOV R7,A
  344.                MOV A,R5
  345.                MOV R6,A
  346.                POP ACC
  347.                MOV R1,A
  348.                RET

  349. //第3步算:雙字節無符號數減法程序
  350. STEP_3:
  351.             MOV A,R4
  352.             CLR C
  353.             SUBB A,R7
  354.             MOV R4,A
  355.             MOV A,R3
  356.             SUBB A,R6
  357.             MOV R3,A
  358.             RET


  359. //**************************PCA中斷***************************
  360. PCAISR : PUSH ACC                            //進堆棧
  361.               PUSH PSW                           //進堆棧
  362.               CLR  CR                               //關PCA
  363.               CLR CCF0                            //模塊0中斷標志清零
  364.               JB P3.0,JSMJSM

  365.             CLR P3.1
  366.             MOV CL ,#00H
  367.             MOV CH ,# 00H
  368.             MOV CCAPM0,#49H
  369.             MOV CCAP0L,#LOW T50HZ
  370.             MOV CCAP0H,# HIGH T50HZ
  371.             NOP
  372.             NOP
  373.             NOP
  374.             NOP
  375.             NOP
  376.             NOP
  377.             NOP
  378.             NOP
  379.             NOP
  380.             NOP
  381.             SETB  CR
  382.             SETB P3.0      
  383.             POP PSW                         //出堆棧
  384.             POP ACC                         //出堆棧           ;恢復現場              
  385.             RETI
  386. JSMJSM:               
  387.             CLR P3.0
  388.             MOV CL ,#00H
  389.             MOV CH ,# 00H
  390.             MOV CCAPM0,#49H
  391.             MOV CCAP0L,#LOW T50HZ
  392.             MOV CCAP0H,# HIGH T50HZ
  393.             NOP
  394.             NOP
  395.             NOP
  396.             NOP
  397.             NOP
  398.             NOP
  399.             NOP
  400.             SETB  CR
  401.             SETB  P3.1      
  402.             POP PSW                         //出堆棧
  403.             POP ACC                         //出堆棧           ;恢復現場
  404.             RETI

  405. ;軟件延時
  406. DELAY100MS:                        ;@12.000MHz
  407.         NOP
  408.         PUSH 30H
  409.         PUSH 31H
  410.         PUSH 32H
  411.         MOV 30H,#7
  412.         MOV 31H,#23
  413.         MOV 32H,#103
  414. NEXT:
  415.         DJNZ 32H,NEXT
  416.         DJNZ 31H,NEXT
  417.         DJNZ 30H,NEXT
  418.         POP 32H
  419.         POP 31H
  420.         POP 30H
  421.         RET


  422. END
復制代碼


占空.zip

2.97 KB, 下載次數: 5

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

使用道具 舉報

沙發
ID:401564 發表于 2021-8-21 16:32 | 只看該作者
沒有任何注釋,沒有清淅的標號,沒有使用EQU來聲明,只用R1,R2,R3.....
你確定這樣的匯編程序,別人能看得明白?也許你能看明白,但在別人眼中就是一堆英文字母你的除法看不明白,乘法也看不明白
這是我寫的一個乘法的,已經經過驗證的,
/*=========================================================================================
;MUL_DISP,乘法處理
R5 R4 作為乘數
R7 R6 作為被乘數  因為是乘法運算,并不用區分先后和乘數
R3 R2 R1 R0 分別存放乘法運算的四個結果
CA_BUF 用于存放乘法運算的進位
=========================================================================================*/
MUL_DISP:                MOV                A,R6                ;
                                MOV                B,R4                ;R6*R4
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                MOV                R0,A                ;=====================得到R0
                                MOV         CA_BUF,B        ;B作為進位
                                MOV                A,R6                ;R6*R5
                                MOV                B,R5                ;
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                CLR                C                ;
                                ADD                A,CA_BUF        ;
                                MOV                DATA_BUF_L,A;
                                MOV                A,B                ;
                                ADDC        A,#0                ;
                                MOV                DATA_BUF_H,A;
;===================================================
                                MOV                A,R7                ;R7*R4
                                MOV                B,R4                ;
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                MOV                R1,A                ;
                                MOV         CA_BUF,B        ;B作為進位
                                MOV                A,R7                ;R7*R5
                                MOV                B,R5                ;
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                CLR                C                ;
                                ADD                A,CA_BUF        ;
                                MOV                CA_BUF,A        ;
                                MOV                A,B                ;
                                ADDC        A,#0                ;
                                MOV                R3,A;        ;
;===================================================
                                CLR                C                ;
                                MOV                A,DATA_BUF_L;
                                ADD                A,R1                ;
                                MOV                R1,A                ;=====================得到R1
                                MOV                A,DATA_BUF_H;
                                ADDC        A,CA_BUF        ;
                                MOV                R2,A                ;=====================得到R2
                                MOV                A,R3                ;
                                ADDC        A,#0                ;
                                MOV                R3,A                ;=====================得到R3
;===================================現在已經得到了一個32位的數據
RET


評分

參與人數 1黑幣 +15 收起 理由
dalaoshi + 15 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:257760 發表于 2021-8-24 09:17 | 只看該作者
問題已解決!程序沒問題,是PCB板上的輸出走線跟AD輸入走線靠太近的原因
回復

使用道具 舉報

地板
ID:624769 發表于 2021-8-27 04:19 | 只看該作者
那個,弱弱問一下,你都用STC8G1K08A了, 那么它自帶的16位乘法器,32位除法器你為啥不用呢?速度快效率高,代碼還能簡單。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人久久精品 | 美国一级片在线观看 | 国产三级日本三级 | 欧美精品一区三区 | 国产在线观看 | 日本精品视频 | 亚洲伊人久久综合 | 91免费福利在线 | 最新国产福利在线 | 午夜激情免费 | 激情视频一区 | 九色在线视频 | 日韩精品在线网站 | 国产一区二区在线91 | 日韩有码一区 | 99亚洲精品 | 一区二区三区视频在线观看 | 国产99热在线 | 久久专区 | 久久亚洲一区二区三区四区 | 日日夜夜天天干 | 亚洲免费一区 | 亚洲成年影院 | 高清国产午夜精品久久久久久 | 国产美女久久 | 国产日韩欧美精品一区二区三区 | 中文字幕日韩欧美 | 日本爱爱视频 | 91视频播放 | 久久久免费少妇高潮毛片 | 三级视频网站 | 久久国产精品99久久久久 | 在线看一区二区三区 | 欧美成年黄网站色视频 | 亚洲免费观看视频网站 | 国产.com| 欧美日韩在线免费观看 | 日韩中文字幕在线观看 | 日韩av在线免费 | 欧美一级片在线看 | 欧美不卡一区二区 |