MSP430ADXL345程序.docx
- 文档编号:23179146
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:19
- 大小:17.59KB
MSP430ADXL345程序.docx
《MSP430ADXL345程序.docx》由会员分享,可在线阅读,更多相关《MSP430ADXL345程序.docx(19页珍藏版)》请在冰豆网上搜索。
MSP430ADXL345程序
#include
#include
#include"LCD1602.c"
#defineuintunsignedint
#defineucharunsignedchar
#defineSDA_LP3OUT&=~BIT3//EEPROM数据线低
#defineSDA_HP3OUT|=BIT3//数据线高
#defineSDA_OUTP3DIR|=BIT3//设置数据线为输出状态
#defineSDA_INP3DIR&=~BIT3//设置数据线为输入状态
#defineSDA_DATEP3IN&BIT3//读入SDA线的状态
#defineSCL_LP3OUT&=~BIT2//串行时钟线低
#defineSCL_HP3OUT|=BIT2//时钟高
#defineSCL_OUTP3DIR|=BIT2//设置时钟线为输出状态
#defineTRUE1
#defineFALSE0
#defineSlaveAddress0xA6
charBUF[8];
uchardevid;
ucharerr;
intdis_data;
ucharge,shi,bai,qian,wan;//显示变量
/*******************************************
函数名称:
delay
功能:
延时约15us的时间
参数:
无
返回值:
无
********************************************/
voiddelayus(unsignedinti)//delay2.5usat8M
{
unsignedintii;
for(ii=i;ii>0;ii--)
{
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
}
}
/*******************************************
函数名称:
start
功能:
完成IIC的起始条件操作
参数:
无
返回值:
无
********************************************/
voidstart()
{
SCL_OUT;
SDA_OUT;
SDA_H;
SCL_H;
delayus
(2);
SDA_L;
delayus
(2);
SCL_L;
}
/*******************************************
函数名称:
stop
功能:
完成IIC的终止条件操作
参数:
无
返回值:
无
********************************************/
voidstop(void)
{
SCL_OUT;
SDA_OUT;
SDA_L;
SCL_H;
delayus
(2);
SDA_H;
delayus
(2);
SCL_L;
}
/*******************************************
函数名称:
mack
功能:
完成IIC的主机应答操作
参数:
无
返回值:
无
********************************************/
voidmack(void)
{
SDA_OUT;
SCL_OUT;
SDA_L;
SCL_H;
delayus
(2);
SCL_L;
SDA_H;
}
/*******************************************
函数名称:
mnack
功能:
完成IIC的主机无应答操作
参数:
无
返回值:
无
********************************************/
voidmnack(void)
{
SDA_OUT;
SCL_OUT;
SDA_H;
delayus
(2);
SCL_H;
delayus
(2);
SCL_L;
SDA_L;
}
/*判断应答或非应答子程序*/
voidcack()
{
SDA_IN;
SCL_OUT;
SCL_L;
delayus
(1);
SCL_H;
err=0;
if(SDA_DATE)err=1;
SCL_L;
SDA_OUT;
}
/*******************************************
函数名称:
write1byte
功能:
向IIC总线发送一个字节的数据
参数:
wdata--发送的数据
********************************************/
voidwrite1byte(ucharbyte1)
{
unsignedchari=8;
SDA_OUT;
SCL_OUT;
while(i--)
{
delay_us(4);
if(byte1&0x80)
{SDA_H;}
else
{SDA_L;}
delayus(4);
SCL_H;
delayus(4);
SCL_L;
byte1<<=1;
}
}
/*******************************************
函数名称:
read1byte
功能:
从IIC总线读取一个字节
参数:
无
********************************************/
ucharread1byte(void)
{
unsignedchari;
unsignedcharddata=0;
signedchartemp;
SCL_OUT;
SDA_IN;
for(i=0;i<8;i++)
{
ddata<<=1;
delayus(4);
SCL_H;
temp=SDA_DATE;
if(temp)ddata++;
delayus(4);
SCL_L;
}
returnddata;
}
//******单字节写入*******************************************
voidSingle_Write_ADXL345(ucharREG_Address,ucharREG_data)
{
start();//起始信号
write1byte(SlaveAddress);//发送设备地址+写信号
cack();
write1byte(REG_Address);//内部寄存器地址,请参考中文pdf22页
cack();
write1byte(REG_data);//内部寄存器数据,请参考中文pdf22页
cack();
stop();//发送停止信号
}
//********单字节读取*****************************************
ucharSingle_Read_ADXL345(ucharREG_Address)
{
ucharREG_data;
start();//起始信号
write1byte(SlaveAddress);//发送设备地址+写信号
cack();
write1byte(REG_Address);//发送存储单元地址,从0开始
cack();
start();//起始信号
write1byte(SlaveAddress+1);//发送设备地址+读信号
cack();
REG_data=read1byte();//读出寄存器数据
mnack();
stop();//停止信号
returnREG_data;
}
//*********************************************************
//
//连续读出ADXL345内部加速度数据,地址范围0x32~0x37
//
//*********************************************************
voidMultiple_read_ADXL345(void)
{
uchari;
start();//起始信号
write1byte(SlaveAddress);//发送设备地址+写信号
cack();
write1byte(0x32);//发送存储单元地址,从0x32开始
cack();
start();//起始信号
write1byte(SlaveAddress+1);//发送设备地址+读信号
cack();
for(i=0;i<6;i++)//连续读取6个地址数据,存储中BUF
{
BUF[i]=read1byte();//BUF[0]存储0x32地址中的数据
if(i==5)
{
mnack();//最后一个数据需要回NOACK
}
else
{
mack();//回应ACK
}
}
stop();//停止信号
delayus(100);
}
//初始化ADXL345,根据需要请参考pdf进行修改************************
voidInit_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页
}
voidconversion(inttemp_data)
{
wan=temp_data/10000+0x30;
temp_data=temp_data%10000;//取余运算
qian=temp_data/1000+0x30;
temp_data=temp_data%1000;//取余运算
bai=temp_data/100+0x30;
temp_data=temp_data%100;//取余运算
shi=temp_data/10+0x30;
temp_data=temp_data%10;//取余运算
ge=temp_data+0x30;
}
//***********************************************************************
//显示x轴
voiddisplay_x()
{
inttemp;
dis_data=(BUF[1]<<8)+BUF[0];//合成数据
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,0,'-');//显示正负符号位
}
else
DisplayOneChar(2,0,'');//显示空格
temp=(int)(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,bai);
DisplayOneChar(6,0,shi);
DisplayOneChar(7,0,'g');
}
//***********************************************************************
//显示y轴
voiddisplay_y()
{
inttemp;
dis_data=(BUF[3]<<8)+BUF[2];//合成数据
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,1,'-');//显示正负符号位
}
else
DisplayOneChar(2,1,'');//显示空格
temp=(int)(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,bai);
DisplayOneChar(6,1,shi);
DisplayOneChar(7,1,'g');
}
//***********************************************************************
//显示z轴
voiddisplay_z()
{
inttemp;
dis_data=(BUF[5]<<8)+BUF[4];//合成数据
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(10,1,'-');//显示负符号位
}
else
DisplayOneChar(10,1,'');//显示空格
temp=(int)(dis_data*3.9);//计算数据和显示,查考ADXL345快速入门第4页
conversion(temp);//转换出显示需要的数据
DisplayOneChar(9,1,'Z');//第0行,第10列显示Z
DisplayOneChar(10,1,':
');
DisplayOneChar(11,1,qian);
DisplayOneChar(12,1,'.');
DisplayOneChar(13,1,bai);
DisplayOneChar(14,1,shi);
DisplayOneChar(15,1,'g');
}
voiddisplay_Angle(void)
{
intx,y,z;
intangle;
x=(BUF[1]<<8)+BUF[0];//合成数据
if(x<0)
{x=-x;}
y=(BUF[3]<<8)+BUF[2];//合成数据
if(y<0)
{y=-y;}
z=(BUF[5]<<8)+BUF[4];//合成数据
if(z<0)
{z=-z;}
angle=(int)(atan2((double)x,(double)z)*(180/3.14159265));//angleindegrees
angle*=10;
conversion(angle);//计算数据和显示
DisplayOneChar(9,0,'A');
DisplayOneChar(10,0,':
');
DisplayOneChar(11,0,qian);
DisplayOneChar(12,0,bai);
DisplayOneChar(13,0,shi);
DisplayOneChar(14,0,'.');
DisplayOneChar(15,0,ge);
}
voidmain(void)
{
WDTCTL=WDTHOLD+WDTPW;
init_LCD1602_IO();
init_LCD1602();
Init_ADXL345();
devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确
while
(1)
{
Multiple_read_ADXL345();
display_x();//---------显示X轴
display_y();//---------显示Y轴
display_z();//---------显示Z轴
display_Angle();
}
}
/*LCD1602驱动程序2011-8-10*/
#include"msp430x14x.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineCPU_F((double)8000000)
#definedelay_us(x)__delay_cycles((long)CPU_F*(double)x/1000000.0)
#definedelay_ms(x)__delay_cycles((long)CPU_F*(double)x/1000.0)
#defineRS_HP3OUT|=BIT1;
#defineRS_LP3OUT&=~BIT1;
#defineRW_HP3OUT|=BIT2;
#defineRW_LP3OUT&=~BIT2;
#defineE_HP3OUT|=BIT3;
#defineE_LP3OUT&=~BIT3;
#defineData_DIRP4DIR
#defineData_INP4IN
#defineData_OUTP4OUT
ucharbusy;
uchardata_scan[10]={'0','1','2','3','4','5','6','7','8','9'};
voidinit_LCD1602_IO(void)//设置P3.1,P3.2,P3.3端口为输出模式
{
P3DIR|=BIT1+BIT2+BIT3;
}
voidwrite_data(uchardata)//RS_H,RW_L,D0~D7数据,E高脉冲
{
RS_L;
RW_H;
E_L;
RS_H;
RW_L;
Data_DIR|=0xff;
Data_OUT=data;
delay_us
(1);
E_H;
delay_us
(1);
E_L;
delay_us
(1);
RW_H;
RS_L;
}
voidwrite_commond(ucharcommond)//RS_L,RW_L,D0~D7指令,E高脉冲
{
RS_H;
RW_H;
E_L;
RS_L;
RW_L;
Data_DIR|=0xff;
Data_OUT=commond;
delay_us
(1);
E_H;
delay_us
(1);
E_L;
delay_us
(1);
RW_H;
RS_H;
}
ucharread_sta(void)//RS_L,RW_H,E_H;
{
ucharsta;
RS_H;
RW_L;
E_L;
RS_L;
RW_H;
delay_us
(1);
E_H;
Data_DIR&=~0xff;
sta=Data_IN;
delay_us
(1);
E_L;
delay_us
(1);
RW_L;
RS_H;
return(sta);
}
voidread_busy(void)
{
L1:
busy=read_sta();
if(busy&0x80)
{
gotoL1;
}
else;
}
voidinit_LCD1602(void)
{
delay_ms(15);
write_commond(0x38);
delay_ms(5);
write_commond(0x38);
delay_ms(5);
write_commond(0x38);
write_commond(0x38);
read_busy();
write_commond(0x08);
read_busy();
write_commond(0x01);
read_busy();
write_commond(0x06);
read_busy();
write_commond(0x0c);
read_busy();
}
voiddisp(ucharlocation,uchardata)
{
write_commond(0x80+location);
read_busy();
write_data(data);
read_busy();
}
voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
write_commond(X);
write_data(DData);
}
2013,8,29.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSP430 ADXL345程序 ADXL345 程序