在淘宝买了个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
|