导航:首页 > 操作系统 > 单片机倾角

单片机倾角

发布时间:2022-02-13 18:23:40

㈠ 倾角传感器测出的角度怎么用单片机去控制步进电机转几步使平台平衡

您做的貌似是一个电子科技大赛的题目。就像瞄准器一样。你可以引进反馈控制,当倾角传感器有信号时,误差就来了,这时候马上控制电机转,全速转,同时继续看倾角传感器传来的信号和参考值之间的误差,只要还有误差就继续转。当误差为零的时候,马上停下来。你也可以设计一个程序当误差很小时就先停下来,让电机的惯性把系统平衡下来。这就是比例调节和积分调节相结合起来用。但不要轻易用微分,会使系统飘摇。

㈡ 倾角传感器与单片机连接有必要用A/D转换器吗

根据你的精度要求进行选择,你如果需要平台保持水平,可以采用SAT100T。该传感器具有x,y双轴倾角传感器。内部具有AD转换,然后SPI串行输出;同时内部还具有温度传感器,可以进行温度补偿。如果需要高精度,可以采用外部高精度AD转换。
我现在就是用这个传感器做的高精度垂直转动平台。

㈢ 急求!用单片机测倾角的程序(最好用汇编语言,C语言也可以)

你的问题问得太粗了,没一点实际设计目的,只有拿我做的实例给你参考了。下面程序是我完成07年电子设计竞赛中小车走跷跷板平衡问题的实例,正是用的水银开关解决倾角判断测量问题,其中包含有一段水银开关测倾角的子程序(标有注释自己读吧),供你参考。
因为程序涉及我的版权,只好删掉一些无关紧要的地方,所以不能让你编译成功,仅供你阅读,请谅解!

更多电子问题请关注我!_ceo竭诚为您解答!

NOWSTEP EQU 28H
BEGINSPEED EQU 29H
DFSPD EQU 2AH
NOWANGLE EQU 2BH
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTR_0
ORG 0013H
LJMP INTR_1
ORG 。。。。。

MAIN: DJNZ R0,$
MOV SP,#70H
MOV P1,#0FFH
MOV P3,#0FFH
MOV BEGINSPEED,#80D ;起始速度

STEP_TABLE:MOV 20H,#11111011B ;1
MOV 21H,#11111001B ; 2
MOV 22H,#11111101B ; 3
MOV 23H,#11110101B ; 4
MOV 24H,#11110111B ; 5
MOV 25H,#11110110B ; 6
MOV 26H,#。。。。。。 ; 7
MOV 27H,#11111010B ; 8

MOV R0,#20H
MOV NOWSTEP,R0
;yyf07year
NOP

SPEED_UP1:
;步数=256*(B-1)+A

MOV A,#70D
SPU1: MOV B,#32D
SPU2: LCALL RUNZ
LCALL DELAY_UP
DJNZ B,SPU2
DJNZ ACC,SPU1

NEAR_CENTRE:

MOV A,#70
NR1: MOV B,#12
NR2: MOV DFSPD,#7
LCALL RUNZ
LCALL DELAY_DF
DJNZ B,NR2
DJNZ ACC,NR1
MOV A,#40
NR3: MOV B,#6
NR4: MOV DFSPD,#20
LCALL RUNZ
LCALL DELAY_DF
;yyf07year
DJNZ B,NR4
DJNZ ACC,NR3
MOV A,#30
NR5: MOV B,#3
NR6: MOV DFSPD,#50
LCALL RUNZ
LCALL DELAY_DF
DJNZ B,NR6
DJNZ ACC,NR5

CHECK_BALANCE: ;水银开关检测角度
MOV P1,#0FFH
MOV A,P1
JNB ACC.0,FAST_BACK ;倾斜角度1
JNB ACC.1,FAST_BACK ;倾斜角度2
JB ACC.2,FAST_BACK ;倾斜角度3
JB ACC.3,FAST_BACK ;倾斜角度4

MOV DFSPD,#165
LCALL RUNZ
LCALL DELAY_DF
JMP CHECK_BALANCE

FAST_BACK:
MOV DFSPD,#80
MOV A,#6
FB1:LCALL RUNF
LCALL DELAY_DF
DJNZ ACC,FB1
MOV DFSPD,#18
MOV A,#12
FB2:LCALL RUNF
LCALL DELAY_DF
DJNZ ACC,FB2
MOV DFSPD,#7
MOV A,#75
FB3:LCALL RUNF
LCALL DELAY_DF
DJNZ ACC,FB3
MOV DFSPD,#90
;yyf07year
MOV A,#13
FB4:LCALL RUNF
LCALL DELAY_DF
DJNZ ACC,FB4

;..............
JMP KEEP_BALANCE
KEEP_BALANCE:
LCALL DELAY_SEC
LCALL DELAY_SEC
MOV A,P1
JB ACC.0,CHECK_BALANCE
JB ACC.3,GOBACK
JMP ALARM
MOV DFSPD,#160
LCALL DELAY_DF
GOBACK:MOV A,#255
MOV DFSPD,#20
LCALL RUNF
DJNZ ACC,GOBACK
JMP CHECK_BALANCE

ALARM: CLR P3.0
CLR P3.7
CLR P3.1
NOP
。。。。。
NOP
NOP
SETB P3.1
SETB P3.7
DELAY_10SEC:
MOV R0,#100
DLS51: MOV R1,#200
DLS52: MOV R2,#250
DJNZ R2,$
DJNZ R1,DLS52
DJNZ R0,DLS51
SETB P3.0
CLR P3.1
NOP
SETB P3.1
TOPOINTB: MOV A,#70
TB1: MOV B,。。。。。。。。
TB2: MOV DFSPD,。。。
LCALL RUNZ
LCALL DELAY_DF
DJNZ B,TB2
DJNZ ACC,TB1

LCALL DELAY_SEC
LCALL DELAY_SEC
LCALL DELAY_SEC
LCALL DELAY_SEC
LCALL DELAY_SEC

TOPOINTA: MOV A,#70
TA1: MOV B,。。。。。。。。。
TA2: MOV DFSPD,#8
LCALL RUNF
LCALL DELAY_DF
DJNZ B,TA2
DJNZ ACC,TA1

CLR P3.1
NOP
SETB P3.1

KSTAY: NOP
JMP KSTAY

TOCHECK_BALANCE:
LJMP CHECK_BALANCE

RUNZ: PUSH 00H
MOV R0,NOWSTEP ;正向转动;NOWSTEP为上次步进后,当前步位
INC R0
CJNE R0,#28H,RTOZ
MOV R0,。。。。
RTOZ: MOV P2,@R0
MOV NOWSTEP,R0
POP 00H
RET

RUNF: PUSH 00H
MOV R0,NOWSTEP ;反向转动;NOWSTEP为上次步进后,当前步位
DEC R0
CJNE R0,#1FH,RTOF
MOV R0,#27H
RTOF: MOV P2,@R0
MOV NOWSTEP,R0
POP 00H
RET
;yyf07year
DELAY_UP: PUSH ACC
PUSH B

PUSH 00H ;BEGINSPPED为起始速率寄存器
PUSH 01H
PUSH 02H
MOV R0,BEGINSPEED
CJNE R0,#3,TOU1
JMP TOU2
TOU1: DEC R0
MOV BEGINSPEED,R0
TOU2: MOV R1,BEGINSPEED
DLU2: MOV R2,#100
DLU3: DJNZ R2,DLU3
DJNZ R1,DLU2
POP 02H
POP 01H
POP 00H
POP B
POP ACC
RET

DELAY_DF: ;自定义速度
PUSH 00H ;DFSPD为自定义速率寄存器
PUSH 01H
PUSH 02H

MOV R1,DFSPD
DLD2: MOV R2,#100D
DLD3: DJNZ R2,DLD3
DJNZ R1,DLD2
POP 02H
POP 01H
。。。。
RET
DELAY_SEC: PUSH 00H
PUSH 01H
PUSH 02H
MOV R0,#250
DLS1: MOV R1,#200
DLS2: MOV R2,#10
DJNZ R2,$
DJNZ R1,DLS2
DJNZ R0,DLS1
POP 02H
POP 01H
POP 00H
RET

INTR_0: NOP
;yyf07year

INTR_1: NOP

toend: nop
END

更多电子问题请关注我!_ceo竭诚为您解答!

㈣ 想用单片机和倾角传感器,实现横倾角度和纵倾角度在LCD上显示,求大神教教

SX-QXJ2型数显倾角仪OLED显示屏,内嵌微处理器DSP程序化处理,既可以直接显示角度数字又可以连接控制系统输出RS485数字信号。

㈤ 求用51单片机控制 MMA7361 倾角传感器 的C 语言代码。最好有注释

7361程序~

㈥ ADXL345倾角传感器和STC89C52单片机如何接线(有原理图和管脚定义说明)

需要帮你做吗

我做单片机的

㈦ 求51单片机控制 倾角传感器SCA60的汇编语言,用来做跷跷板小车的。相近能提供参考也行!!

附件一:
总程序源程序

;**************说明***************************************************
;** P1.1为左边传感器输入; P1.0为右边传感器输入 **
;** P1.6检测车身前倾; P1.7检测车身后倾 **
;** 秒表端口定义: **
;** A(P2.1):启动/停止计时; B(P2.3):各段记录时间回放; **
;** C(P2.3):分段计时标志/清零(停止状态下) **
;*********************************************************************

ORG 0000H
;************主程序***************************************************
JBGN:
LCALL TC ;停车
LCALL CSZT ;设置初始状态
;*************车身平衡检查******************
CGQ:
LCALL QJ ;前进3S,第一次不检查A端黑线
LCALL QL ;秒表置零
LCALL QDJS ;启动秒表
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL TC ;停车
LCALL DELAY30 ;消除摆动
JXPD:JNB P1.6,MBXS ;如果前倾(到达C点附近),转秒表显示AC段行车时间
LCALL QJ ;前进
LCALL DELAY
LCALL TC
LCALL DELAY30 ;消除摆动
LJMP JXPD ;继续判断是否到达C点附近
MBXS:
LCALL QDJS
LCALL CDSL5 ;停车5S,读取AC段行车时间
LCALL QL ;秒表清零
LCALL QDJS ;启动计时,记录平衡调整时间
CGQJC:
JNB P1.6,JBZHT ;如果前倾,转慢速后退
JNB P1.7, JBWW ;如果后仰,转慢速前进
LCALL DELAY1S ;延时判断是否真正平衡
LCALL DELAY1S
LCALL DELAY1S
JNB P1.6,CGQJC ;如果前倾,转继续调整平衡
JNB P1.7,CGQJC ;如果后仰,转继续调整平衡
LCALL TC ;停车
LCALL QDJS ;停止计时,显示平衡调整所用时间
CLR P2.5 ;蜂鸣器鸣叫
CLR P2.4 ;七彩灯亮
LCALL CDSL5 ;转到车灯闪亮5次,表示5S时间
LCALL CSZT
LJMP CDB ;转C到B程序前进
;***********转长跳***********
JBZHT:
LJMP JBTPH
JBWW:
LJMP JBWWW
;***********调整平衡*********
JBTPH:
LCALL DELAY30 ;消除传感器摆动
JBTP: LCALL HT
lcall delay
LCALL TC
LCALL DELAYTC ;消除传感器摆动
JNB P1.6,JBTP
LJMP CGQJC
JBWWW:
LCALL DELAY30
JBWG:LCALL QJ
LCALL DELAY
LCALL TC
LCALL DELAYTC ;消除传感器摆动
JNB P1.7,JBWG
LJMP CGQJC
;*********从C点到B端程序**********
CDB:
LCALL QL ;秒表置零
LCALL QDJS
LCALL QJ
DT: JB P1.0, DT ;如果右边遇到黑线,则检查左边(顺序执行),否则继续检查左边
JB P1.1, DT
LCALL TC
LCALL QDJS ;停止计时,显示从C到B的时间
LCALL CDSL5 ;延时5S
LCALL HT ;停车5S时间到,转后退返回
LCALL QL
LCALL QDJS
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
DDTT:JB P1.0, DDTT ;如果右边遇到黑线,则检查左边(顺序执行),否则继续检查左边
JB P1.1, DDTT
; INC A
; CJNE A,#2H,DDTT ;从B端返回A端时,不用检测B端黑线
LCALL TC ;已经返回A端,停车
LCALL QDJS ;停止计时,显示从B返回A所用时间
;************************基本功能与发挥部分的程序接口*************************************
LCALL CDSL5 ;延时5S,等待进入发挥部分程序
LCALL CSZT
CLR P2.4 ;状态灯亮5S
LCALL DELAY1S
LCALL DELAY1S
CLR P2.5 ;蜂鸣器叫3S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL CSZT ;关状态灯,进入发挥部分程序
;**********************发挥部分主程序*********************************************
FHBF:
LCALL QJ
QJXHX:
JNB P1.1,JX1 ;若P1.1为0(黑线),则继续查询P1.0 (左边遇到黑线,则检查右边的状态)
JNB P1.0,JX2 ;若P1.0为0(黑线),则继续查询P1.1 (右边遇到黑线,则检查左边的状态)
LJMP QJXHX
JX1:
JNB P1.0,PHCL
LJMP CZZW ;若P1.0也为黑线,则平衡处理,否则左转弯
JX2:
JNB P1.1,PHCL
LJMP CYZW
CZZW:
LCALL ZZW
LCALL ZWSJ ;转弯时间
LCALL TC
LCALL DELAY30
LCALL QJ
LJMP QJXHX
CYZW:
LCALL YZW
LCALL ZWSJ ;转弯时间
LCALL TC
LCALL DELAY30
LCALL QJ
LJMP QJXHX
;*****************平衡调整*******************
PHCL:
LCALL QJ ;前进3S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL TC
LCALL DELAY30 ;消除传感器摆动
FHPHTZ:
JNB P1.6,FHZHT ;如果前倾,转慢速后退
JNB P1.7,FHZQJ ;如果后仰,转慢速前进
LCALL DELAY1S ;延时判断是否真正平衡
LCALL DELAY1S
LCALL DELAY1S
JNB P1.6,FHPHTZ ;如果前倾,转继续调整平衡
JNB P1.7,FHPHTZ ;如果后仰,转继续调整平衡
LCALL TC ;停车
LCALL QDJS ;停止计时,显示平衡调整所用时间
CLR P2.5 ;蜂鸣器鸣叫
CLR P2.4 ;七彩灯亮
LCALL CDSL5 ;转到车灯闪亮5次,表示5S时间
LJMP FHPHTZ ;转平衡调整
;***********转长跳***********
FHZQJ:
LCALL CSZT ;初始状态关报警
LJMP FHWWW
FHZHT:
LCALL CSZT ;初始状态关报警
LJMP FHTPH
;***********调整平衡*********
FHTPH:
LCALL DELAY30 ;消除传感器摆动
TP: LCALL HT
LCALL DELAY
LCALL TC
LCALL DELAYTC ;消除传感器摆动
JNB P1.6,TP
LJMP FHPHTZ
FHWWW:
LCALL DELAY30 ;消除传感器摆动
DH: LCALL QJ
LCALL DELAY
LCALL TC
LCALL DELAYTC ;消除传感器摆动
JNB P1.7,DH
LJMP FHPHTZ

;******************子程序****************************************************
;*******设置初始状态*************
CSZT:
SETB P2.6 ;关灯
SETB P2.7
SETB P2.4
SETB P2.5 ;关蜂鸣器
RET

;***********停转*******************
TC:
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
RET

;***********前进********************
QJ:
CLR P1.2
SETB P1.3
CLR P1.4
SETB P1.5
RET

;**********后退********************
HT:
SETB P1.2
CLR P1.3
SETB P1.4
CLR P1.5
RET

;*********左转弯******************
ZZW:
CLR P1.2
CLR P1.3
CLR P1.4
SETB P1.5
RET
;*********右转弯******************
YZW:
CLR P1.2
SETB P1.3
CLR P1.4
CLR P1.5
RET

;**********秒表控制************************
;*******启动/停止计时**********
QDJS:
CLR P2.1
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
SETB P2.1
RET

;************显示清零*************
QL:
CLR P2.3
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
LCALL DELAY10
SETB P2.3
RET

;************延时程序*********************
;*****延时1秒****
DELAY1S:
MOV R3,#02H
DEL1: MOV R2,#0FAH
DEL2: MOV R1,#0FAH
DEL3: DJNZ R1,DEL3
NOP
DJNZ R2,DEL2
DJNZ R3,DEL1
RET

;*****延时10毫秒*****
DELAY10:
MOV R2,#20
DB1:MOV R1,#248
DB2:DJNZ R1,DB2
DJNZ R2,DB1
RET

;*********前进或后退时间**********
DELAY:
MOV R2,#30
DD1:MOV R1,#200
DD2:DJNZ R1,DD2
DJNZ R2,DD1
RET

;***********停车时间****************
DELAYTC:
MOV R2,#100
D11:MOV R1,#200
D22:DJNZ R1,D22
DJNZ R2,D11
RET

;*********延时程序****************
;*********延时0.5秒****
DELAY30:
MOV R2,#250
DL2: MOV R1,#250
DL1: DJNZ R1,DL1
DJNZ R2,DL2
RET

;*********转弯时间32MS**********
ZWSJ:
MOV R2,#50
D1:MOV R1,#100
D2:DJNZ R1,D2
DJNZ R2,D1
RET

;****延时约250毫秒(12M晶振)****
DELAY250:
MOV R3,#2
L3: MOV R2,#250
L1: MOV R1,#250
L2: DJNZ R1,L2
DJNZ R2,L1
DJNZ R3,L3
RET

;*****用状态灯显示终点停车5S时间(亮5次)*****
CDSL5:
MOV R5,#5H
PY: SETB P2.6
SETB P2.7
LCALL DELAY250
LCALL DELAY250
CLR P2.6
CLR P2.7
LCALL DELAY250
LCALL DELAY250
DJNZ R5,PY
RET
END

㈧ 用51单片机怎么将MUP6050传回来的数据转换成角度急求!!!

MPU6050 有角速度和加速度,角速度的话直接积分就角度了(这里算出的是转动了多少角度),角度的话利用反三角函数求。角度解算的话需要是在加速度已知(包括大小与方向)的情况下,通常可以利用静止时的重力加速度可以求出倾角。详细看芯片手册的量程来计算哈~~

㈨ 求用51单片机控制ADXL345测量角度的程序,通过ADXL345传感器,用51单片机控制,测量倾角的程序!

//***************************************
// GY-29 ADXL345 IIC测试程序
// 使用单片机STC89C51
// 晶振:11.0592M
// 显示:LCD1602
// 编译环境 Keil uVision2
// 参考宏晶网站24c04通信程序
// 时间:2011年3月1日
// QQ:531389319
//****************************************
#include <REG51.H>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //LCD1602数据端口
sbit SCL=P1^0; //IIC时钟引脚定义
sbit SDA=P1^1; //IIC数据引脚定义
sbit LCM_RS=P2^0; //LCD1602命令端口
sbit LCM_RW=P2^1; //LCD1602命令端口
sbit LCM_EN=P2^2; //LCD1602命令端口
#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,,qian,wan; //显示变量
int dis_data; //变量
int data_xyz[3];

void delay(unsigned int k);
void InitLcd(); //初始化lcd1602
void Init_ADXL345(void); //初始化ADXL345
void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据
uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据
void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void ADXL345_Start();
void ADXL345_Stop();
void ADXL345_SendACK(bit ack);
bit ADXL345_RecvACK();
void ADXL345_SendByte(BYTE dat);
BYTE ADXL345_RecvByte();
void ADXL345_ReadPage();
void ADXL345_WritePage();
//-----------------------------------
//*********************************************************
void conversion(uint temp_data)
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
/*******************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
/*******************************/
void WaitForEnable(void)
{
DataPort=0xff;
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);
LCM_EN=0;
}
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{
if(Attribc)WaitForEnable();
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/*******************************/
void WriteDataLCM(uchar dataW)
{
WaitForEnable();
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/***********************************/
void InitLcd()
{
WriteCommandLCM(0x38,1);
WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);
}
/***********************************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
WORD n = 560;
while (n--);
}
/**************************************
起始信号
**************************************/
void ADXL345_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void ADXL345_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void ADXL345_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit ADXL345_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void ADXL345_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
ADXL345_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE ADXL345_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
//******单字节写入*******************************************
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
{
ADXL345_Start(); //起始信号
ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号
ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
ADXL345_Stop(); //发送停止信号
}
//********单字节读取*****************************************
uchar Single_Read_ADXL345(uchar REG_Address)
{ uchar REG_data;
ADXL345_Start(); //起始信号
ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号
ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始
ADXL345_Start(); //起始信号
ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data=ADXL345_RecvByte(); //读出寄存器数据
ADXL345_SendACK(1);
ADXL345_Stop(); //停止信号
return REG_data;
}
//*********************************************************
//
//连续读出ADXL345内部加速度数据,地址范围0x32~0x37
//
//*********************************************************
void Multiple_read_ADXL345(void)
{ uchar i;
ADXL345_Start(); //起始信号
ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号
ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始
ADXL345_Start(); //起始信号
ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 5)
{
ADXL345_SendACK(1); //最后一个数据需要回NOACK
}
else
{
ADXL345_SendACK(0); //回应ACK
}
}
ADXL345_Stop(); //停止信号
Delay5ms();
}

//*****************************************************************
//初始化ADXL345,根据需要请参考pdf进行修改************************
void Init_ADXL345()
{
Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式
Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页
Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页
Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断
Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页
Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页
Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页
}
//***********************************************************************
//显示x轴
void display_x()
{ float temp;
dis_data=(BUF[1]<<8)+BUF[0]; //合成数据
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,0,'-'); //显示正负符号位
}
else DisplayOneChar(2,0,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
conversion(temp); //转换出显示需要的数据
DisplayOneChar(0,0,'X'); //第0行,第0列 显示X
DisplayOneChar(1,0,':');
DisplayOneChar(3,0,qian);
DisplayOneChar(4,0,'.');
DisplayOneChar(5,0,);
DisplayOneChar(6,0,shi);
DisplayOneChar(7,0,'g');
}
//***********************************************************************
//显示y轴
void display_y()
{ float temp;
dis_data=(BUF[3]<<8)+BUF[2]; //合成数据
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,1,'-'); //显示正负符号位
}
else DisplayOneChar(2,1,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
conversion(temp); //转换出显示需要的数据
DisplayOneChar(0,1,'Y'); //第1行,第0列 显示y
DisplayOneChar(1,1,':');
DisplayOneChar(3,1,qian);
DisplayOneChar(4,1,'.');
DisplayOneChar(5,1,);
DisplayOneChar(6,1,shi);
DisplayOneChar(7,1,'g');
}
//***********************************************************************
//显示z轴
void display_z()
{ float temp;
dis_data=(BUF[5]<<8)+BUF[4]; //合成数据
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(10,1,'-'); //显示负符号位
}
else DisplayOneChar(10,1,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
conversion(temp); //转换出显示需要的数据
/*
DisplayOneChar(10,0,'Z'); //第0行,第10列 显示Z
DisplayOneChar(11,0,':');
DisplayOneChar(11,1,qian);
DisplayOneChar(12,1,'.');
DisplayOneChar(13,1,);
DisplayOneChar(14,1,shi);
DisplayOneChar(15,1,'g');
*/
}

//*********************************************************
//******主程序********
//*********************************************************
void main()
{
uchar devid;
float Roll,Pitch,Q,T,K;
delay(500); //上电延时
InitLcd(); //液晶初始化ADXL345
Init_ADXL345(); //初始化ADXL345
devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确
while(1) //循环
{
Init_ADXL345(); //初始化ADXL345
Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中
data_xyz[0]=(BUF[1]<<8)+BUF[0]; //合成数据
data_xyz[1]=(BUF[3]<<8)+BUF[2]; //合成数据
data_xyz[2]=(BUF[5]<<8)+BUF[4]; //合成数据
//分别是加速度X,Y,Z的原始数据,10位的
Q=(float)data_xyz[0]*3.9;
T=(float)data_xyz[1]*3.9;
K=(float)data_xyz[2]*3.9;
Q=-Q;
Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180); //X轴角度值
Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180); //Y轴角度值
conversion(Roll); //转换出显示需要的数据X轴,或者Y轴
DisplayOneChar(9,1,'A');
DisplayOneChar(10,1,':');
DisplayOneChar(11,1,);
DisplayOneChar(12,1,shi);
DisplayOneChar(13,1,ge);
delay(200); //延时
}
}

㈩ 求用51单片机控制 MMA7361 倾角传感器 的C 语言代码。最好有注释,详尽者 追加30分。

#include "STC12C5410AD.H"

sbit MMA7260sleep=P1^0; //MMA7260休眠与否,0-休眠;1-正常工作

//---------------------------------------
//名称: 延时约1毫秒函数

//日期:20081111
//-----------------------------------------
void delay1ms()
{
word k;
for(k=0;k<12000;k++);
}
void delayms(word ms)
{
word k,j;
for(j=0;j<ms;j++)
for(k=0;k<12000;k++);
}

//---------------------------------------
//名称: 串口数据发送函数

//日期:20081111
//-----------------------------------------
void uart_putchar(byte ch)
{
TI=0;
if (ch == '\n')
{

SBUF= 0x0d; //output'CR'
while(!TI);
return;
}
SBUF=ch;
while(!TI);
}
//---------------------------------------
//名称: 串口数据接收函数

//日期:20081111
//-----------------------------------------
byte uart_getchar(void)
{

if(RI)
{
RI=0;
return SBUF; //有数据接收到,返回1
}
else
{
return 0; //无数据接收到,返回0
}
}

void putstr(char ch[])
{
byte ptr=0;
while(ch[ptr])
{
uart_putchar((byte)ch[ptr++]);
}

}
//---------------------------------------
//名称: 模数转换函数(8位)

//日期:20081111
//-----------------------------------------
byte ReadAD(byte ch)
{
ADC_DATA = 0; //清A/D转换结果寄存器

ADC_CONTR = 0xF8|ch; //0000,1000ADCS = 1,启动转换
delay1ms();
do{;}
while((ADC_CONTR&0x10)==0); //0001,0000等待A/D转换结束
ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换
return ADC_DATA;
}
/***************************************************
把0--255的数值转化为3位字符串格式
****************************************************/
void Byte2Str3(char zifu[],byte val,byte StartPtr)
{
char characters[11]="0123456789";
byte tv=0;

tv=val/100;
zifu[StartPtr++] = characters[tv];
tv=(val%100)/10;
zifu[StartPtr++] = characters[tv];
tv=val%10;
zifu[StartPtr] = characters[tv];
//zifu[3] = '\0';
return;
}

//---------------------------------------
//名称: 初始化函数函数

//日期:20081111
//-----------------------------------------
void init_ad(void)
{
P1M0=0x07; //设置P1.012为高阻输入,以准备AD
P1M1=0x00;
ADC_CONTR = 0xf8; //1000,0000打开A/D转换电源
delay1ms();
ADC_CONTR = ADC_CONTR&0xe0; //1110,0000 清ADC_FLAG,ADC_START位和低3位

}

void init_uart(void) //P3.0,3.1
{
TMOD=0x20; //TH1=256-INT(22118400/32/12/baud+0.5)
TH1=0xfa; //0xfa,9600
TL1=0xfd; //0xff,57600
PCON=0x00;
TR1=1;
SCON=0xd0;
}
void init_dev(void)
{
init_ad();
init_uart();
}

//---------------------------------------
//名称: 主函数

//日期:20081111
//-----------------------------------------
void main()
{
char txtbuf[17]="\n ADC Val: ";
byte adbuf;
init_dev();
putstr("\n MMA7260 starts working!\n");
MMA7260sleep=1;//MMA7260开始工作
while(1)
{
//ADC
adbuf=ReadAD(0); //X AXIS
Byte2Str3(txtbuf,adbuf,11);
putstr(txtbuf);

adbuf=ReadAD(1); //Y AXIS
Byte2Str3(txtbuf,adbuf,11);
putstr(txtbuf);

adbuf=ReadAD(2); //Z AXIS
Byte2Str3(txtbuf,adbuf,11);
putstr(txtbuf);

delayms(300);
}
}

阅读全文

与单片机倾角相关的资料

热点内容
单片机ds1302程序 浏览:738
杜比压缩开还是关怎样判断 浏览:366
对象类型转换java编译和运行 浏览:284
行政命令是什么 浏览:371
android调用系统邮件 浏览:33
测温软件app是如何实现的 浏览:585
江苏服务器机房按需定制云主机 浏览:639
c程序员笔试 浏览:694
excel怎么引用统一文件夹 浏览:249
怎么把微信抖音加密 浏览:304
android滑动进度条 浏览:834
javagmt转换 浏览:826
linux查看snmp 浏览:24
ug80车床编程 浏览:517
怎么加速python计算素数 浏览:242
腰椎第五节压缩性骨折 浏览:91
程序员开会的句子 浏览:994
用哪个app写编程 浏览:647
android通讯录增删改查 浏览:731
车贷解压过户可以同时进行吗 浏览:921