找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

程序在單片機(jī)STC8G1K08A上死機(jī)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:257760 發(fā)表于 2021-8-21 12:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
程序分主程序和PCA定時(shí)器。寫入器件(STC8G1K08A):按啟動(dòng)開關(guān)(P3.3),PCA運(yùn)行正常有輸出,而主程序有時(shí)有輸出,有時(shí)沒有輸出。且沒有輸出時(shí),按啟動(dòng)開關(guān)(P3.3)不起作用也不能關(guān)閉PCA。經(jīng)判斷程序在(32位除16位 即程序:第2步算:雙字節(jié)無符號(hào)除法)處于死循環(huán)!但關(guān)閉PCA定時(shí)器,主程序輸出又正常,程序仿真也正常!這是為什么?用T0,T1 定時(shí)器也是這情況!
未開啟看門狗
程序用匯編寫的
  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位結(jié)果
  17.         ADC_RESL    EQU  0BEH      ;ADC低8位結(jié)果
  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位,  計(jì)數(shù)器溢出中斷標(biāo)志
  24.         CR BIT CCON.6              //PCA控制寄存器B6位.  計(jì)數(shù)器啟動(dòng)控制位
  25.         CCF2 BIT CCON.2          //PCA控制寄存器B2位,  模塊2中斷標(biāo)志,需軟件清零
  26.         CCF1 BIT CCON.1          //PCA控制寄存器B1位,  模塊1中斷標(biāo)志,需軟件清零
  27.         CCF0 BIT CCON.0          //PCA控制寄存器B0位,  模塊0中斷標(biāo)志,需軟件清零
  28.         CMOD DATA 0D9H         //PCA模式寄存器,     空閑時(shí)是否繼續(xù)計(jì)數(shù)及時(shí)鐘設(shè)定
  29.         CL DATA 0E9H                  //PCA計(jì)數(shù)器低字節(jié)
  30.         CH DATA 0F9H                   //PCA計(jì)數(shù)器高字節(jié)

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

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

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

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

  45.         E_DATAS_L  EQU    34H          ;有效定時(shí)器值L
  46.         E_DATAS_H  EQU    35H          ;有效定時(shí)器值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          ;無效定時(shí)器值L
  52.         I_DATAS_H  EQU    3EH          ;無效定時(shí)器值H
  53.         BUTTON EQU 3FH                 ;ADC按鈕控制
  54.         IPH  EQU  0B7H                    //高中斷優(yōu)先級(jí)控制寄存器

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

  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                ;定時(shí)器1時(shí)鐘12T模式
  69.         ANL TMOD,#0FH                ;設(shè)置定時(shí)器模式
  70.         ORL TMOD,#10H                ;設(shè)置定時(shí)器模式

  71.               CALL  GET_ADC    //初始化,開ADC電源,
  72. ;.....................................................準(zhǔn)備

  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          ;防止開關(guān)抖動(dòng)
  82.               CALL DELAY100MS       ;防止開關(guān)抖動(dòng)
  83.               JNB P3.3,JSM01         

  84.              LCALL PCA_ON               //開PCA定時(shí)器

  85.               CALL  AUT_DUTY    //占空計(jì)算
  86.               CALL FREQUENCY   //頻率計(jì)算

  87.               MOV TH1,I_DATAS_H
  88.               MOV TL1 ,I_DATAS_L
  89.               SETB  TR1
  90.               SETB P5.4              ;關(guān)后級(jí)

  91. JSM04:   JNB P3.3,JSM06          ;開關(guān)是否放開
  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    //占空計(jì)算
  101.              ACALL FREQUENCY   //頻率計(jì)算
  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                  ;開后級(jí)  
  110.              AJMP JSM04      
  111.              RET




  112. //****************PCA啟動(dòng)********************
  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 ;設(shè)置 ADC 內(nèi)部時(shí)序
  126.           MOV A,#3FH
  127.           MOVX @DPTR,A
  128.           MOV P_SW2,#00H
  129.           MOV ADCCFG,#02FH ;設(shè)置 ADC 時(shí)鐘為系統(tǒng)時(shí)鐘/2/16/16, 結(jié)果右對(duì)齊
  130.           MOV ADC_CONTR,#080H ;開啟 ADC 模塊電源,
  131.           RET


  132. ;****************************************占空計(jì)算************************************
  133. AUT_DUTY:
  134. ;********************************************************************ADC2轉(zhuǎn)換

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


  143. //單字節(jié)無符號(hào)數(shù)乘法
  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. //單字節(jié)無符號(hào)除法程序
  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. //雙字節(jié)無符號(hào)數(shù)減法
  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. //*********************************頻率計(jì)算***********************************
  211. FREQUENCY:
  212. ;**************************************ADC5轉(zhuǎn)換
  213. GET_ADC5:
  214.           MOV ADC_CONTR,#085H ;使能 ADC 模塊,設(shè)P5.5為ADC5
  215.           ORL ADC_CONTR,#40H     ;啟動(dòng) AD 轉(zhuǎn)換"ORL或運(yùn)算=逢1等于1"
  216.            NOP
  217.            NOP

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

  221. ;計(jì)算有效定時(shí)器值。。。。。。。
  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. ;計(jì)算無效定時(shí)器值。。。。。。。
  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步算:雙字節(jié)無符號(hào)數(shù)乘法
  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步算:雙字節(jié)無符號(hào)除法
  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步算:雙字節(jié)無符號(hào)數(shù)減法程序
  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                            //進(jìn)堆棧
  361.               PUSH PSW                           //進(jìn)堆棧
  362.               CLR  CR                               //關(guān)PCA
  363.               CLR CCF0                            //模塊0中斷標(biāo)志清零
  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                         //出堆棧           ;恢復(fù)現(xiàn)場              
  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                         //出堆棧           ;恢復(fù)現(xiàn)場
  404.             RETI

  405. ;軟件延時(shí)
  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
復(fù)制代碼


占空.zip

2.97 KB, 下載次數(shù): 5

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

使用道具 舉報(bào)

沙發(fā)
ID:401564 發(fā)表于 2021-8-21 16:32 | 只看該作者
沒有任何注釋,沒有清淅的標(biāo)號(hào),沒有使用EQU來聲明,只用R1,R2,R3.....
你確定這樣的匯編程序,別人能看得明白?也許你能看明白,但在別人眼中就是一堆英文字母你的除法看不明白,乘法也看不明白
這是我寫的一個(gè)乘法的,已經(jīng)經(jīng)過驗(yàn)證的,
/*=========================================================================================
;MUL_DISP,乘法處理
R5 R4 作為乘數(shù)
R7 R6 作為被乘數(shù)  因?yàn)槭浅朔ㄟ\(yùn)算,并不用區(qū)分先后和乘數(shù)
R3 R2 R1 R0 分別存放乘法運(yùn)算的四個(gè)結(jié)果
CA_BUF 用于存放乘法運(yùn)算的進(jìn)位
=========================================================================================*/
MUL_DISP:                MOV                A,R6                ;
                                MOV                B,R4                ;R6*R4
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                MOV                R0,A                ;=====================得到R0
                                MOV         CA_BUF,B        ;B作為進(jìn)位
                                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作為進(jìn)位
                                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
;===================================現(xiàn)在已經(jīng)得到了一個(gè)32位的數(shù)據(jù)
RET


評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
dalaoshi + 15 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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