|
ADXL345中文資料下載
0.png (287.26 KB, 下載次數(shù): 74)
下載附件
2017-5-2 23:45 上傳
pdf文件:
ADXL345中文PDF.pdf
(874.7 KB, 下載次數(shù): 10)
2017-5-2 19:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
單片機(jī)源程序:
- #include<reg52.h>
- #include<math.h>
- #include"1602.h"
- #include <INTRINS.H>
- #define SlaveAddress 0xA6 //1010 0110 定義器件在IIC總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
- //ALT ADDRESS引腳接地時(shí)地址為0xA6,接電源時(shí)地址為0x3A 0011 1010
- sbit sclk=P0^0;
- sbit sda=P0^1;
- float dis_datax,dis_datay,dis_dataz,acc,acc1=1000;
- uchar BUF[8];
- uchar wan, qian, bai, shi ,ge,flag,miao,miao1,n;
- uint count;
- void conversion(uint temp_data)
- {
- wan=temp_data/10000+0x30 ;
- temp_data=temp_data%10000; //取余運(yùn)算
- qian=temp_data/1000+0x30 ;
- temp_data=temp_data%1000; //取余運(yùn)算
- bai=temp_data/100+0x30 ;
- temp_data=temp_data%100; //取余運(yùn)算 -e----------------eee-e
- shi=temp_data/10+0x30 ;
- temp_data=temp_data%10; //取余運(yùn)算
- ge=temp_data+0x30;
- }
- void delay6us() //6us延時(shí)函數(shù)
- {
- _nop_(); _nop_();
- }
- void delay_ms(uint n) //N ms延時(shí)函數(shù)
- {
- uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- /////
- void ADXL345_Start()
- {
- sda = 1; //拉高數(shù)據(jù)線
- sclk = 1; //拉高時(shí)鐘線
- delay6us(); //延時(shí)
- sda = 0; //產(chǎn)生下降沿
- delay6us(); //延時(shí)
- sclk = 0; //拉低時(shí)鐘線
- }
- void ADXL345_Stop()
- {
- sda = 0; //拉低數(shù)據(jù)線
- sclk = 1; //拉高時(shí)鐘線
- delay6us(); //延時(shí)
- sda = 1; //產(chǎn)生上升沿
- delay6us(); //延時(shí)
- }
- void ADXL345_SendACK(bit ack)
- {
- sda = ack; //寫(xiě)應(yīng)答信號(hào)
- sclk = 1; //拉高時(shí)鐘線
- delay6us(); //延時(shí)
- sclk = 0; //拉低時(shí)鐘線
- delay6us(); //延時(shí)
- }
- bit ADXL345_RecvACK()
- {
- sclk = 1; //拉高時(shí)鐘線
- delay6us(); //延時(shí)
- CY = sda; //讀應(yīng)答信號(hào)
- sclk = 0; //拉低時(shí)鐘線
- delay6us(); //延時(shí)
- return CY;
- }
- void ADXL345_SendByte(uchar dat)
- {
- uchar i;
- // sclk = 0; //拉低時(shí)鐘線
- for (i=0; i<8; i++) //8位計(jì)數(shù)器
- {
- dat <<= 1; //移出數(shù)據(jù)的最高位
- sda = CY; //送數(shù)據(jù)口
- sclk = 1; //拉高時(shí)鐘線
- delay6us(); //延時(shí)
- sclk = 0; //拉低時(shí)鐘線
- delay6us(); //延時(shí)
- }
- ADXL345_RecvACK();
- }
- uchar ADXL345_RecvByte()
- {
- uchar i;
- uchar dat = 0;
- sda = 1;
- // write_com(0x80);
- //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
- for (i=0; i<8; i++) //8位計(jì)數(shù)器
- {
- dat <<= 1;
- sclk = 1; //拉高時(shí)鐘線
- delay6us(); //延時(shí)
- dat |= sda; //讀數(shù)據(jù)
- sclk = 0; //拉低時(shí)鐘線
- delay6us(); //延時(shí)
- }
- return dat;
- }
- void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
- {
- ADXL345_Start(); //起始信號(hào)
- ADXL345_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
- ADXL345_SendByte(REG_Address); //內(nèi)部寄存器地址,請(qǐng)參考中文pdf22頁(yè)
- ADXL345_SendByte(REG_data); //內(nèi)部寄存器數(shù)據(jù),請(qǐng)參考中文pdf22頁(yè)
- ADXL345_Stop(); //發(fā)送停止信號(hào)
- }
- uchar Single_Read_ADXL345(uchar REG_Address)
- {
- uchar REG_data;
- ADXL345_Start();
-
-
-
- //起始信號(hào)
- ADXL345_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
- ADXL345_SendByte(REG_Address); //發(fā)送存儲(chǔ)單元地址,從0開(kāi)始
- ADXL345_Start(); //起始信號(hào)
- ADXL345_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)
- REG_data=ADXL345_RecvByte(); //讀出寄存器數(shù)據(jù)
- ADXL345_SendACK(1);
- ADXL345_Stop(); //停止信號(hào)
- return REG_data;
- }
- void Multiple_read_ADXL345()
- {
- uchar i;
- ADXL345_Start(); //起始信號(hào)
- ADXL345_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào) 1010 0110
- ADXL345_SendByte(0x32); //發(fā)送存儲(chǔ)單元地址,從0x32開(kāi)始 0011 0010
- ADXL345_Start(); //起始信號(hào)
- ADXL345_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào) 1010 0111
- for (i=0; i<6; i++) //連續(xù)讀取6個(gè)地址數(shù)據(jù),存儲(chǔ)中BUF
- {
- BUF[i] = ADXL345_RecvByte(); //BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù)
- if(i == 5) ADXL345_SendACK(1); //最后一個(gè)數(shù)據(jù)需要回NOACK
- else ADXL345_SendACK(0); //回應(yīng)ACK
- }
- ADXL345_Stop(); //停止信號(hào)
- delay_ms(10);
- }
- void Init_ADXL345() //初始化ADXL345,根據(jù)需要請(qǐng)參考pdf進(jìn)行修改***********************
- {
- // delay(500); //上電延時(shí)
- Single_Write_ADXL345(0x31,0x2B); //測(cè)量范圍,正負(fù)16g,13位模式
- Single_Write_ADXL345(0x2C,0x06); //0000 0110速率設(shè)定為6.25 參考pdf13頁(yè)
- Single_Write_ADXL345(0x2D,0x08); //選擇電源模式 參考pdf24頁(yè)
- Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中斷
- Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根據(jù)測(cè)試傳感器的狀態(tài)寫(xiě)入pdf29頁(yè)
- Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根據(jù)測(cè)試傳感器的狀態(tài)寫(xiě)入pdf29頁(yè)
- Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根據(jù)測(cè)試傳感器的狀態(tài)寫(xiě)入pdf29頁(yè)
- }
- float operation(uchar starti)
- {
- float dis_data ;
- int temp;
- temp=(BUF[starti+1]<<8)+BUF[starti]; //合成數(shù)據(jù)
- // write_com(0x80);
- if(temp<0)
- {
- temp=-temp;
- flag=1;
- }
- else flag=0; //顯示空格
- dis_data=(float)temp*3.9; //計(jì)算數(shù)據(jù)和顯示,查考ADXL345快速入門(mén)第4頁(yè)
- return dis_data;
- }
- void display_x() //顯示x軸
- {
- conversion(dis_datax); //轉(zhuǎn)換出顯示需要的數(shù)據(jù)
-
- write_com(0x80);
- if(flag==0) write_dat(' ');
- else write_dat('-');
- write_dat('X');
- write_dat(':');
- write_dat(qian);
- write_dat('.');
- write_dat(bai);
- write_dat(shi);
- write_dat('g');
- }
- void display_y() //顯示y軸
- {
-
- // dis_datay=operation(2);
- conversion(dis_datay); //轉(zhuǎn)換出顯示需要的數(shù)據(jù)
- write_com(0x80+8);
- if(flag==0) write_dat(' ');
- else write_dat('-');
- write_dat('Y');
- write_dat(':');
- write_dat(qian);
- write_dat('.');
- write_dat(bai);
- write_dat(shi);
- write_dat('g');
- }
- void display_z() //顯示z軸
- {
- // dis_dataz=operation(4);
- conversion(dis_dataz); //轉(zhuǎn)換出顯示需要的數(shù)據(jù)
- write_com(0x80+0x40);
- if(flag==0) write_dat(' ');
- else write_dat('-');
- write_dat('Z');
- write_dat(':');
- write_dat(qian);
- write_dat('.');
- write_dat(bai);
- write_dat(shi);
- write_dat('g');
- }
- void countstep()
- {
- dis_datax=operation(0);
- dis_datay=operation(2);
- dis_dataz=operation(4);
- acc1=acc;
- acc=sqrt(dis_dataz*dis_dataz+dis_datax*dis_datax+dis_datay*dis_datay) ;
- if(acc1<990&&acc>1010)
- // if(fabs(acc-acc1)>140&&miao1!=miao)
- {
- // miao1=miao;
- count++;
- }
- write_com(0x80);
- conversion(acc);
- write_dat('A');
- write_dat(':');
- write_dat(qian);
- write_dat('.');
- write_dat(bai);
- write_dat(shi);
- write_dat('g');
- write_com(0x80+0x40);
- write_dat('C');
- write_dat('o');
- write_dat('u');
- write_dat('n');
- write_dat('t');
- write_dat(':');
- write_dat(count/100+0x30);
- write_dat((count%100)/10+0x30);
- write_dat(count%10+0x30);
- }
- void ADXL345_Measure() //測(cè)量角度值并顯示
- {
- Multiple_read_ADXL345(); //連續(xù)讀出數(shù)據(jù),存儲(chǔ)在BUF中
- // display_x(); //---------顯示X軸
- // display_y(); //---------顯示Y軸
- // display_z(); //---------顯示Z軸
- countstep();
- }
- void main()
- {
- init();
- Init_ADXL345();
- while(1)
- {
- ADXL345_Measure();
- }
- }
復(fù)制代碼 |
|