久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6599|回復: 12
打印 上一主題 下一主題
收起左側

adxl345傳感器計步器 單片機程序

  [復制鏈接]
跳轉到指定樓層
樓主
adxl345傳感器計步器程序

  1. #include<reg52.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #include  <INTRINS.H>

  6. #define        SlaveAddress   0xA6          //1010 0110    定義器件在IIC總線中的從地址,根據ALT  ADDRESS地址引腳不同修改
  7. sbit rs=P2^0;
  8. sbit rw=P2^1;
  9. sbit en=P2^2;                              //ALT  ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A 0011 1010
  10. sbit sclk=P1^2;
  11. sbit sda=P1^3;
  12. sbit stop=P3^2;

  13. uchar BUF[8];                              //ALT  ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A 0011 1010

  14. float  dis_datax,dis_datay,dis_dataz,acc,acc1=1000;

  15. uchar wan,qian,bai,shi ,ge,flag,miao,miao1,n,g,s,b;
  16. uint count,count_hou,cishu,v,a;


  17. void delay(uint z)
  18. {
  19.         uint x,y;
  20.         for(x=z;x>0;x--)
  21.                 for(y=110;y>0;y--);
  22. }

  23. void write_com(uchar com)
  24. {
  25.         rs=0;
  26.         P0=com;
  27.         delay(5);
  28.         en=1;
  29.         delay(5);
  30.         en=0;
  31. }
  32. void write_dat(uchar dat)
  33. {
  34.         rs=1;
  35.         P0=dat;
  36.         delay(1);
  37.         en=1;
  38.         delay(5);
  39.         en=0;
  40. }
  41. void init()
  42. {
  43.         rw=0;
  44.         en=0;
  45.         write_com(0x38);
  46.         write_com(0x0c);
  47.         write_com(0x06);
  48.         write_com(0x01);
  49. //        write_com(0x80+0x10);
  50. }

  51. void conversion(uint temp_data)  
  52. {  
  53.     wan=temp_data/10000+0x30 ;
  54.     temp_data=temp_data%10000;   //取余運算
  55.        
  56.         qian=temp_data/1000+0x30 ;
  57.     temp_data=temp_data%1000;    //取余運算
  58.    
  59.         bai=temp_data/100+0x30   ;
  60.     temp_data=temp_data%100;     //取余運算                                 -e----------------eee-e
  61.    
  62.         shi=temp_data/10+0x30    ;
  63.     temp_data=temp_data%10;      //取余運算
  64.    
  65.         ge=temp_data+0x30;        
  66. }
  67. void delay6us()                 //6us延時函數
  68. {

  69.         _nop_();        _nop_();          



  70. }

  71. void delay_ms(uint n)       //N ms延時函數
  72. {
  73.         uint x,y;
  74.         for(x=n;x>0;x--)
  75.                 for(y=110;y>0;y--);       
  76. }

  77.                                                                                                                                                                 /////

  78. void ADXL345_Start()
  79. {
  80.     sda = 1;                    //拉高數據線
  81.     sclk = 1;                    //拉高時鐘線
  82.     delay6us();                 //延時
  83.     sda = 0;                    //產生下降沿
  84.     delay6us();                 //延時
  85.     sclk = 0;                    //拉低時鐘線
  86. }

  87. void ADXL345_Stop()
  88. {
  89.     sda = 0;                    //拉低數據線
  90.     sclk = 1;                    //拉高時鐘線
  91.     delay6us();                 //延時
  92.     sda = 1;                    //產生上升沿
  93.     delay6us();                 //延時
  94. }

  95. void ADXL345_SendACK(bit ack)
  96. {
  97.     sda = ack;                  //寫應答信號
  98.     sclk = 1;                    //拉高時鐘線
  99.     delay6us();                 //延時
  100.     sclk = 0;                    //拉低時鐘線
  101.     delay6us();                 //延時
  102. }


  103. bit ADXL345_RecvACK()
  104. {
  105.     sclk = 1;                    //拉高時鐘線
  106.     delay6us();                 //延時
  107.     CY = sda;                   //讀應答信號
  108.     sclk = 0;                    //拉低時鐘線
  109.     delay6us();                 //延時

  110.     return CY;
  111. }


  112. void ADXL345_SendByte(uchar dat)
  113. {
  114.     uchar i;
  115. //        sclk = 0;                //拉低時鐘線

  116.     for (i=0; i<8; i++)         //8位計數器
  117.     {
  118.         dat <<= 1;              //移出數據的最高位
  119.         sda = CY;               //送數據口
  120.         sclk = 1;                //拉高時鐘線
  121.         delay6us();             //延時
  122.         sclk = 0;                //拉低時鐘線
  123.         delay6us();             //延時
  124.     }
  125.     ADXL345_RecvACK();
  126. }


  127. uchar ADXL345_RecvByte()
  128. {
  129.     uchar i;
  130.     uchar dat = 0;

  131.     sda = 1;
  132.         //        write_com(0x80);
  133.                    //使能內部上拉,準備讀取數據,
  134.     for (i=0; i<8; i++)         //8位計數器
  135.     {
  136.         dat <<= 1;
  137.         sclk = 1;                //拉高時鐘線
  138.         delay6us();             //延時
  139.         dat |= sda;             //讀數據               
  140.         sclk = 0;                //拉低時鐘線
  141.         delay6us();             //延時

  142.     }


  143.     return dat;
  144. }

  145. void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
  146. {
  147.     ADXL345_Start();                  //起始信號
  148.     ADXL345_SendByte(SlaveAddress);   //發送設備地址+寫信號
  149.     ADXL345_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf22頁
  150.     ADXL345_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf22頁
  151.     ADXL345_Stop();                   //發送停止信號
  152. }

  153. uchar Single_Read_ADXL345(uchar REG_Address)
  154. {
  155.         uchar REG_data;
  156.     ADXL345_Start();            //起始信號
  157.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  158.     ADXL345_SendByte(REG_Address);                   //發送存儲單元地址,從0開始       
  159.     ADXL345_Start();                          //起始信號
  160.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  161.     REG_data=ADXL345_RecvByte();              //讀出寄存器數據
  162.         ADXL345_SendACK(1);   
  163.         ADXL345_Stop();                           //停止信號
  164.     return REG_data;
  165. }

  166. void Multiple_read_ADXL345()
  167. {   
  168.         uchar i;
  169.     ADXL345_Start();                          //起始信號
  170.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號           1010 0110
  171.     ADXL345_SendByte(0x32);                   //發送存儲單元地址,從0x32開始 0011 0010
  172.     ADXL345_Start();                          //起始信號
  173.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號           1010 0111
  174.         for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  175.     {
  176.         BUF[i] = ADXL345_RecvByte();          //BUF[0]存儲0x32地址中的數據
  177.         if(i == 5)        ADXL345_SendACK(1);       //最后一個數據需要回NOACK
  178.         else        ADXL345_SendACK(0);           //回應ACK
  179.     }
  180.     ADXL345_Stop();                          //停止信號
  181.     delay_ms(10);
  182. }

  183. void Init_ADXL345()           //初始化ADXL345,根據需要請參考pdf進行修改***********************
  184. {
  185. //        delay(500);                                          //上電延時
  186.    Single_Write_ADXL345(0x31,0x2B);   //測量范圍,正負16g,13位模式
  187.    Single_Write_ADXL345(0x2C,0x06);   //0000 0110速率設定為6.25 參考pdf13頁
  188.    Single_Write_ADXL345(0x2D,0x08);   //選擇電源模式   參考pdf24頁
  189.    Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中斷
  190.    Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根據測試傳感器的狀態寫入pdf29頁
  191.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根據測試傳感器的狀態寫入pdf29頁
  192.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根據測試傳感器的狀態寫入pdf29頁
  193. }


  194. float operation(uchar starti)
  195. {
  196.         float  dis_data        ;
  197.         int temp;
  198.         temp=(BUF[starti+1]<<8)+BUF[starti];  //合成數據
  199. //        write_com(0x80);  
  200.         if(temp<0)
  201.         {
  202.                 temp=-temp;
  203.                 flag=1;

  204.         }
  205.         else flag=0; //顯示空格

  206.     dis_data=(float)temp*3.9;  //計算數據和顯示,查考ADXL345快速入門第4頁
  207.   return dis_data;
  208. }
  209. void display_x()         //顯示x軸
  210. {   
  211.    conversion(dis_datax);          //轉換出顯示需要的數據
  212.    
  213.         write_com(0x80);
  214.         if(flag==0)        write_dat(' ');
  215.         else write_dat('-');
  216.         write_dat('X');
  217.         write_dat(':');
  218.         write_dat(qian);

  219.         write_dat('.');
  220.         write_dat(bai);
  221.         write_dat(shi);
  222.         write_dat('g');       
  223.        
  224.                                   write_dat(' ');
  225.                                                                                                                 write_dat('v');
  226.                                                                                                                 write_dat(':');
  227.                                                                                                                 write_dat(v/100+0x30);
  228.                                   write_dat((v%100)/10+0x30);
  229.                                   write_dat(v%10+0x30);
  230. }

  231. void display_y()        //顯示y軸
  232. {   
  233.    
  234.   // dis_datay=operation(2);
  235.     conversion(dis_datay);          //轉換出顯示需要的數據
  236.         write_com(0x80+8);
  237.         if(flag==0)         write_dat(' ');
  238.         else write_dat('-');
  239.         write_dat('Y');
  240.         write_dat(':');
  241.         write_dat(qian);

  242.         write_dat('.');
  243.         write_dat(bai);
  244.         write_dat(shi);
  245.         write_dat('g');

  246.        
  247.                                   write_dat(' ');
  248.                                                                                                                 write_dat('v');
  249.                                                                                                                 write_dat(':');
  250.                                                                                                                 write_dat(v/100+0x30);
  251.                                   write_dat((v%100)/10+0x30);
  252.                                   write_dat(v%10+0x30);
  253. }

  254. void display_z()           //顯示z軸
  255. {  

  256. //  dis_dataz=operation(4);
  257.     conversion(dis_dataz);           //轉換出顯示需要的數據
  258.         write_com(0x80+0x40);
  259.         if(flag==0)                  write_dat(' ');
  260.         else write_dat('-');
  261.         write_dat('Z');
  262.         write_dat(':');
  263.         write_dat(qian);

  264.         write_dat('.');
  265.         write_dat(bai);
  266.         write_dat(shi);
  267.         write_dat('g');
  268.         ///gai  guo
  269.                                   write_dat(' ');
  270.                                                                                                                 write_dat('v');
  271.                                                                                                                 write_dat(':');
  272.                                                                                                                 write_dat(v/100+0x30);
  273.                                   write_dat((v%100)/10+0x30);
  274.                                   write_dat(v%10+0x30);
  275.        
  276. }

  277. void countstep()
  278. {
  279.         dis_datax=operation(0);
  280.         dis_datay=operation(2);
  281.    dis_dataz=operation(4);

  282.         acc1=acc;
  283.         acc=sqrt(dis_dataz*dis_dataz+dis_datax*dis_datax+dis_datay*dis_datay)  ;
  284.         if(acc1<990&&acc>1010)
  285. //        if(fabs(acc-acc1)>140&&miao1!=miao)

  286.         {//if(stop=0)
  287.         //        miao1=miao;
  288.                 count++;
  289.         }
  290.        
  291.        
  292.         write_com(0x80);
  293.         conversion(acc);
  294.         write_dat('A');
  295.         write_dat(':');
  296.         write_dat(qian);

  297.         write_dat('.');
  298.         write_dat(bai);
  299.         write_dat(shi);
  300.         write_dat('g');
  301.        
  302.                           write_dat(' ');
  303.         write_dat('v');
  304.         write_dat(':');
  305.         write_dat(v/100+0x30);
  306.         write_dat((v%100)/10+0x30);
  307.     write_dat(v%10+0x30);
  308.         write_com(0x80+0x40);
  309.         write_dat('C');
  310.         write_dat('o');
  311.         write_dat('u');
  312.         write_dat('n');
  313.         write_dat('t');
  314.         write_dat(':');
  315.         write_dat(count_hou/100+0x30);
  316.         write_dat((count_hou%100)/10+0x30);
  317.         write_dat(count_hou%10+0x30);


  318. }
  319. void ADXL345_Measure()                         //測量角度值并顯示
  320. {
  321.         Multiple_read_ADXL345();     //連續讀出數據,存儲在BUF中
  322.         countstep();

  323. }



  324. void main()
  325. {
  326.         unsigned int j,k=1;
  327.         stop=1;
  328.         init();

  329.         TMOD=0X01;                        //設置定時器0為模式一,即16位計算模式
  330.   TH0 =(65536-50000)/256;
  331.   TL0 =(65536-50000)%256;
  332.         EA=1;                //開啟總中斷
  333.         ET0=1;                //開啟定時器0中斷
  334.         TR0=1;                //啟動定時器0
  335.        
  336.        
  337.         write_com(0x80);
  338.         write_dat('O');
  339.         write_dat('N');
  340.         delay(1500);
  341.         Init_ADXL345();
  342.        
  343.         while(1)
  344.         {
  345.                                                 if(stop==0)                //檢測按鍵K1是否按下
  346.                                                 {
  347.                                                                 delay(10);//消除抖動
  348.                                                                 if(stop==0)
  349.                                                                 {
  350.                                                                                                                 while(k==1)
  351.                                                                                                         {
  352.                                                                                                                         j=count;
  353.                                                                                                                         count_hou=j;
  354.                                                                                                                         write_com(0x80);
  355.                                                                                                                         conversion(acc);
  356.                                                                                                                        
  357.                                                                                                                         write_dat('s');
  358.                               write_dat('t');
  359.                                                                                                                         write_dat('o');
  360.                                                                                                                         write_dat('p');
  361.                                                                                                                         write_dat('!');
  362.                                                                                                                  write_dat(' ');
  363.                                                                                                                 write_dat(' ');
  364.                                                                                                                 write_dat(' ');
  365.                                                                                                                
  366.                                                                                                                 write_dat('v');
  367.                                                                                                                 write_dat(':');
  368.                                                                                                                 write_dat(v/100+0x30);
  369.                                   write_dat((v%100)/10+0x30);
  370.                                   write_dat(v%10+0x30);
  371.                                                                                                                 EA=0;
  372.                                                                                                                         delay(1000);
  373.                                                                                                                         delay(100);
  374.                                                                                                                  
  375.                                                                                                                                 if(stop==0)
  376.                                                                                                                                 {
  377.                                                                                                                                         Init_ADXL345();
  378.                                                                                                                                  count=0;
  379.                                                                                                                                         k=0;
  380.                                                                                                                                         EA=1;
  381.                                                                                                                                 }                                                                                                               
  382.                                                                                                         }                                                               
  383.                                                                 }
  384.                                                 }               
  385.         count_hou=count;       
  386.         ADXL345_Measure();

  387.   }       
  388. }


  389. void timeinit()
  390. {
  391.         TMOD=0X01;                        //設置定時器0為模式一,即16位計算模式
  392.   TH0 =(65536-50000)/256;
  393.   TL0 =(65536-50000)%256;
  394.         EA=1;                //開啟總中斷
  395.         ET0=1;                //開啟定時器0中斷
  396.         TR0=1;                //啟動定時器0
  397.        
  398. }

  399. void time0(void) interrupt 1
  400. {
  401.   TH0 =(65536-50000)/256;
  402.   TL0 =(65536-50000)%256;
  403.         cishu++;
  404.         if(cishu>=100)
  405.         {
  406.           cishu=0;
  407.                
  408.                 v=(count-a)*12;
  409.                 a=count;
  410.         }
  411.        
  412. }
復制代碼


計步器.zip

41.91 KB, 下載次數: 58, 下載積分: 黑幣 -5

計步器測試程序.zip

39.73 KB, 下載次數: 42, 下載積分: 黑幣 -5

計步器最小系統.zip

6.27 MB, 下載次數: 43, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +5 收起 理由
兜蔸竇 + 5 絕世好帖!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:143128 發表于 2016-10-17 22:36 | 只看該作者
這是完整的代碼了嗎 不是部分代碼嗎?怎么沒有1602頭文件
回復

使用道具 舉報

板凳
ID:107115 發表于 2016-10-18 18:58 | 只看該作者
fresh 發表于 2016-10-17 22:36
這是完整的代碼了嗎 不是部分代碼嗎?怎么沒有1602頭文件

都在main.c里頭,這是比賽預賽題,我親自做出來的,絕對可用
回復

使用道具 舉報

地板
ID:143128 發表于 2016-10-19 11:01 | 只看該作者
復印件腹黑攻 發表于 2016-10-18 18:58
都在main.c里頭,這是比賽預賽題,我親自做出來的,絕對可用

可是我下載下來打開main.c是空的 ,你可以共享一下你的仿真圖嗎?  我有點想不明白仿真圖怎么顯示效果的,又不能移動
回復

使用道具 舉報

5#
ID:143128 發表于 2016-10-19 11:07 | 只看該作者
復印件腹黑攻 發表于 2016-10-18 18:58
都在main.c里頭,這是比賽預賽題,我親自做出來的,絕對可用

你能把程序加仿真圖發到我郵箱嗎?374122506@qq.com 謝謝
回復

使用道具 舉報

6#
ID:143128 發表于 2016-10-19 11:10 | 只看該作者
復印件腹黑攻 發表于 2016-10-18 18:58
都在main.c里頭,這是比賽預賽題,我親自做出來的,絕對可用

能給個QQ號碼嗎
回復

使用道具 舉報

7#
ID:154881 發表于 2016-12-15 00:17 | 只看該作者
有仿真圖嗎  我在做實物  遇到了瓶頸
回復

使用道具 舉報

8#
ID:161764 發表于 2017-1-14 17:09 | 只看該作者
我打開main.c也是一片空白
回復

使用道具 舉報

9#
ID:171386 發表于 2017-3-16 22:45 | 只看該作者
謝謝啦
回復

使用道具 舉報

10#
ID:188124 發表于 2017-4-11 20:37 | 只看該作者
感謝分享!
回復

使用道具 舉報

11#
ID:299262 發表于 2018-6-6 15:53 | 只看該作者
謝謝分享,學習一下!
回復

使用道具 舉報

12#
ID:299262 發表于 2018-6-6 15:54 | 只看該作者

感謝分享!
回復

使用道具 舉報

13#
ID:515167 發表于 2019-4-19 14:36 | 只看該作者
樓主,這個a和v是顯示什么,我最近也在做這個,能指導一下嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区在线播放 | 日韩av在线中文字幕 | 免费成人午夜 | 亚洲欧美精品久久 | 天天干天天干 | 日本成人中文字幕在线观看 | 午夜视频在线播放 | 狠狠的干狠狠的操 | 日本超碰 | 91最新在线视频 | 奇米四色在线观看 | 国产成人免费 | 久久精品黄色 | 97伦理最新伦理 | 国产日韩一区二区三免费高清 | 久久久综合网 | 亚洲一区精品在线 | 亚洲va国产日韩欧美精品色婷婷 | 韩日在线观看视频 | 国产精品日日做人人爱 | 中文字幕在线观看视频一区 | 成人网视频 | 婷婷丁香综合网 | 一级片网站视频 | 欧美二区三区 | 欧美日日日日bbbbb视频 | 毛片高清| 国产伦精品一区二区三区高清 | 91亚洲国产成人久久精品网站 | 中文日本在线 | 日韩精品激情 | 国产精品一区在线观看 | 国产99热在线 | 91精品一区二区三区久久久久久 | 国产成人自拍一区 | 91精品国产一区 | 国产精品色婷婷久久58 | 国产露脸国语对白在线 | 免费一区二区三区 | 国产精品成av人在线视午夜片 | 中文字幕在线视频一区二区三区 |