查看: 1724|回复: 0
打印 上一主题 下一主题

S52单片机读MPU-305陀螺仪的汇编代码

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-6 16:30:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在淘宝买了个MPU-3050的角速度传感器,原来的C语言代码,改成汇编语言了。
C语言勉强能读懂,不会写,还是汇编语言简单。
不多说了,看代码吧:

;-----------------------脚功能定义----------------------------              
        SMG1 EQU P1.0        ;定义数码管阳级控制脚,第一个
        SMG2 EQU P1.1        ;定义数码管阳级控制脚,第二个
        SCL        EQU P3.2;IIC时钟引脚定义
        SDA EQU P3.3;IIC数据引脚定义        

                        
;-----------数据存放----------------------
ORG 0100
TABLE:        DB 0C0H,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H, 088H,083H,0C6H,0A1H,86H,8EH;表:共阳数码管 0-F

ORG 0000H
LJMP MAIN

ORG 0200H
MAIN:
        MOV R7,#100
        LCALL DELAY
        LCALL INITMPU         ;初始化陀螺
        MOV R7,100
        LCALL DELAY
MAIN1:

        MOV R1,#21H          ;GZ_H                        Z轴低8位数据
        LCALL SRMPU                  ;读数据 放在A
        ADD A,#1


        MOV R2,A                    ;显示A中的内容
        ANL A,#0F0H
        SWAP A
        MOV R4,A
        MOV A,R2
        ANL A,#0FH
        MOV R5,A
        LCALL XIANSHI


JMP MAIN1;         不断循环





;;;;;;;;;;;;;起始信号
MPUSTART:SETB SDA
        SETB SCL
        LCALL DNOP
        CLR SDA
        LCALL DNOP
        CLR SCL
        NOP
        NOP
        NOP
        NOP
        RET
;;;;;;;;;;;;结束信号
MPUSTOP:   CLR SDA
        SETB SCL
        LCALL DNOP
        SETB SDA
        LCALL DNOP
        RET

/**************************************
发送应答信号
入口参数:C C累加器
**************************************/
MPUACK:
        MOV SDA,C
        SETB SCL
        LCALL DNOP
        CLR SCL
        LCALL DNOP
        RET

/**************************************
接收应答信号        接受后放在C累加器
**************************************/
MPURACK:

    SETB SCL                   //拉高时钟线
        LCALL DNOP
                         //延时
    MOV C,SDA                   //读应答信号
    CLR SCL                     //拉低时钟线
        LCALL DNOP
        RET

/**************************************
向IIC总线发送一个字节数据        所要发送到数据放在A
**************************************/

MPUSBT:
        MOV R6,#8
        
M1:        RLC A
        MOV SDA,C
        SETB SCL
        LCALL DNOP
        CLR SCL
        LCALL DNOP
        DJNZ R6,M1
        LCALL MPURACK
        RET
/**************************************
从IIC总线接收一个字节数据        接收后还放在A
**************************************/

MPURBT:
        SETB SDA
        MOV R6,#8
M2:        SETB SCL
        LCALL DNOP
        MOV C,SDA
        RLC A
        CLR SCL
        LCALL DNOP
        DJNZ R6,M2
        RET


//单字节写入*****内部寄存器地址R1,内部寄存器数据R0  *********


SWMPU:
        LCALL MPUSTART
        MOV A,#0D0H
        LCALL MPUSBT
        MOV A,R1
        LCALL MPUSBT
        MOV A,R0
        LCALL MPUSBT
        LCALL MPUSTOP
        RET


//单字节读取*******首先将要读取的地址放R1  读出的数据放A

SRMPU:
        LCALL MPUSTART
        MOV A,#0D0H
        LCALL MPUSBT
        MOV A,R1
        LCALL MPUSBT
        LCALL MPUSTART
        MOV A,#0D0H
        ADD A,#1
        LCALL MPUSBT
        LCALL MPURBT
        SETB C
        LCALL MPUACK
        LCALL MPUSTOP
        RET

        
//初始化MPU3050,根据需要请参考pdf进行修改************************
INITMPU:
        MOV R1,#3EH
        MOV R0,#80H
        LCALL SWMPU

        MOV R1,#15H
        MOV R0,#07H
        LCALL SWMPU

        MOV R1,#16H          ;DLPF
;        MOV R0,#1EH          ;2000
        MOV R0,#12H    ;250
        LCALL SWMPU

        MOV R1,#17H
        MOV R0,#00H
        LCALL SWMPU

        MOV R1,#3EH
        MOV R0,#00H
        LCALL SWMPU

        RET


//***********************************************************************



;;;;;;;;;;;;;显示子程序  显示R4,R5的内容 十六进制
XIANSHI:
        MOV DPTR,#TABLE           ;设置数码管段指针

        CLR SMG1        ;选择十位数码管        
        MOV ACC,R4        ;十位显示5,显示多少可以自己改,0-9
        MOVC A,@A+DPTR        ;查表输出定义好的数码管段值与P0口,显示相应的0-9
        MOV P0,ACC;
        MOV R7,#4;
        LCALL DELAY        ;延时,停留一会,让人眼感触到它的亮度
        MOV P0,#0FFH        ;清除数码管显示,因是共阳型,所以不是0
        SETB SMG1        ;关闭十位数码管

        CLR SMG2        ;选择个位数码管
        MOV ACC,R5        ;个位显示2
        MOVC A,@A+DPTR        ;查表输出定义好的数码管段值与P0口,显示相应的0-9
        MOV P0,A
        MOV R7,#4;
        LCALL DELAY        ;延时,停留一会,让人眼感触到它的亮度
        MOV P0,#0FFH        ;清除数码管显示,因是共阳型,所以不是0
        SETB SMG2        ;关闭个位数码管
        RET                ;循环输出,即动态的刷新


;;;;;;;;;;;;延时子程序 调用前设置R7
DELAY:        
D1:        MOV R6,#250;
D2:        DJNZ R6,D2;
        DJNZ R7,D1;
        RET

DNOP:
        NOP
        NOP
        NOP
        NOP
        NOP
        RET        
        
        

END
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表