已结贴√

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

小弟刚学习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语言

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

  1. 将python代码转化为c语言代码,提高运行效率

    将python代码转化为c语言代码,提高运行效率 首先,需要安装cpython库: pip install cython 安装完成之后,写一段简单的代码,例如下面这个利用递归求斐波那契数列的函数,然后 ...

  2. Go语学习笔记 - websocket gorilla(附测试代码) | 从零开始Go语言

    目录 项目结构 消息结构 服务端代码 定义客户端行为 服务启动 测试代码 总结 学习笔记,写到哪是哪. websocket也是常用的协议了,在上一篇中主要测试使用了一下grpc. 下面我会把代码贴出来 ...

  3. 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序

    本汇编代码对应保户模式下操作系统内核如何加载用户程序并运行 的实际主引导扇区代码: 对应的内核代码在:内核代码 对应的用户程序代码在:用户程序代码 ;代码清单13-1;文件名:c13_mbr.asm; ...

  4. C语言进阶深度学习目录表

    学习交流加(可免费帮忙下载CSDN资源): 个人微信(进微信群加): LyyCoder 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 ...

  5. ARM 裸机程序学习 03 - 发送SOS信号(汇编 + C)

    之前的两个示例程序都是完全由汇编编写的,而这次的示例程序由汇编和C语言写成并编译. 汇编自有汇编的优点,比如你可以非常清楚地知道CPU在执行每条指令时到底做了什么,怎么做的,数据到底保存在哪儿等等,但 ...

  6. 【OS学习笔记】十六 保护模式四:进入保护模式与在保护模式下访问内存的汇编代码

    本文记录的是之前四篇文章所对应的汇编代码.四篇文章分别是: [OS学习笔记]十二 现代处理器的结构和特点 [OS学习笔记]十三 保护模式一:全局描述符表(GDT) [OS学习笔记]十四 保护模式二:段 ...

  7. bcs转10 c语言,ARM汇编转C语言 - ARM技术论坛-ARM嵌入式论坛-人气最火爆ARM学习论坛 - 21ic电子技术开发论坛...

    本帖最后由 wglzp123456 于 2019-6-15 19:21 编辑 //ARM汇编代码 0894        B570           PUSH      {R4-R6,LR} 089 ...

  8. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  9. 推荐10个堪称神器的学习网站,IT学习网站

    挑选了 10 个堪称神器的学习网站,推荐给大家.如果觉得不错的话,文末请点赞. 01.大学资源网 大学资源网是一个完全免费并且功能非常强大的学习网站,它免费提供了丰富并且全面的学习视频教程,并且视频课 ...

最新文章

  1. 学习别跟我谈兴趣 No.88
  2. 每日一皮:妹子们写的代码,Bug为什么这么多?
  3. 利用ashx和ajax实现表格的异步填充
  4. 550 Ip frequency limited
  5. 景切换的时候加上遮罩
  6. 程序员的噩梦,你遇到过哪几条?
  7. java比较时间的先后utc时间,日期、时间与UTC
  8. 数组对象的reduce方法
  9. HTML+CSS---定位(相对定位--绝对定位--固定定位--设置元素的层叠顺序)---表单---设置光标样式---透明度(opacity属性定义元素的不透明度--IE的半透明滤镜)---外边线
  10. Mangos源码分析(15):游戏对象的实现
  11. 海龟交易策略要点总结
  12. 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素
  13. 看看junit在一个具体的项目中
  14. java多线程-创建线程
  15. 学会这些VRay渲染器HDRI照明技巧,轻松搞定3ds Max
  16. OpenCV实现人体姿态估计(人体关键点检测)OpenPose(图像、视频或调用摄像头均能实现)
  17. 黑苹果睡眠重启后死机_iPhone 所有机型“死机/卡机”重启方法
  18. [图论]最大流问题(Maximum flow)的定义
  19. 2022.11.12 英语背诵
  20. substrate中打印调试信息的多种方式详解

热门文章

  1. Gox语言中的运算符和操作符-GX13
  2. 5个问题讲清楚商业模式
  3. 类的基础定义以及运用
  4. 监控组态软件及其发展《转》
  5. HTML——CSS样式优先级
  6. 面试时如何优雅地自我介绍? 1
  7. 数据库创建、增删改查、java连接数据库
  8. 唠唠C++入门那些事
  9. 头插法、尾插法建立单链表
  10. PMON分析(3)- 内存初始化