bcs转10 c语言,小弟刚学习C语言,怎么把下段汇编代码转化为C语言程序,请高手指教!!!单片机89c52...

已结贴√

问题点数:20 回复次数:3

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

小弟刚学习C语言,怎么把下段汇编代码转化为C语言程序,请高手指教!!!单片机89c52

BIT_COUNT     DATA 07FH

TIMER0         DATA 07EH

TIMER          DATA 048H

DATA_OUT      DATA 021H

TEN1           DATA 022H

TEN2           DATA 023H

DAT             BIT   P2.0

CLK            BIT   P2.1

CS              BIT   P2.2

KEY            BIT   P2.3

ORG    000H

LJMP   MAIN

ORG   0060H

MAIN:   CLR    RS0                        ;粗略测量转速。

CLR    RS1

MOV   R1, #40H

MOV   R2, #14H

MOV   38H, #00H

MOV   39H, #00H

MOV   TMOD, #15H                ;设定T0,T1的工作方式:T0为计数方

MOV    TL0, #00H                      式,对P3.4输入脉冲信号进行计数,T1为

MOV   TH0, #00H                    定时/计数器都以方式1工作。

MOV   TL1, #00H

MOVTH1,#4CH                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        CLR    EA

JB      P3.4, $                     ;等待信号变低。

SETB   TR1                        ;开始定时。

SETB   TR0                       ;开始计数。

M1:    JBC    TF1, M2                      ;T1定时溢出。

SJMP   M1

M2:    MOV   TL1, #00H                   ;T1溢出20次即定时1s。

MOV   TH1, #4CH

DJNZ   R2, M1

CLR    TR0                         ;停止定时、计数。

CLR    TR1

CYC:   CLR      RS0                           ;测周期法测转速。

CLR     RS1

MOV    R1,#40H

MOV    TMOD, #90H                   ;设定定时/计数器的工作方式:T1

MOV    TH1, #00H                     为定时方式,工作方式1,由P3.3

MOV   TL1, #00H                     和TR1共同控制计数的启动和停止。

C0:   JB       P3.3, C0

SETB    TR1

C1:   JNB      P3.3,C1

C2:   JB       P3.3, C2

CLR     TR1

SAMP1:  MOV   A, R4                         ;采样程序。

RL     A

ADD   A, R1

MOV   R1, A

MOV   @R1, TH1

INC   R1

MOV   @R1, TL1

INC    R4

SAM1:  CJNE   R4, #04H, CYC

MOV   R4, #00H

MOV   SP,#50H

LCALL   APIG                         ;调用滤波程序。

NDIV1:  SETB   RS1                            ;多字节除法程序,将所测周期转换

SETB   RS0                             成转速。

MOV   R2, #00H

MOV   R3, #0D2H

MOV   R4, #0F0H

MOV   R5, #00H

MOV   R6, 38H

MOV   R7, 39H

MOV   A, R3

CLR   C

SUBB   A, R7

MOV    A, R2

SUBB   A, R6

JNC   NDVE1

MOV   B, #10H

NDVL1:   CLR    C

MOV   A, R5

RLC    A

MOV   R5, A

MOV   A, R4

RLC    A

MOV   R4, A

MOV   A, R3

RLC    A

MOV   R3, A

MOV   A, R2

RLC    A

MOV   R2, A

MOV   F0, C

CLR    C

MOV   A, R3

SUBB   A, R7

MOV   R1, A

MOV   A, R2

SUBB   A, R6

JB     F0, NDVM1

JC     NDVD1

NDVM1:  MOV   R2, A

MOV   A, R1

MOV   R3, A

INC    R5

NDVD1:  DJNZ   B, NDVL1

CLR    F0

MOV   38H, R4

MOV   39H, R5

CLR    RS0

LJMP   DISPLAY

NDVE1:  SETB   F0

RET

FRE:     CLR   RS0                              ;频率法测转速。

CLR    RS1

MOV   R4, #00H

MOV   TMOD, #15H

MOV   TL0, #00H

MOV   TH0, #00H

MOV   TL1, #00H

MOVTH1,#4CH                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          CLR   EA

JB     P3.4, $

SETB   TR1

SETB   TR0

F1:      JBC   TF1, F2

SJMP   F1

F2:      MOV   TL1, #00H

MOV   TH1, #4CH

DJNZ   R2, F1

CLR   TR0

CLR   TR1

SAMP2:   MOV   A, R4

RL    A

ADD   A, R1

MOV   R1, A

MOV   @R1, TH0

INC    R1

MOV   @R1, TL0

INC     R4

SAM2:   CJNE R4, #04H, FRE

MOV R4, #00H

MOV SP,#50H

CALL   APIG

JMP    DISPLAY

APIG:     SETB   RS0                          ;滤波程序。

CLR   A

MOV   R2, A

MOV   R3, A

MOV   R6, A

MOV   R7, A

MOV   R4, #0FFH                     ;各值进行初始化。

MOV   R5, #0FFH

MOV   TIMER, #04H

API1:   LCALL   LOADX

SETB     RS0

MOV     R1, A

ADD     A, R7                        ;累加输入值。

MOV     R7, A

MOV     A, B

ADDC    A, R6

MOV     R6, A

CLR      C                         ;输入值与最大值R2R3比较。

MOV     A, R3

SUBB    A, R1

MOV     A, R2

SUBB    A, B

JNC     API2

MOV    A, R1                          ;输入值大于最大值。

MOV    R3, A

MOV    R2, B

API2:  CLR      C                                ;输入值与最小值作比较。

MOV    A, R1

SUBB   A, R5

MOV   A, B

SUBB   A, R4

JNC    API3

MOV   A, 1

MOV   R5, A

MOV   R4, B

API3:  DJNZ   TIMER, API1

CLR    C

MOV   A, R7                              ;累加和中减去最大值。

SUBB   A, R3

XCH    A, R6

SUBB   A, R2

XCH    A, R6                             ;累加和中减去最小值。

SUBB   A, R5

XCH    A, R6

SUBB   A, R4

CLR    C

RRC    A                                  ;求平均值,将平均值存入38H,39H。

XCH    A, R6

RRC    A

MOV   R7, A

MOV   39H, R7

MOV   38H, R6

MOV   3BH,39H                         ;将本次测量值作为下次的比较值。

MOV   3AH,38H

CLR   RS0

MOV   R4, #00H

RET

LOADX:  CLR   RS0                               ;调用数据程序。

MOV   R1, #40H

MOV   A, R4

RL     A

ADD   A, R1

MOV   R1, A

MOV   A,@R1

MOV   B, A

INC   R1

MOV   A,@R1

INC   R4

RET

DISPLAY:  CLR        RS0

SETB       RS1

MOV        R0, #30H                ;显示程序。

MOV        TEN1, #11001100B

MOV        TEN2, #05H

MOV        P1, #0FFH

MOV        P2, #0CBH                 ;I/O初始化。(0CBH)

START_DELAY0:  MOV   DATA_OUT, #0A4H      ;复位指令。

CALL     SEND

SETB     CS                              ;恢复CS为高电平。

LCALL    BD                              ;调用16进制——BCD码

MOV      R0, #30H                          转换。

MOV      A, R6

LCALL    PTDS

MOV      A, 30H

XCH      A, 31H

MOV      30H, A

MOV      A, R5

LCALL    PTDS

MOV      A, 32H

XCH      A, 33H

MOV      32H, A

MOV      A, R4

LCALL    PTDS

MOV      A, 34H

XCH      A, 35H

MOV      34H, A

MOV      R0, #31H

CJNE     @R0, #00H, DIS1             ;判断显示数字的位数。

MOV      R0, #32H

CJNE     @R0, #00H, DIS2

MOV      R0, #33H

MOV      TEN1, #11001010B           ;显示数字为百位数,

MOV      TEN2, #03H                   方式1译码第百、十、个位。

JMP      START_DELAY1

DIS1:           MOV      TEN1,#11001100B          ;显示数字为万位数,方式1译码

MOV      TEN2,#05H                  第万、千、百、十、个位。

JMP      START_DELAY1

DIS2:           MOV      TEN1,#11001011B          ;显示数字为千位数,方式1译码

MOV      TEN2,#04H                  第千、百、十、个位。

START_DELAY1: MOV  DATA_OUT,TEN1

CALL     SEND

MOV      DATA_OUT,@R0

CALL     SEND

START_DELAY2: SETB   CS

INC      R0

DEC      TEN1

DJNZ     TEN2, START_DELAY1

SETB     CS

LJMP     MAIN

SEND:         MOV      BIT_COUNT,#8               ;发送1个字节到HD7279,高位

CLR      CS                              在前。

CALL     LONG_DELAY

SEND_LOOP:  MOV      C, DATA_OUT.7

MOV      DAT, C

SETB      CLK

MOV      A, DATA_OUT

RL        A

MOV      DATA_OUT, A

CALL     SHORT_DELAY

CLR      CLK

CALL     SHORT_DELAY

DJNZ     BIT_COUNT, SEND_LOOP    ;检查8位数据是否发送完毕。

CLR      DAT                        ;发送完毕,返回。

RET

BD:           CLR    A                           ;多字节16进制整数转换成BCD

MOV    R4, A                         码。

MOV    R5, A

MOV    R6, A

MOV    R7, #10H

BD1:        CLR    C

MOV    A, 39H

RLC    A

MOV    39H, A

MOV    A, 38H

RLC     A

MOV    38H, A

MOV    A, R4

ADDC   A, R4

DA      A

MOV    R4, A

MOV    A, R5

ADDC   A, R5

DA      A

MOV    R5, A

MOV    A, R6

ADDC   A, R6

DA      A

MOV    R6, A

DJNZ   R7, BD1

RET

PTDS:            MOV    R1, A

ACALL   PTDS1

MOV    A, R1

SWAP   A

PTDS1:        ANL    A, #0FH

MOV    @R0, A

INC    R0

RET

LONG_DELAY:   MOV    TIMER0, #25                ;延时程序。

DELAY_LOOP:   DJNZ     TIMER0, DELAY_LOOP

RET

SHORT_DELAY:  MOV      TIMER0, #4

SHORT_LOOP:   DJNZ     TIMER0, SHORT_LOOP

RET

END

[本帖最后由 yf199004 于 2012-5-3 16:31 编辑]

搜索更多相关主题的帖子:

单片机 学习 C语言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值