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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14030|回復(fù): 22
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:147475 發(fā)表于 2017-2-28 14:09 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
免費下哦(PS:有部分資料是從51黑論壇里找的哦)

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



主程序預(yù)覽:
  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數(shù)據(jù)引腳定義
  9. sbit          key=P3^7;      //按鍵引腳定義

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


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

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

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

  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);//定義指針變量,把字符串數(shù)組的地址送到該指針變量上(便于指向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);   //單個寫入數(shù)據(jù)
  31. uchar Single_Read_ADXL345(uchar REG_Address);                   //單個讀取內(nèi)部寄存器數(shù)據(jù)
  32. void  Multiple_Read_ADXL345();                                  //連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)
  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. 不同的工作環(huán)境,需要調(diào)整此函數(shù),注意時鐘過快時需要修改
  62. 當改用1T的MCU時,請調(diào)整此延時函數(shù)
  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. 不同的工作環(huán)境,需要調(diào)整此函數(shù)
  73. 當改用1T的MCU時,請調(diào)整此延時函數(shù)
  74. **************************************/
  75. void Delay5ms()
  76. {
  77.     WORD n = 560;

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

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

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

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

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

  125.     return CY;
  126. }

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

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

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

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

  163. //******單字節(jié)寫入*******************************************

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

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


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

  213. //初始化ADXL345,根據(jù)需要請參考pdf進行修改************************
  214. void Init_ADXL345()
  215. {
  216.    Single_Write_ADXL345(0x31,0x0B);   //測量范圍,正負16g,13位模式
  217.    Single_Write_ADXL345(0x2C,0x08);   //速率設(shè)定為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 偏移量 根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  221.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  222.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  223. }

  224. //***********************************************************************
  225. //顯示x軸
  226. void display_x()
  227. {   
  228.     dis_data=(BUF[1]<<8)+BUF[0];  //合成數(shù)據(jù)   
  229.         
  230.         if(dis_data<30)           //靈敏度設(shè)置, 0 靈敏度最高
  231.         {
  232.                 aaa=1;
  233.         }
  234.         else
  235.         {
  236.                 if(aaa==1)
  237.                 {
  238.                         aaa=0;
  239.                         num1++;           //總步數(shù) 累加
  240.                         num2++;           //步數(shù) 累加
  241.                 }
  242.         }   
  243.         
  244.         conversion(num2);          //步數(shù)數(shù)據(jù)         
  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);          //總步數(shù)數(shù)據(jù)
  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;  //溫度值的整數(shù)和小數(shù)部分
  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);//讀出的數(shù)據(jù)為0XE5,表示正確
  280.   while(1)                          //循環(huán)
  281.           {
  282.                     Multiple_Read_ADXL345();       //連續(xù)讀出數(shù)據(jù),存儲在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;             //分離出溫度值整數(shù)部分
  301.                         decT = temp & 0xF;            //分離出溫度值小數(shù)部分
  302.                         len = IntToString(str, intT); //整數(shù)部分轉(zhuǎn)換為字符串
  303.                         str[len++] = '.';             //添加小數(shù)點
  304.                         decT = (decT*10) / 16;        //二進制的小數(shù)部分轉(zhuǎn)換為1位十進制位
  305.                         str[len++] = decT + '0';      //十進制小數(shù)位再轉(zhuǎn)換為ASCII字符
  306.                         while (len < 6)               //用空格補齊到6個字符長度
  307.                         {
  308.                             str[len++] = ' ';
  309.                         }
  310.                         str[len] = '\0';              //添加字符串結(jié)束符
  311.                         LcdShowStr(12, 0, str);        //“數(shù)字”顯示到液晶屏上
  312.                     }
  313.                     else                        //讀取失敗時,提示錯誤信息
  314.                     {
  315.                         LcdShowStr(10, 1, "error!");
  316.                     }
  317.                     Start18B20();               //重新啟動下一次轉(zhuǎn)換
  318.                 }
  319.         
  320.           }
  321. }

  322. /* 整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長度 */
  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)  //如果為負數(shù),首先取絕對值,并在指針上添加負號
  330.     {
  331.         dat = -dat;
  332.         *str++ = '-';
  333.         len++;
  334.     }
  335.     do {          //先轉(zhuǎn)換為低位在前的十進制數(shù)組
  336.         buf[i++] = dat % 10;
  337.         dat /= 10;
  338.     } while (dat > 0);
  339.     len += i;     //i最后的值就是有效字符的個數(shù)
  340.     while (i-- > 0)   //將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
  341.     {
  342.         *str++ = buf[i] + '0';
  343.     }
  344.     *str = '\0';  //添加字符串結(jié)束符
  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;      //定時器計數(shù)頻率
  354.     tmp = (tmp * ms) / 1000;  //計算所需的計數(shù)值
  355.     tmp = 65536 - tmp;        //計算定時器重載值
  356.     tmp = tmp + 12;           //補償中斷響應(yīng)延時造成的誤差
  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中斷服務(wù)函數(shù),完成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. }
復(fù)制代碼


評分

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

查看全部評分

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

使用道具 舉報

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

謝謝樓主分享!!
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

13#
ID:345799 發(fā)表于 2018-8-29 14:21 | 只看該作者
下載學(xué)習(xí)
回復(fù)

使用道具 舉報

14#
ID:519952 發(fā)表于 2019-4-24 16:45 | 只看該作者
  學(xué)習(xí)一波
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

謝謝樓主分享了
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

21#
ID:825327 發(fā)表于 2020-11-21 22:50 | 只看該作者
謝謝樓主!學(xué)習(xí)一下。
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色婷婷国产精品综合在线观看 | 一区二区三区四区电影 | 91久久 | 婷婷久久精品一区二区 | 国产精品久久午夜夜伦鲁鲁 | 欧洲精品一区 | 九九精品网 | 黄色在线观看 | 亚洲欧美成人影院 | 精品美女 | 亚洲视频一区在线观看 | 看真人视频一级毛片 | 精品日韩在线观看 | 在线欧美a | 天天干天天草 | 91国内视频在线 | 草比网站| 狠狠亚洲 | 天天爽综合网 | 日韩视频二区 | av电影一区二区 | 国产精品一区久久久 | 国产欧美精品在线 | 99久久免费精品国产男女高不卡 | 色橹橹欧美在线观看视频高清 | 欧美乱码精品一区二区三区 | 久久国产成人精品国产成人亚洲 | 午夜激情免费 | 久久精品天堂 | 天天干天天干 | 欧美色欧美亚洲另类七区 | 欧美一区二区在线观看 | 久久国产精品亚洲 | 成人在线一区二区 | 日韩第一页 | 日韩高清一区 | 国内自拍视频在线观看 | 国产电影一区 | 午夜男人视频 | 午夜天堂精品久久久久 | 成人精品一区二区三区中文字幕 |