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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用ADXL345做的計步器(帶溫度顯示)附程序和ADXL345中文PDF

  [復制鏈接]
跳轉到指定樓層
樓主
免費下哦(PS:有部分資料是從51黑論壇里找的哦)

全部資料下載(帶ADXL345中文PDF):
基于ADXL345的計步器.zip (961.37 KB, 下載次數: 472)



主程序預覽:
  1. #include  <reg52.h>        
  2. #include  <math.h>    //Keil library  
  3. #include  <stdio.h>   //Keil library        
  4. #include  <intrins.h>                                                

  5. #define   uchar unsigned char
  6. #define   uint unsigned int        


  7. sbit          SCL=P3^1;      //IIC時鐘引腳定義
  8. sbit           SDA=P3^2;      //IIC數據引腳定義
  9. sbit          key=P3^7;      //按鍵引腳定義

  10. #define        SlaveAddress   0xA6          //定義器件在IIC總線中的從地址,根據ALT  ADDRESS地址引腳不同修改
  11.                               //ALT  ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A
  12. typedef unsigned char  BYTE;
  13. typedef unsigned short WORD;


  14. BYTE BUF[8];                         //接收數據緩存區              
  15. uchar ge,shi,bai,qian,wan;           //顯示變量
  16. int  dis_data;                       //變量

  17. bit flag1s = 0;          //1s定時標志

  18. uint num1=0,num2=0;  //1總步數,2步數
  19. int aaa=0;           //不重復變量

  20. void Init_ADXL345(void);             //初始化ADXL345

  21. void ConfigTimer0(unsigned int ms);
  22. unsigned char IntToString(unsigned char *str, int dat);
  23. extern bit Start18B20();
  24. extern bit Get18B20Temp(int *temp);
  25. extern void delay(unsigned int k);
  26. extern void Lcd_init();
  27. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);//定義指針變量,把字符串數組的地址送到該指針變量上(便于指向X并顯示X)
  28. extern void DisplayOneChar(uchar x, uchar y, uchar str);
  29. void conversion(uint temp_data);

  30. void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //單個寫入數據
  31. uchar Single_Read_ADXL345(uchar REG_Address);                   //單個讀取內部寄存器數據
  32. void  Multiple_Read_ADXL345();                                  //連續的讀取內部寄存器數據
  33. //------------------------------------
  34. void Delay5us();
  35. void Delay5ms();
  36. void ADXL345_Start();
  37. void ADXL345_Stop();
  38. void ADXL345_SendACK(bit ack);
  39. bit  ADXL345_RecvACK();
  40. void ADXL345_SendByte(BYTE dat);
  41. BYTE ADXL345_RecvByte();
  42. void ADXL345_ReadPage();
  43. void ADXL345_WritePage();
  44. //-----------------------------------

  45. //*********************************************************
  46. void conversion(uint temp_data)  
  47. {  
  48.     wan=temp_data/10000+0x30 ;
  49.     temp_data=temp_data%10000;   //取余運算
  50.         qian=temp_data/1000+0x30 ;
  51.     temp_data=temp_data%1000;    //取余運算
  52.     bai=temp_data/100+0x30   ;
  53.     temp_data=temp_data%100;     //取余運算
  54.     shi=temp_data/10+0x30    ;
  55.     temp_data=temp_data%10;      //取余運算
  56.     ge=temp_data+0x30;         
  57. }

  58.                                        

  59. /**************************************
  60. 延時5微秒(STC90C52RC---12MHz---12T)
  61. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  62. 當改用1T的MCU時,請調整此延時函數
  63. **************************************/
  64. void Delay5us()
  65. {
  66.     _nop_();_nop_();_nop_();_nop_();
  67.     _nop_();_nop_();_nop_();_nop_();
  68.         _nop_();_nop_();_nop_();_nop_();
  69. }

  70. /**************************************
  71. 延時5毫秒(STC90C52RC@12M)
  72. 不同的工作環境,需要調整此函數
  73. 當改用1T的MCU時,請調整此延時函數
  74. **************************************/
  75. void Delay5ms()
  76. {
  77.     WORD n = 560;

  78.     while (n--);
  79. }

  80. /**************************************
  81. 起始信號
  82. **************************************/
  83. void ADXL345_Start()
  84. {
  85.     SDA = 1;                    //拉高數據線
  86.     SCL = 1;                    //拉高時鐘線
  87.     Delay5us();                 //延時
  88.     SDA = 0;                    //產生下降沿
  89.     Delay5us();                 //延時
  90.     SCL = 0;                    //拉低時鐘線
  91. }

  92. /**************************************
  93. 停止信號
  94. **************************************/
  95. void ADXL345_Stop()
  96. {
  97.     SDA = 0;                    //拉低數據線
  98.     SCL = 1;                    //拉高時鐘線
  99.     Delay5us();                 //延時
  100.     SDA = 1;                    //產生上升沿
  101.     Delay5us();                 //延時
  102. }

  103. /**************************************
  104. 發送應答信號
  105. 入口參數:ack (0:ACK 1:NAK)
  106. **************************************/
  107. void ADXL345_SendACK(bit ack)
  108. {
  109.     SDA = ack;                  //寫應答信號
  110.     SCL = 1;                    //拉高時鐘線
  111.     Delay5us();                 //延時
  112.     SCL = 0;                    //拉低時鐘線
  113.     Delay5us();                 //延時
  114. }

  115. /**************************************
  116. 接收應答信號
  117. **************************************/
  118. bit ADXL345_RecvACK()
  119. {
  120.     SCL = 1;                    //拉高時鐘線
  121.     Delay5us();                 //延時
  122.     CY = SDA;                   //讀應答信號
  123.     SCL = 0;                    //拉低時鐘線
  124.     Delay5us();                 //延時

  125.     return CY;
  126. }

  127. /**************************************
  128. 向IIC總線發送一個字節數據
  129. **************************************/
  130. void ADXL345_SendByte(BYTE dat)
  131. {
  132.     BYTE i;

  133.     for (i=0; i<8; i++)         //8位計數器
  134.     {
  135.         dat <<= 1;              //移出數據的最高位
  136.         SDA = CY;               //送數據口
  137.         SCL = 1;                //拉高時鐘線
  138.         Delay5us();             //延時
  139.         SCL = 0;                //拉低時鐘線
  140.         Delay5us();             //延時
  141.     }
  142.     ADXL345_RecvACK();
  143. }

  144. /**************************************
  145. 從IIC總線接收一個字節數據
  146. **************************************/
  147. BYTE ADXL345_RecvByte()
  148. {
  149.     BYTE i;
  150.     BYTE dat = 0;

  151.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  152.     for (i=0; i<8; i++)         //8位計數器
  153.     {
  154.         dat <<= 1;
  155.         SCL = 1;                //拉高時鐘線
  156.         Delay5us();             //延時
  157.         dat |= SDA;             //讀數據               
  158.         SCL = 0;                //拉低時鐘線
  159.         Delay5us();             //延時
  160.     }
  161.     return dat;
  162. }

  163. //******單字節寫入*******************************************

  164. void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
  165. {
  166.     ADXL345_Start();                  //起始信號
  167.     ADXL345_SendByte(SlaveAddress);   //發送設備地址+寫信號
  168.     ADXL345_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf22頁
  169.     ADXL345_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf22頁
  170.     ADXL345_Stop();                   //發送停止信號
  171. }

  172. //********單字節讀取*****************************************
  173. /*uchar Single_Read_ADXL345(uchar REG_Address)
  174. {   uchar REG_data;
  175.     ADXL345_Start();                          //起始信號
  176.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  177.     ADXL345_SendByte(REG_Address);            //發送存儲單元地址,從0開始        
  178.     ADXL345_Start();                          //起始信號
  179.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  180.     REG_data=ADXL345_RecvByte();              //讀出寄存器數據
  181.         ADXL345_SendACK(1);   
  182.         ADXL345_Stop();                           //停止信號
  183.     return REG_data;
  184. }          */
  185. //*********************************************************
  186. //
  187. //連續讀出ADXL345內部加速度數據,地址范圍0x32~0x37
  188. //
  189. //*********************************************************
  190. void Multiple_read_ADXL345(void)
  191. {   uchar i;
  192.     ADXL345_Start();                          //起始信號
  193.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  194.     ADXL345_SendByte(0x32);                   //發送存儲單元地址,從0x32開始        
  195.     ADXL345_Start();                          //起始信號
  196.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  197.          for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  198.     {
  199.         BUF[i] = ADXL345_RecvByte();          //BUF[0]存儲0x32地址中的數據
  200.         if (i == 5)
  201.         {
  202.            ADXL345_SendACK(1);                //最后一個數據需要回NOACK
  203.         }
  204.         else
  205.         {
  206.           ADXL345_SendACK(0);                //回應ACK
  207.        }
  208.    }
  209.     ADXL345_Stop();                          //停止信號
  210.     Delay5ms();
  211. }


  212. //*****************************************************************

  213. //初始化ADXL345,根據需要請參考pdf進行修改************************
  214. void Init_ADXL345()
  215. {
  216.    Single_Write_ADXL345(0x31,0x0B);   //測量范圍,正負16g,13位模式
  217.    Single_Write_ADXL345(0x2C,0x08);   //速率設定為12.5 參考pdf13頁
  218.    Single_Write_ADXL345(0x2D,0x08);   //選擇電源模式   參考pdf24頁
  219.    Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中斷
  220.    Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根據測試傳感器的狀態寫入pdf29頁
  221.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根據測試傳感器的狀態寫入pdf29頁
  222.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根據測試傳感器的狀態寫入pdf29頁
  223. }

  224. //***********************************************************************
  225. //顯示x軸
  226. void display_x()
  227. {   
  228.     dis_data=(BUF[1]<<8)+BUF[0];  //合成數據   
  229.         
  230.         if(dis_data<30)           //靈敏度設置, 0 靈敏度最高
  231.         {
  232.                 aaa=1;
  233.         }
  234.         else
  235.         {
  236.                 if(aaa==1)
  237.                 {
  238.                         aaa=0;
  239.                         num1++;           //總步數 累加
  240.                         num2++;           //步數 累加
  241.                 }
  242.         }   
  243.         
  244.         conversion(num2);          //步數數據         
  245.         DisplayOneChar(0,0,'B');   //第0行,第0列 顯示X
  246.     DisplayOneChar(1,0,':');
  247.     DisplayOneChar(2,0,wan);
  248.     DisplayOneChar(3,0,qian);
  249.     DisplayOneChar(4,0,bai);
  250.     DisplayOneChar(5,0,shi);
  251.     DisplayOneChar(6,0,ge);


  252.         conversion(num1);          //總步數數據
  253.         DisplayOneChar(0,1,'Z');   //第1行,第0列 顯示X
  254.     DisplayOneChar(1,1,'B');
  255.         DisplayOneChar(2,1,':');
  256.     DisplayOneChar(3,1,wan);
  257.     DisplayOneChar(4,1,qian);
  258.     DisplayOneChar(5,1,bai);
  259.     DisplayOneChar(6,1,shi);
  260.     DisplayOneChar(7,1,ge);
  261. }



  262. //*********************************************************
  263. //******主程序********
  264. //*********************************************************
  265. void main()
  266. {

  267.         bit res;
  268.     int temp;        //讀取到的當前溫度值
  269.     int intT, decT;  //溫度值的整數和小數部分
  270.     unsigned char len;
  271.     unsigned char str[12];

  272.     EA = 1;            //開總中斷
  273.     ConfigTimer0(10);  //T0定時10ms
  274.     Start18B20();      //啟動DS18B20

  275.   //uchar devid;
  276.   delay(500);                          //上電延時               
  277.   Lcd_init();                      //液晶初始化ADXL345
  278.   Init_ADXL345();                 //初始化ADXL345
  279.   //devid=Single_Read_ADXL345(0X00);//讀出的數據為0XE5,表示正確
  280.   while(1)                          //循環
  281.           {
  282.                     Multiple_Read_ADXL345();       //連續讀出數據,存儲在BUF中
  283.                     display_x();                   //---------顯示X軸
  284.                     delay(200);                    //延時            
  285.                
  286.                         if( key == 0 )                       //按鍵
  287.                         {
  288.                            num2 = 0;                               //歸零
  289.                         }

  290.                         DisplayOneChar(8,0,'T');
  291.                         DisplayOneChar(9,0,'e');
  292.                         DisplayOneChar(10,0,'m');
  293.                         DisplayOneChar(11,0,':');
  294.                         if (flag1s)  //每秒更新一次溫度
  295.                 {
  296.                     flag1s = 0;
  297.                     res = Get18B20Temp(&temp);  //讀取當前溫度
  298.                     if (res)                    //讀取成功時,刷新當前溫度顯示
  299.                     {
  300.                         intT = temp >> 4;             //分離出溫度值整數部分
  301.                         decT = temp & 0xF;            //分離出溫度值小數部分
  302.                         len = IntToString(str, intT); //整數部分轉換為字符串
  303.                         str[len++] = '.';             //添加小數點
  304.                         decT = (decT*10) / 16;        //二進制的小數部分轉換為1位十進制位
  305.                         str[len++] = decT + '0';      //十進制小數位再轉換為ASCII字符
  306.                         while (len < 6)               //用空格補齊到6個字符長度
  307.                         {
  308.                             str[len++] = ' ';
  309.                         }
  310.                         str[len] = '\0';              //添加字符串結束符
  311.                         LcdShowStr(12, 0, str);        //“數字”顯示到液晶屏上
  312.                     }
  313.                     else                        //讀取失敗時,提示錯誤信息
  314.                     {
  315.                         LcdShowStr(10, 1, "error!");
  316.                     }
  317.                     Start18B20();               //重新啟動下一次轉換
  318.                 }
  319.         
  320.           }
  321. }

  322. /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
  323. unsigned char IntToString(unsigned char *str, int dat)
  324. {
  325.     signed char i = 0;
  326.     unsigned char len = 0;
  327.     unsigned char buf[6];
  328.    
  329.     if (dat < 0)  //如果為負數,首先取絕對值,并在指針上添加負號
  330.     {
  331.         dat = -dat;
  332.         *str++ = '-';
  333.         len++;
  334.     }
  335.     do {          //先轉換為低位在前的十進制數組
  336.         buf[i++] = dat % 10;
  337.         dat /= 10;
  338.     } while (dat > 0);
  339.     len += i;     //i最后的值就是有效字符的個數
  340.     while (i-- > 0)   //將數組值轉換為ASCII碼反向拷貝到接收指針上
  341.     {
  342.         *str++ = buf[i] + '0';
  343.     }
  344.     *str = '\0';  //添加字符串結束符
  345.    
  346.     return len;   //返回字符串長度
  347. }
  348. /* 配置并啟動T0,ms-T0定時時間 */
  349. void ConfigTimer0(unsigned int ms)
  350. {
  351.     unsigned long tmp;  //臨時變量
  352.    
  353.     tmp = 11059200 / 12;      //定時器計數頻率
  354.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  355.     tmp = 65536 - tmp;        //計算定時器重載值
  356.     tmp = tmp + 12;           //補償中斷響應延時造成的誤差
  357.     TMOD &= 0xF0;   //清零T0的控制位
  358.     TMOD |= 0x01;   //配置T0為模式1
  359.         TH0=(65536-50000)%256;
  360.         TL0=(65536-50000)%256;
  361.     ET0 = 1;        //使能T0中斷
  362.     TR0 = 1;        //啟動T0
  363. }
  364. /* T0中斷服務函數,完成1秒定時 */
  365. void InterruptTimer0() interrupt 1
  366. {
  367.     static unsigned char tmr1s = 0;
  368.    
  369.         TH0=(65536-50000)%256;
  370.         TL0=(65536-50000)%256;
  371.     tmr1s++;
  372.     if (tmr1s >= 18)  //定時1s
  373.     {
  374.         tmr1s = 0;
  375.         flag1s = 1;
  376.     }
  377. }
復制代碼


評分

參與人數 4黑幣 +61 收起 理由
oyang123 + 5 很給力!
873839450 + 5 很給力!
hsbuggati + 1 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:169448 發表于 2017-3-13 15:08 | 只看該作者

謝謝樓主分享!!
回復

使用道具 舉報

板凳
ID:129081 發表于 2017-3-22 19:14 | 只看該作者
謝謝分享
回復

使用道具 舉報

地板
ID:292153 發表于 2018-3-15 09:59 | 只看該作者
感謝分享
回復

使用道具 舉報

5#
ID:301547 發表于 2018-4-9 09:54 | 只看該作者
有沒有 arduino版的
回復

使用道具 舉報

6#
ID:311659 發表于 2018-4-20 16:38 | 只看該作者
感謝分享!
回復

使用道具 舉報

7#
ID:320872 發表于 2018-5-2 22:51 | 只看該作者
贊,很給力,想下載
回復

使用道具 舉報

8#
ID:308041 發表于 2018-5-7 23:13 | 只看該作者
很棒,有幫助
回復

使用道具 舉報

9#
ID:341757 發表于 2018-5-30 22:20 來自手機 | 只看該作者
感謝分享
回復

使用道具 舉報

10#
ID:341045 發表于 2018-5-31 06:48 | 只看該作者
謝謝分享
回復

使用道具 舉報

11#
ID:110278 發表于 2018-5-31 19:58 | 只看該作者
點個贊。
回復

使用道具 舉報

12#
ID:391171 發表于 2018-8-29 13:41 | 只看該作者
共享資料的黑幣獎勵
回復

使用道具 舉報

13#
ID:345799 發表于 2018-8-29 14:21 | 只看該作者
下載學習
回復

使用道具 舉報

14#
ID:519952 發表于 2019-4-24 16:45 | 只看該作者
  學習一波
回復

使用道具 舉報

15#
ID:92810 發表于 2019-5-27 10:35 | 只看該作者
謝謝樓主分享了
回復

使用道具 舉報

16#
ID:590547 發表于 2019-7-25 21:46 | 只看該作者

謝謝樓主分享了
回復

使用道具 舉報

17#
ID:717494 發表于 2020-3-28 12:38 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

18#
ID:631827 發表于 2020-5-1 16:39 | 只看該作者
謝謝樓主,解答我的疑惑
回復

使用道具 舉報

19#
ID:824356 發表于 2020-9-28 20:29 | 只看該作者
完美啊
回復

使用道具 舉報

20#
ID:657845 發表于 2020-10-11 20:42 | 只看該作者
有沒有32的?謝謝樓主了
回復

使用道具 舉報

21#
ID:825327 發表于 2020-11-21 22:50 | 只看該作者
謝謝樓主!學習一下。
回復

使用道具 舉報

22#
ID:889207 發表于 2021-3-7 13:52 | 只看該作者
遇到很多困難,來學習一下,非常感謝分享!
回復

使用道具 舉報

23#
ID:601357 發表于 2021-4-5 11:39 | 只看該作者
謝謝分享啦 剛剛好需要用得上
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人网在线观看 | 美女黄色在线观看 | 国产成人精品久久二区二区91 | 亚洲资源站 | 欧洲成人午夜免费大片 | 成人午夜免费视频 | 在线视频国产一区 | 国产欧美精品一区 | 天天拍天天草 | 国产精品毛片无码 | 黄色毛片在线观看 | 中文字幕国产视频 | 久久丝袜视频 | av一二三区| 日韩在线视频一区二区三区 | www.日日操 | 成人日韩 | 成人免费视频网站在线观看 | 国产成人精品视频在线观看 | 亚洲最大成人综合 | 久久久高清 | 婷婷狠狠| 二区高清| 国产馆 | 亚洲一区影院 | 亚洲网站观看 | 久久99视频免费观看 | 日韩电影免费在线观看中文字幕 | 国产精品久久久爽爽爽麻豆色哟哟 | www.久久国产精品 | 久久激情av | 在线看亚洲 | 亚洲视频一区在线观看 | 天天干狠狠操 | 亚洲精品视频在线 | 亚洲精品成人 | 一级片网站视频 | 欧美在线小视频 | av网站免费| 在线视频 欧美日韩 | 波多野结衣一二三区 |