51单片机侧转速系统,做了仿真,但是数码管没有图像,不知道错在哪里--好悲伤。。。

2019-03-24 17:45发布

                        //主程序开始,在一定测量时间T内,测量脉冲发生器(替代输入脉冲)产生的脉冲数M来测量转速//
                        ORG 0000H
                    AJMP MAIN
                        ORG 000BH
                        AJMP TO
                        ORG 0030H
         MAIN:        MOV SP,#60H                    ;        主程序块,对定时器T0所在计数器进行初始化
                         MOV B,#0AH                                  
                        MOV TMOD,#51H                          ;采用方式1对进行定时
                    MOV TL0,#0B0H
                        MOV TH0,#3CH                                ;每次计时为100ms,10次计时为1s
                    SETB TR0
                        SETB ET0
                        SETB EA                                            ;开启中断
        HERE:   SJMP HERE   
               
                  //T0中断处理程序                  //
                 //************************  //                       
        TO:     MOV TL0,#0B0H                        ;外部中断0发生中断处理子程序
                           MOV TH0,#3CH                         
                        DJNZ B,LOOP                        ;发生外部中断时,对脉冲进行处理,跳转到数据处理和显示模块
                         CLR TR0         
    LOOP:   RETI     
        ADAD:         MOV A,TH1                                        ;将1s钟时刻,所测得外部脉冲进行计数后,将高低字节放入到对应的单元
                        MOV 45H,A
                        MOV A,TL1
                        MOV 44H,A  
                        MOV 46H,00H
                                     
                //1s时间到了,程序数据处理单元,一个4字节除以3字节的程序
                //*****************************************************//
                 //对单片机需要数据处理的需要的单元进行定义
//********************************                //
                       
                        ;定义被除数单元
                DIVDLL    EQU    40H
                DIVDLH    EQU    41H
                DIVDHL    EQU    42H
                DIVDHH    EQU    43H
                        ;定义除数单元
                DIVDL     EQU    44H
                DIVDM     EQU    45H
                DIVDH     EQU    46H
                        ;定义余数单元
                TEMPL     EQU    50H
                TEMPM     EQU    51H
                TEMPH     EQU    52H
                        ;定义辅助单元
                FZ1       EQU    47H
                FZ2       EQU    48H
DIV0:        MOV 40H,00H                                ;通过计算,得到被除数,将被除数放入对应的单元当中
                MOV 41H,0C0H
                MOV 42H,4BH
            MOV 43H,03H
            MOV   A,DIVDH                     ;        以下四行判断除数是否为零
        ORL   A,DIVDM
        ORL   A,DIVDL
        JNZ   DIV1                      ;如果(A)不等于0,则跳转;否则顺序执行
        SETB  OV                       ;除数为零,置溢出标志位OV为1,程序结束
        SJMP  LOOP1
DIV1:   MOV   TEMPL,#00H                                 ;余数单元清零
        MOV   TEMPM,#00H
        MOV   TEMPH,#00H
        MOV   B,#20H                           ;置循环次数32次
DIV2:   CLR   C                              ;进位位清零
        MOV   A,DIVDLL                        ;以下三行被除数最低字节左移一位(带进位)
        RLC   A
        MOV   DIVDLL,A
        MOV   A,DIVDLH                        ;以下三行被除数低16位高字节左移一位(带进位)
        RLC   A
        MOV   DIVDLH,A
        MOV   A,DIVDHL                 ;以下三行被除数高16位低字节左移一位(带进位)
        RLC   A                                               
        MOV   DIVDHL,A
        MOV   A,DIVDHH                 ;以下三行被除数最高字节左移一位(带进位)
        RLC   A
        MOV   DIVDHH,A
        MOV   A,TEMPL                  ;以下三行余数低字节左移一位(带进位)                    
        RLC   A
        MOV   TEMPL,A
        MOV   A,TEMPM                 ;以下三行余数中间字节左移一位(带进位)
        RLC   A
        MOV   TEMPM,A
        MOV   A,TEMPH                  ;以下三行余数高字节左移一位(带进位)
        RLC   A
        MOV   TEMPH,A
        MOV   A,TEMPL                  ;把余数最低字节送到累加器A中
        CLR   C                              
        SUBB  A,DIVDL                  ;用余数减去除数
        MOV   R7,A                     ;低字节相减结果送R7保存
        MOV   A,TEMPL
        CJNE  A,DIVDL,LP1                    ;通过比较运算实现因软件设计原因相减不能借位

                                         ;而产生的借位
  LP1:  MOV   A,DIVDM                        
        ADDC  A,#00H
        MOV   FZ1,A                    ;计算除数中间字节与低字节相减产生的进位位之和

                                         ;将结果送FZ1保存
        MOV   A,TEMPM
        CJNE  A,FZ1,LP2               ;通过比较运算实现因软件设计原因相减不能借位

                                        ;而产生的借位
LP2:    PUSH  PSW                     ;对程序状态字PSW压栈保护
        MOV   F0,C                    ;将C的值送给F0保存
        CLR   C
        MOV   A,TEMPM
        SUBB  A,FZ1   
        MOV   R6,A                    ;中间字节带进位相减结果送R6保存
        MOV   C,F0
        POP   PSW                     ;程序状态字PSW弹栈,恢复现场
        MOV   A,DIVDH
        ADDC  A,#00H
        MOV   FZ2,A                    ;计算除数高字节与中间字节相减产生的进位位之和

                                         ;将结果送FZ2保存
        MOV   A,TEMPH
        CJNE  A,FZ2,LP3                ;通过比较运算实现因软件设计原因相减不能借位

                                         ;而产生的借位
LP3:    PUSH  PSW                     ;对程序状态字PSW压栈保护
        MOV   F0,C
        CLR   C
        MOV   A,TEMPH
        SUBB  A,FZ2                    ;高字节带进位相减结果送R5保存
        MOV   R5,A
        MOV   C,F0
        POP   PSW                      ;程序状态字PSW弹栈,恢复现场
        JC    DIV3                     ;不够减,则跳转到DIV3
DIV4:   MOV   TEMPL,R7                      ;够减,刷新余数单元                       
        MOV   TEMPM,R6
        MOV   TEMPH,R5
        MOV   R0,#DIVDLL               ;够减,将被除数最低位置1
        MOV   A,@R0
        INC   A
        XCH   A,@R0
DIV3:          DJNZ  B,DIV2                      ;判断B是否为零,若为零,循环结束;否则,跳转继续循环
        CLR   F0
LOOP1:        NOP
        RET
                //对转化后的二字节进行转化为BCD码//         
                //*******************************//       
                        MOV R2,47H
                        MOV R3,48H                                         
BINBCD2:   CLR A                                       
            MOV R4,A
            MOV R5,A
            MOV R6,A
            MOV R7,#16
   LOOP2:   CLR C
            MOV A,R3
            RLC A
            MOV R3,A
            MOV A,R2
                        RLC A
            MOV R2,A
            MOV A,R6
            ADDC A,R6
            DA A
            MOV R6,A
            MOV A,R5
            MOV A,R4
            ADDC A,R4
            DA A
            MOV R4,A
            DJNZ R7,LOOP2
            RET
                        //显示模块,让转换过后的bcd码在数码管上得到显示//
                        //*********************************************//
DISPLAY:   MOV DPTR,#TAB
            MOV R0,#4
                        MOV P1,0FFH
    DPL1:   MOV R1,#250
   DPLOP:   MOV A,R1
            MOVC A,@A+DPTR
            MOV P1,A
            CLR P3.7
            ACALL D1MS
            SETB P3.7
            MOV A,R2
            MOVC A,@A+DPTR
            MOV P1,A
            CLR P3.6
            ACALL D1MS
            SETB P3.6
            MOV A,R3
            MOVC A,@A+DPTR
            MOV P1,A
            CLR P3.5
            ACALL D1MS
            SETB P3.5
                         MOV A,R4
            MOVC A,@A+DPTR
            MOV P1,A
            CLR P3.4
                        ACALL D1MS
            SETB P3.4
            MOV P1,#00H
            DJNZ R1,DPLOP
            DJNZ R0,DPL1
                        RET
        JDQGZ:
                        MOV R7,34H
                        MOV A,#10
                        SUBB A,R7
                        JC KAI
                        SETB P3.3
                        AJMP JDQFH        
           KAI:    CLR P3.3
        JDQFH:  RET
        D1MS:   MOV R7,#0FFH
                        DJNZ R7,$
                        DJNZ R7,$
                        RET
        TAB:    DB 07DH;0
                        DB 018H;1
                        DB 06EH;2
                        DB 03EH;3
                        DB 01BH;4
                        DB 037H;5
                        DB 077H;6
                        DB 01CH;7
                        DB 07FH;8
                        DB 03FH;9
                        END


此帖出自小平头技术问答
0条回答

一周热门 更多>