|
adxl345傳感器計步器程序
0.png (77.89 KB, 下載次數: 74)
下載附件
2016-8-8 10:53 上傳
- #include<reg52.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #include <INTRINS.H>
- #define SlaveAddress 0xA6 //1010 0110 定義器件在IIC總線中的從地址,根據ALT ADDRESS地址引腳不同修改
- sbit rs=P2^0;
- sbit rw=P2^1;
- sbit en=P2^2; //ALT ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A 0011 1010
- sbit sclk=P1^2;
- sbit sda=P1^3;
- sbit stop=P3^2;
- uchar BUF[8]; //ALT ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A 0011 1010
- float dis_datax,dis_datay,dis_dataz,acc,acc1=1000;
- uchar wan,qian,bai,shi ,ge,flag,miao,miao1,n,g,s,b;
- uint count,count_hou,cishu,v,a;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)
- {
- rs=0;
- P0=com;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void write_dat(uchar dat)
- {
- rs=1;
- P0=dat;
- delay(1);
- en=1;
- delay(5);
- en=0;
- }
- void init()
- {
- rw=0;
- en=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- // write_com(0x80+0x10);
- }
- 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; //取余運算
-
- bai=temp_data/100+0x30 ;
- temp_data=temp_data%100; //取余運算 -e----------------eee-e
-
- shi=temp_data/10+0x30 ;
- temp_data=temp_data%10; //取余運算
-
- ge=temp_data+0x30;
- }
- void delay6us() //6us延時函數
- {
- _nop_(); _nop_();
- }
- void delay_ms(uint n) //N ms延時函數
- {
- uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- /////
- void ADXL345_Start()
- {
- sda = 1; //拉高數據線
- sclk = 1; //拉高時鐘線
- delay6us(); //延時
- sda = 0; //產生下降沿
- delay6us(); //延時
- sclk = 0; //拉低時鐘線
- }
- void ADXL345_Stop()
- {
- sda = 0; //拉低數據線
- sclk = 1; //拉高時鐘線
- delay6us(); //延時
- sda = 1; //產生上升沿
- delay6us(); //延時
- }
- void ADXL345_SendACK(bit ack)
- {
- sda = ack; //寫應答信號
- sclk = 1; //拉高時鐘線
- delay6us(); //延時
- sclk = 0; //拉低時鐘線
- delay6us(); //延時
- }
- bit ADXL345_RecvACK()
- {
- sclk = 1; //拉高時鐘線
- delay6us(); //延時
- CY = sda; //讀應答信號
- sclk = 0; //拉低時鐘線
- delay6us(); //延時
- return CY;
- }
- void ADXL345_SendByte(uchar dat)
- {
- uchar i;
- // sclk = 0; //拉低時鐘線
- for (i=0; i<8; i++) //8位計數器
- {
- dat <<= 1; //移出數據的最高位
- sda = CY; //送數據口
- sclk = 1; //拉高時鐘線
- delay6us(); //延時
- sclk = 0; //拉低時鐘線
- delay6us(); //延時
- }
- ADXL345_RecvACK();
- }
- uchar ADXL345_RecvByte()
- {
- uchar i;
- uchar dat = 0;
- sda = 1;
- // write_com(0x80);
- //使能內部上拉,準備讀取數據,
- for (i=0; i<8; i++) //8位計數器
- {
- dat <<= 1;
- sclk = 1; //拉高時鐘線
- delay6us(); //延時
- dat |= sda; //讀數據
- sclk = 0; //拉低時鐘線
- delay6us(); //延時
- }
- 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;
- }
- void Multiple_read_ADXL345()
- {
- uchar i;
- ADXL345_Start(); //起始信號
- ADXL345_SendByte(SlaveAddress); //發送設備地址+寫信號 1010 0110
- ADXL345_SendByte(0x32); //發送存儲單元地址,從0x32開始 0011 0010
- ADXL345_Start(); //起始信號
- ADXL345_SendByte(SlaveAddress+1); //發送設備地址+讀信號 1010 0111
- 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(); //停止信號
- delay_ms(10);
- }
- void Init_ADXL345() //初始化ADXL345,根據需要請參考pdf進行修改***********************
- {
- // delay(500); //上電延時
- Single_Write_ADXL345(0x31,0x2B); //測量范圍,正負16g,13位模式
- Single_Write_ADXL345(0x2C,0x06); //0000 0110速率設定為6.25 參考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頁
- }
- float operation(uchar starti)
- {
- float dis_data ;
- int temp;
- temp=(BUF[starti+1]<<8)+BUF[starti]; //合成數據
- // write_com(0x80);
- if(temp<0)
- {
- temp=-temp;
- flag=1;
- }
- else flag=0; //顯示空格
- dis_data=(float)temp*3.9; //計算數據和顯示,查考ADXL345快速入門第4頁
- return dis_data;
- }
- void display_x() //顯示x軸
- {
- conversion(dis_datax); //轉換出顯示需要的數據
-
- 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');
-
- write_dat(' ');
- write_dat('v');
- write_dat(':');
- write_dat(v/100+0x30);
- write_dat((v%100)/10+0x30);
- write_dat(v%10+0x30);
- }
- void display_y() //顯示y軸
- {
-
- // dis_datay=operation(2);
- conversion(dis_datay); //轉換出顯示需要的數據
- 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');
-
- write_dat(' ');
- write_dat('v');
- write_dat(':');
- write_dat(v/100+0x30);
- write_dat((v%100)/10+0x30);
- write_dat(v%10+0x30);
- }
- void display_z() //顯示z軸
- {
- // dis_dataz=operation(4);
- conversion(dis_dataz); //轉換出顯示需要的數據
- 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');
- ///gai guo
- write_dat(' ');
- write_dat('v');
- write_dat(':');
- write_dat(v/100+0x30);
- write_dat((v%100)/10+0x30);
- write_dat(v%10+0x30);
-
- }
- 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)
- {//if(stop=0)
- // 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_dat(' ');
- write_dat('v');
- write_dat(':');
- write_dat(v/100+0x30);
- write_dat((v%100)/10+0x30);
- write_dat(v%10+0x30);
- write_com(0x80+0x40);
- write_dat('C');
- write_dat('o');
- write_dat('u');
- write_dat('n');
- write_dat('t');
- write_dat(':');
- write_dat(count_hou/100+0x30);
- write_dat((count_hou%100)/10+0x30);
- write_dat(count_hou%10+0x30);
- }
- void ADXL345_Measure() //測量角度值并顯示
- {
- Multiple_read_ADXL345(); //連續讀出數據,存儲在BUF中
- countstep();
- }
- void main()
- {
- unsigned int j,k=1;
- stop=1;
- init();
- TMOD=0X01; //設置定時器0為模式一,即16位計算模式
- TH0 =(65536-50000)/256;
- TL0 =(65536-50000)%256;
- EA=1; //開啟總中斷
- ET0=1; //開啟定時器0中斷
- TR0=1; //啟動定時器0
-
-
- write_com(0x80);
- write_dat('O');
- write_dat('N');
- delay(1500);
- Init_ADXL345();
-
- while(1)
- {
- if(stop==0) //檢測按鍵K1是否按下
- {
- delay(10);//消除抖動
- if(stop==0)
- {
- while(k==1)
- {
- j=count;
- count_hou=j;
- write_com(0x80);
- conversion(acc);
-
- write_dat('s');
- write_dat('t');
- write_dat('o');
- write_dat('p');
- write_dat('!');
- write_dat(' ');
- write_dat(' ');
- write_dat(' ');
-
- write_dat('v');
- write_dat(':');
- write_dat(v/100+0x30);
- write_dat((v%100)/10+0x30);
- write_dat(v%10+0x30);
- EA=0;
- delay(1000);
- delay(100);
-
- if(stop==0)
- {
- Init_ADXL345();
- count=0;
- k=0;
- EA=1;
- }
- }
- }
- }
- count_hou=count;
- ADXL345_Measure();
- }
- }
- void timeinit()
- {
- TMOD=0X01; //設置定時器0為模式一,即16位計算模式
- TH0 =(65536-50000)/256;
- TL0 =(65536-50000)%256;
- EA=1; //開啟總中斷
- ET0=1; //開啟定時器0中斷
- TR0=1; //啟動定時器0
-
- }
- void time0(void) interrupt 1
- {
- TH0 =(65536-50000)/256;
- TL0 =(65536-50000)%256;
- cishu++;
- if(cishu>=100)
- {
- cishu=0;
-
- v=(count-a)*12;
- a=count;
- }
-
- }
復制代碼
|
-
-
計步器.zip
2016-8-4 10:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
41.91 KB, 下載次數: 58, 下載積分: 黑幣 -5
-
-
計步器測試程序.zip
2016-8-4 10:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
39.73 KB, 下載次數: 42, 下載積分: 黑幣 -5
-
-
計步器最小系統.zip
2016-8-4 10:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
6.27 MB, 下載次數: 43, 下載積分: 黑幣 -5
評分
-
查看全部評分
|