找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

帆板運動(adxl3+有字庫1268+51單片機+矩陣鍵盤)源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:220429 發(fā)表于 2017-7-19 15:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
帆板運動(adxl3+有字庫1268+51單片機+矩陣鍵盤)

下載:
帆板.docx (24.59 KB, 下載次數(shù): 13)


  1. /***************************************************************/
  2. #include<reg51.h>
  3. #include "control.h"
  4. #include "12864.h"
  5. #include "adxl.h"
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. sbit key=P2^3;
  9. void timer_init()
  10. {   
  11.   TMOD=0X10;  
  12.   TH1=(65535-100)/256;
  13.   TL1=(65535-100)%256;
  14.   EA=1;
  15.   ET1=1;
  16.   TR1=1;
  17. }  
  18. void main()
  19. {  
  20. char devid;
  21. timer_init();
  22. lcd_12864_init();
  23. Init_ADXL345();                  //初始化ADXL345  
  24. devid=Single_Read_ADXL345(0X00); //讀出的數(shù)據(jù)為0XE5,表示正確  
  25.   while(1)
  26.         {   
  27.          adxl345();   
  28.           if(key==0)  
  29.          keyscan_1();
  30.           else   
  31.          keyscan();   
  32.     }
  33. }   
  34.   /*********************************






  35. //  Controh.H文件
  36. #ifndef __contral_h_  
  37. #define __contral_h_
  38. extern signed char pwm;
  39. extern void delayms(unsigned int xms);          
  40. extern void keyscan();
  41. extern void keyscan_1();
  42. #endif







  43. //12864.H文件
  44. #ifndef __12864_h_  
  45. #define __12864_h_
  46. extern void lcd_writestring(unsigned char *str); //向lcd發(fā)送一個字符串,長度64字符之內。         /**/
  47. extern void write_12864_cmd(unsigned char cmd ); //向液晶寫數(shù)據(jù)
  48. extern void write_12864_data(unsigned char dat); //向液晶寫數(shù)據(jù)?
  49. extern void lcd_12864_init();//初始化液晶
  50. extern void write_12864_addr(unsigned char x,unsigned char y); //寫液晶的地址
  51. extern void delayms_12864(unsigned char xms); //延時函數(shù)
  52. extern void write_12864_addr(unsigned char x,unsigned char y);//寫液晶的地址
  53. #endif






  54. //ADXL.H文件
  55. #ifndef __ADXL_h_  
  56. #define __ADXL_h_

  57. extern void jiaodu();   //角度轉換          /**/
  58. extern void display_x();     //x軸           /**/
  59. extern void display_y();     //y軸           /**/
  60. extern void display_z();    //z軸           /**/
  61. extern void Init_ADXL345();     //延時函數(shù)  
  62. extern unsigned char Single_Read_ADXL345(unsigned char REG_Address);
  63. extern void Multiple_read_ADXL345(void);  /**/
  64. extern void adxl345();

  65. #endif






  66. //  Controh.H文件
  67. //#ifndef __contral_h_  
  68. //#define __contral_h_
  69. //extern signed char pwm;
  70. //extern void delayms(unsigned int xms);          
  71. //extern void keyscan();
  72. //extern void keyscan_1();
  73. //#endif
  74. /***************************************************************/
  75. // Control.C文件
  76. #include<reg51.h>
  77. #include "control.h"
  78. #include "12864.h"  
  79. #define uchar unsigned char
  80. #define uint unsigned int
  81. #define keydata P1
  82. sbit A1=P1^4;
  83. sbit A2=P1^5;
  84. sbit ENA=P1^6;
  85. signed int count=0;  
  86. signed char pwm=0;
  87. signed char anjian=0;
  88. uchar numshi=0;
  89. uchar numge=0;  
  90. void delayms(unsigned int xms)
  91. {   
  92.   unsigned int i,j;  
  93.   for(i=0;i<xms;i++)   
  94.   for(j=0;j<110;j++);  
  95. }   
  96. void pwm_dis()
  97. {   
  98.   numshi=pwm/10;
  99.   numge=pwm%10;  
  100.   write_12864_data(0x30+numshi);
  101.   write_12864_data(0x30+numge);  
  102. }   
  103. void anjian_dis()
  104. {   
  105.   numshi=anjian/10;
  106.   numge=anjian%10;  
  107.   write_12864_data(0x30+numshi);
  108.   write_12864_data(0x30+numge);
  109. }
  110. void keyscan()
  111. {   
  112.   unsigned char dat=0;
  113.   unsigned char num=0;   
  114.   keydata=0xfe;   
  115.   dat=keydata;   
  116.   dat=dat&0xf0;   
  117.   while(dat!=0xf0)   
  118.    {     
  119.      delayms(5);     
  120.          dat=keydata;   
  121.      dat=dat&0xf0;     
  122.          while(dat!=0xf0)   
  123.           {      
  124.             dat=keydata;   
  125.              switch(dat)      
  126.                   {      
  127.                     case 0xee:num=1;        
  128.                                   break;      
  129.                     case 0xde:num=2;        
  130.                                   break;      
  131.                     case 0xbe:num=3;      
  132.                               break;      
  133.                     case 0x7e:num=4;        
  134.                                   break;      
  135.                   }     
  136.              while(dat!=0xf0)     
  137.               {        
  138.                     dat=keydata;      
  139.                     dat=dat&0xf0;   
  140.               }           
  141.           }   
  142.     }     
  143.   keydata=0xfd;  
  144.   dat=keydata;
  145.   dat=dat&0xf0;   
  146.   while(dat!=0xf0)     
  147.    {      
  148.     delayms(5);     
  149.     dat=keydata;     
  150.     dat=dat&0xf0;      
  151.     while(dat!=0xf0)     
  152.          {      
  153.           dat=keydata;     
  154.           switch(dat)      
  155.            {      
  156.             case 0xed:num=5;        
  157.                       break;      
  158.             case 0xdd:num=6;         
  159.                           break;        
  160.                 case 0xbd:num=7;         
  161.                           break;        
  162.                 case 0x7d:num=8;         
  163.                           break;      
  164.            }      
  165.         while(dat!=0xf0)      
  166.           {        
  167.            dat=keydata;        
  168.            dat=dat&0xf0;      
  169.           }            
  170.          }     
  171.    }        
  172.     keydata=0xfb;   
  173.         dat=keydata;   
  174.         dat=dat&0xf0;   
  175.         while(dat!=0xf0)     
  176.          {      
  177.           delayms(5);      
  178.           dat=keydata;      
  179.           dat=dat&0xf0;      
  180.           while(dat!=0xf0)      
  181.            {      
  182.             dat=keydata;     
  183.           switch(dat)        
  184.            {
  185.                  case 0xeb:num=9;         
  186.                            break;        
  187.                  case 0xdb:num=10;         
  188.                            break;        
  189.                  case 0xbb:num=11;         
  190.                            break;        
  191.                  case 0x7b:num=12;         
  192.                            break;      
  193.            }      
  194.           while(dat!=0xf0)      
  195.            {        
  196.             dat=keydata;        
  197.                 dat=dat&0xf0;      
  198.                 }            
  199.            }     
  200.          }

  201.    
  202.   keydata=0xf7;   
  203.   dat=keydata;   
  204.   dat=dat&0xf0;   
  205.    while(dat!=0xf0)     
  206.     {      
  207.          delayms(5);      
  208.          dat=keydata;      
  209.          dat=dat&0xf0;      
  210.      while(dat!=0xf0)      
  211.       {      
  212.            dat=keydata;      
  213.          switch(dat)      
  214.           {        
  215.            case 0xe7:num=13;         
  216.                      break;        
  217.            case 0xd7:num=14;         
  218.                      break;        
  219.            case 0xb7:num=15;         
  220.                      break;        
  221.            case 0x77:num=16;         
  222.                      break;      
  223.           }      
  224.          while(dat!=0xf0)        
  225.           {
  226.            dat=keydata;        
  227.            dat=dat&0xf0;      
  228.           }            
  229.           }      
  230.         }
  231.   switch(num)  
  232.    {   
  233.     case 1:write_12864_addr(1,3);     
  234.                pwm=0;     
  235.                pwm_dis();     
  236.                break;   
  237.         case 2:write_12864_addr(1,3);     
  238.                pwm=10;     
  239.                pwm_dis();     
  240.                break;   
  241.         case 3:write_12864_addr(1,3);     
  242.                pwm=20;     
  243.            pwm_dis();     
  244.                break;   
  245.         case 4:write_12864_addr(1,3);     
  246.                    pwm=30;     
  247.                    pwm_dis();     
  248.                    break;
  249.                             
  250.         case 5:write_12864_addr(1,3);     
  251.                pwm=40;     
  252.                pwm_dis();     
  253.                break;   
  254.         case 6:write_12864_addr(1,3);     
  255.                pwm=50;     
  256.                pwm_dis();     
  257.                break;   
  258.         case 7:write_12864_addr(1,3);     
  259.                pwm=60;     
  260.                pwm_dis();     
  261.                break;
  262.         case 8:write_12864_addr(1,3);     
  263.                pwm=70;     
  264.                pwm_dis();      
  265.                break;
  266.     case 9:write_12864_addr(1,3);     
  267.                pwm=80;     
  268.                pwm_dis();     
  269.                break;           
  270.         case 10:write_12864_addr(1,3);     
  271.                 pwm=90;     
  272.                 pwm_dis();         
  273.                 break;  
  274.         case 11:write_12864_addr(1,3);         
  275.                 pwm=99;     
  276.                 pwm_dis();     
  277.                 break;   
  278.         case 12:write_12864_addr(1,3);         
  279.                 pwm=35;     
  280.                 pwm_dis();     
  281.                 break;   
  282.         case 13:write_12864_addr(1,3);     
  283.                 pwm=pwm+5;     
  284.                         pwm_dis();     
  285.                         break;   
  286.         case 14:write_12864_addr(1,3);         
  287.                 pwm=pwm-5;     
  288.                         pwm_dis();     
  289.                         break;   
  290.         case 15:write_12864_addr(1,3);   
  291.                 pwm=pwm+1;     
  292.                         pwm_dis();     
  293.                         break;   
  294.         case 16:write_12864_addr(1,3);     
  295.                 pwm=pwm-1;     
  296.                         pwm_dis();     
  297.                         break;   
  298.    }
  299. }  
  300. void keyscan_1()
  301. {   
  302.   unsigned char dat=0;   
  303.   unsigned char num=0;   
  304.    keydata=0xfe;   
  305.    dat=keydata;   
  306.    dat=dat&0xf0;   
  307.    while(dat!=0xf0)     
  308.     {      
  309.          delayms(5);      
  310.          dat=keydata;      
  311.          dat=dat&0xf0;      
  312.          while(dat!=0xf0)      
  313.           {      
  314.            dat=keydata;      
  315.          switch(dat)      
  316.           {        
  317.            case 0xee:num=1;         
  318.                      break;        
  319.            case 0xde:num=2;        
  320.                      break;        
  321.            case 0xbe:num=3;        
  322.                      break;        
  323.            case 0x7e:num=4;         
  324.                      break;      
  325.            }      
  326.          while(dat!=0xf0)      
  327.              {        
  328.                    dat=keydata;        
  329.                    dat=dat&0xf0;      
  330.                  }            
  331.           }     
  332.          }     
  333.         keydata=0xfd;   
  334.         dat=keydata;   
  335.         dat=dat&0xf0;   
  336.         while(dat!=0xf0)  
  337.           {
  338.             delayms(5);      
  339.                 dat=keydata;      
  340.                 dat=dat&0xf0;      
  341.                 while(dat!=0xf0)      
  342.                  {      
  343.                   dat=keydata;      
  344.                 switch(dat)      
  345.                  {        
  346.                   case 0xed:num=5;         
  347.                             break;        
  348.                   case 0xdd:num=6;         
  349.                             break;        
  350.                   case 0xbd:num=7;         
  351.                             break;        
  352.                   case 0x7d:num=8;         
  353.                             break;      
  354.                  }      
  355.                 while(dat!=0xf0)      
  356.                  {        
  357.                   dat=keydata;        
  358.                   dat=dat&0xf0;      
  359.                  }            
  360.                 }      
  361.         }      
  362.    keydata=0xfb;   
  363.    dat=keydata;   
  364.    dat=dat&0xf0;   
  365.     while(dat!=0xf0)     
  366.          {      
  367.           delayms(5);      
  368.           dat=keydata;      
  369.           dat=dat&0xf0;      
  370.         while(dat!=0xf0)      
  371.          {      
  372.           dat=keydata;      
  373.         switch(dat)      
  374.          {        
  375.           case 0xeb:num=9;         
  376.                     break;         
  377.           case 0xdb:num=10;
  378.                     break;        
  379.           case 0xbb:num=11;         
  380.                     break;        
  381.           case 0x7b:num=12;        
  382.                     break;      
  383.          }      
  384.         while(dat!=0xf0)      
  385.          {        
  386.           dat=keydata;        
  387.           dat=dat&0xf0;      
  388.          }           
  389.     }     
  390.    }      
  391.   keydata=0xf7;   
  392.   dat=keydata;   
  393.   dat=dat&0xf0;   
  394.   while(dat!=0xf0)     
  395.    {      
  396.     delayms(5);      
  397.     dat=keydata;      
  398.         dat=dat&0xf0;      
  399.         while(dat!=0xf0)      
  400.          {      
  401.           dat=keydata;      
  402.         switch(dat)      
  403.          {        
  404.           case 0xe7:num=13;         
  405.                     break;        
  406.           case 0xd7:num=14;         
  407.                     break;        
  408.           case 0xb7:num=15;         
  409.                     break;        
  410.           case 0x77:num=16;         
  411.                     break;      
  412.           }      
  413.         while(dat!=0xf0)      
  414.          {        
  415.           dat=keydata;        
  416.           dat=dat&0xf0;        
  417.          }
  418.         }   
  419.    }            
  420.     switch(num)   
  421.          {   
  422.           case 1:write_12864_addr(3,7);     
  423.                  anjian=0;     
  424.                          anjian_dis();     
  425.                          break;   
  426.           case 2:write_12864_addr(3,7);     
  427.                  anjian=10;     
  428.                          anjian_dis();     
  429.                          break;   
  430.           case 3:write_12864_addr(3,7);     
  431.                  anjian=20;     
  432.                          anjian_dis();     
  433.                          break;   
  434.           case 4:write_12864_addr(3,7);     
  435.                  anjian=30;     
  436.                          anjian_dis();     
  437.                          break;   
  438.           case 5:write_12864_addr(3,7);     
  439.                  anjian=40;     
  440.                          anjian_dis();     
  441.                          break;   
  442.           case 6:write_12864_addr(3,7);     
  443.                  anjian=50;     
  444.                          anjian_dis();     
  445.                          break;   
  446.           case 7:write_12864_addr(3,7);     
  447.                  anjian=60;     
  448.                          anjian_dis();     
  449.                          break;   
  450.           case 8:write_12864_addr(3,7);     
  451.                  anjian=anjian+1;     
  452.                          anjian_dis();     
  453.                          break;   
  454.           case 9:write_12864_addr(3,7);      
  455.                  anjian=anjian+2;
  456.              anjian_dis();     
  457.                          break;   
  458.           case 10:write_12864_addr(3,7);     
  459.                   anjian=anjian+3;     
  460.                           anjian_dis();         
  461.                           break;   
  462.           case 11:write_12864_addr(3,7);         
  463.                   anjian=anjian+4;     
  464.                           anjian_dis();     
  465.                           break;   
  466.           case 12:write_12864_addr(3,7);         
  467.                   anjian=anjian+5;     
  468.                           anjian_dis();     
  469.                           break;   
  470.           case 13:write_12864_addr(3,7);         
  471.                   anjian=anjian+6;     
  472.                           anjian_dis();     
  473.                           break;   
  474.           case 14:write_12864_addr(3,7);         
  475.                   anjian=anjian+7;     
  476.                           anjian_dis();      
  477.                           break;   
  478.           case 15:write_12864_addr(3,7);     
  479.                   anjian=anjian+8;   
  480.                           anjian_dis();     
  481.                           break;   
  482.           case 16:write_12864_addr(3,7);     
  483.                   anjian=anjian+9;     
  484.                           anjian_dis();      
  485.                           break;     
  486.         }   
  487.    }
  488. void timer0() interrupt 3
  489. {   
  490.   A1=1;  
  491.   A2=0;   
  492.   TH1=(65535-100)/256;  
  493.   TL1=(65535-100)%256;  
  494.   count++;   
  495.   if(count>=100)  
  496.      count=0;   
  497.   if(count<pwm)  
  498.     {   
  499.           ENA=1;  
  500.          }  
  501.   else   
  502.       ENA=0;  
  503. }










  504. /***********************************************************
  505. ******************12864.C文件*******************************
  506.           12864指令:
  507. 0x01/將DDRAM填滿“20H”,并且設定DDRAM的地址計數(shù)器(AC)到“00H”
  508. 0x02//設定DDRAM的地址計數(shù)器(AC)到“00H”,并且將游標移到開頭原點位置;這個指令并不改變DDRAM的內容
  509. 0x04//讀寫后,AC減一,向左寫
  510. 0x06//讀寫后,AC加一,向右寫
  511. 0x10//光標向左移動,AC減一
  512. 0x14//光標向右移動,AC加一
  513. 0x18//顯示向左移動,光標跟著移動
  514. 0x1c//顯示向右移動,光標跟著移動
  515. 0x0c//整體顯示開,游標關,游標位置反白不允許
  516. 0x0e//整體顯示開,游標開,游標位置反白不允許
  517. 0x0f//整體顯示開,游標開,游標位置反白允許
  518. 0x08//關顯示,關光標,關光標閃爍
  519. 0x30//8位數(shù)據(jù)端口,基本指令操作
  520. 0x34//8位數(shù)據(jù)總線,擴展指令集
  521. 0x20//4位數(shù)據(jù)總線,基本指令集
  522. 0x24//4位數(shù)據(jù)總線,擴展指令集
  523. **************************************************************/

  524. #include<reg51.h>
  525. #include"12864.h"
  526. #include"control.h"
  527. #define lcd_data P0 //定義液晶數(shù)據(jù)端口
  528. sbit lcd_PSB=P3^7; //液晶串行數(shù)據(jù)和并行數(shù)據(jù)選擇端
  529. sbit lcd_EN=P2^7; //液晶en使能端
  530. sbit lcd_RS=P2^6;//液晶的rs
  531. sbit lcd_RW=P2^5; //液晶的rw讀寫端口

  532. void delayms_12864(unsigned char xms) //延時函數(shù)
  533. {
  534.   unsigned char i,j;
  535.   for(i=0;i<xms;i++)
  536.   for(j=0;j<110;j++);
  537. }
  538. bit check_12864_busy()//檢測液晶忙不忙
  539. {
  540.   bit result=0;
  541.   lcd_RS=0;
  542.   lcd_RW=1;   
  543.   lcd_EN=1;   
  544.   delayms_12864(3);   
  545.   result=(bit)(lcd_data&0x80);  //取出數(shù)據(jù)端口的最高位   
  546.   lcd_EN=0;   
  547.   return result;  
  548.   }  
  549. void write_12864_cmd(unsigned char cmd )   //寫指令
  550. {   
  551.   while(check_12864_busy());    //檢測液晶忙不忙   
  552.   lcd_RS=0;      //rs=0為寫命令  
  553.   lcd_EN=0;  
  554.   lcd_RW=0;   
  555.   lcd_data=cmd;    //把指令給數(shù)據(jù)端口  
  556.   delayms_12864(1);  
  557.   lcd_EN=1;   
  558.   delayms_12864(1);  
  559.   lcd_EN=0;  
  560. }   
  561. void write_12864_data(unsigned char dat) //向液晶寫數(shù)據(jù)  
  562. {   
  563.   while(check_12864_busy());    //檢測液晶忙不忙   
  564.   lcd_RS=1;    //rs=1為寫數(shù)據(jù)  
  565.   lcd_EN=0;  
  566.   lcd_RW=0;   
  567.   lcd_data=dat;   //把數(shù)據(jù)給數(shù)據(jù)端口  
  568.   delayms_12864(1);  
  569.   lcd_EN=1;   
  570.   delayms_12864(1);  
  571.   lcd_EN=0;  
  572. }            
  573. void lcd_12864_init()    //初始化液晶
  574. {   
  575.   lcd_PSB=1;   
  576.   write_12864_cmd(0x30);  
  577.   delayms_12864(5);   
  578.   write_12864_cmd(0x0c);  
  579.   delayms_12864(5);   
  580.   write_12864_cmd(0x01);  
  581.   delayms_12864(5);
  582.   }
  583. void write_12864_addr(unsigned char x,unsigned char y)//寫液晶的地址
  584. {
  585.   unsigned char addr;
  586.   if(x==0) //如果x=0,地址為液晶第一行
  587.     {x=0x80;}
  588.   else if(x==1) //如果x=1,地址為液晶第二行
  589.     {x=0x90;}
  590.   else if(x==2) //如果x=2,地址為液晶第三行
  591.     {x=0x88;}
  592.   else if(x==3) //如果x=3,地址為液晶第四行
  593.     {x=0x98;}
  594.   addr=x+y;
  595.   write_12864_cmd(addr);
  596. }

















  597. //ADXL.C 文件
  598. #include <reg51.H>
  599. #include <math.h>   //Keil library
  600. #include <stdio.h>  //Keil library
  601. #include <intrins.h>
  602. #include "12864.h"
  603.   
  604. #define uchar unsigned char
  605. #define uint unsigned int
  606. #define DataPort P1 //LCD1602數(shù)據(jù)端口
  607. sbit SCL=P2^0; //IIC時鐘引腳定義
  608. sbit SDA=P2^1; //IIC數(shù)據(jù)引腳定義
  609. sbit LED=P2^2;
  610. #define SlaveAddress 0xA6 //定義器件在IIC總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
  611. //ALT ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A
  612. typedef unsigned char BYTE;
  613. typedef unsigned short WORD;

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

  617. void delay(unsigned int k);
  618. void InitLcd(); //初始化lcd1602
  619. void Init_ADXL345(void); //初始化ADXL345

  620. void WriteDataLCM(uchar dataW);
  621. void WriteCommandLCM(uchar CMD,uchar Attribc);
  622. void DisplayOneChar(uchar X,uchar Y,uchar DData);         /**/
  623. void conversion(uint temp_data);

  624. void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //單個寫入數(shù)據(jù)
  625. uchar Single_Read_ADXL345(uchar REG_Address); //單個讀取內部寄存器數(shù)據(jù)
  626. void Multiple_Read_ADXL345();

  627. //連續(xù)的讀取內部寄存器數(shù)據(jù)
  628. void Delay5us();
  629. void Delay5ms();
  630. void ADXL345_Start();
  631. void ADXL345_Stop();
  632. void ADXL345_SendACK(bit ack);
  633. bit ADXL345_RecvACK();
  634. void ADXL345_SendByte(BYTE dat);
  635. BYTE ADXL345_RecvByte();

  636. void ADXL345_ReadPage();
  637. void ADXL345_WritePage();
  638.   float tempz;
  639.   float tempy;
  640.   float tempx;
  641.   uchar tab[]="度";
  642.   uchar tab1[]="偏轉";
  643.   uchar tab2[]="風力";
  644.   uchar tab3[]="輸入";

  645. void conversion(uint temp_data)
  646. {
  647.   wan=temp_data/10000+0x30;
  648.    temp_data=temp_data%10000; //取余運算
  649.   qian=temp_data/1000+0x30;
  650.    temp_data=temp_data%1000;//取余運算
  651.   bai=temp_data/100+0x30;
  652.    temp_data=temp_data%100;//取余運算
  653.    shi=temp_data/10+0x30;
  654.    temp_data=temp_data%10; //取余運算
  655.    ge=temp_data+0x30;
  656. }

  657. //void DisplayOneChar(uchar DData)  /**/
  658. // {
  659. //  Y&=1;
  660. //  X&=15;
  661. //  if(Y)X|=0x40;
  662. //  X|=0x80;
  663. //  write_12864_addr(X,0);
  664. //  write_12864_data(DData);          /*這一段*/
  665. // }

  666. /****延時5微秒(STC90C52RC@12M)
  667. 不同的工作環(huán)境,需要調整此函數(shù),
  668. 注意時鐘過快時需要修改,當改用1
  669. T的MCU時,請調整此延時函數(shù)
  670. ***********/
  671. void Delay5us()
  672. {
  673.    _nop_();
  674.    _nop_();
  675.    _nop_();
  676.    _nop_();
  677.    _nop_();
  678.    _nop_();
  679.    _nop_();
  680.    _nop_();
  681.    _nop_();
  682.    _nop_();
  683.    _nop_();
  684.    _nop_();
  685. }
  686. /*延時5毫秒(STC90C52RC@12M)不同
  687. 的工作環(huán)境,需要調整此函數(shù)當改用
  688. 1T的MCU時,請調整此延時函數(shù)*/
  689. void Delay5ms()
  690. {
  691.    WORD n=560;
  692.    while(n--);
  693. }
  694. /*起始信號*/
  695. void ADXL345_Start()
  696. {
  697.    SDA=1;//拉高數(shù)據(jù)線
  698.    SCL=1;//拉高時鐘線
  699.    Delay5us();//延時
  700.    SDA=0;//產生下降沿
  701.    Delay5us();//延時
  702.    SCL=0;//拉低時鐘線
  703. }
  704. /**停止信號**/
  705. void ADXL345_Stop()
  706. {
  707.   SDA=0;//拉低數(shù)據(jù)線
  708.   SCL=1;//拉高時鐘線
  709.   Delay5us();//延時
  710.   SDA=1;//產生上升沿
  711.   Delay5us();//延時
  712. }

  713. /*發(fā)送應答信號
  714. 入口參數(shù):ack(0:ACK 1:NAK)
  715. *************************/
  716. void ADXL345_SendACK(bit ack)
  717. {
  718.   SDA=ack;//寫應答信號
  719.   SCL=1;//拉高時鐘線
  720.   Delay5us();//延時
  721.   SCL=0;//拉低時鐘線
  722.   Delay5us();//延時
  723. }

  724. //void ADXL345_SendACK(bit ack)
  725. // {
  726. //  SDA=ack; //寫應答信號
  727. //  SCL=1;//拉高時鐘線
  728. //  Delay5us();//延時
  729. //  SCL=0;//拉低時鐘線
  730. //  Delay5us();//延時
  731. //  }
  732. /*接收應答信號*/
  733. bit ADXL345_RecvACK()
  734.   {
  735.    SCL=1; //拉高時鐘線
  736.    Delay5us();//延時?
  737.    CY=SDA; //讀應答信號
  738.    SCL=0;//拉低時鐘線
  739.    Delay5us(); //延時
  740.    return CY;
  741.    }

  742. /*向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)**/
  743. void ADXL345_SendByte(BYTE dat)
  744.   {
  745.     BYTE i;
  746.      for(i=0;i<8;i++)//8位計數(shù)器
  747.           {
  748.         dat<<=1;//移出數(shù)據(jù)的最高位
  749.                 SDA=CY;//送數(shù)據(jù)口
  750.                 SCL=1;//拉高時鐘線
  751.                 Delay5us();//延時
  752.         SCL=0;//拉低時鐘線
  753.                 Delay5us();//延時
  754.                 }
  755. ADXL345_RecvACK();
  756. }

  757. /*從IIC總線接收一個字節(jié)數(shù)據(jù)*/
  758. BYTE ADXL345_RecvByte()
  759. {
  760.   BYTE i;
  761.   BYTE dat=0;
  762.   SDA=1;//使能內部上拉,準備讀取數(shù)據(jù),
  763.   for(i=0;i<8;i++) //8位計數(shù)器
  764.   {
  765.    dat<<=1;
  766.    SCL=1;//拉高時鐘線
  767.    Delay5us();//延時
  768.    dat|=SDA;//讀數(shù)據(jù)
  769.    SCL=0;//拉低時鐘線
  770.    Delay5us();//延時
  771.    }
  772. return dat;
  773.    }

  774. /*單字節(jié)寫入*/
  775. void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
  776. {
  777.    ADXL345_Start();//起始信號
  778.    ADXL345_SendByte(SlaveAddress);//發(fā)送設備地址+寫信號
  779.    ADXL345_SendByte(REG_Address);//內部寄存器地址,請參考中文pdf22頁
  780.    ADXL345_SendByte(REG_data);//內部寄存器數(shù)據(jù),請參考中文pdf22頁
  781.    ADXL345_Stop();//發(fā)送停止信號
  782. }

  783. /*單字節(jié)讀取*/
  784. uchar Single_Read_ADXL345(uchar REG_Address)
  785. { uchar REG_data;
  786.     ADXL345_Start(); //起始信號
  787.     ADXL345_SendByte(SlaveAddress);//發(fā)送設備地址+寫信號
  788.     ADXL345_SendByte(REG_Address);//發(fā)送存儲單元地址,從0開始
  789.         ADXL345_Start(); //起始信號
  790.     ADXL345_SendByte(SlaveAddress+1);//發(fā)送設備地址+讀信號
  791.     REG_data=ADXL345_RecvByte(); //讀出寄存器數(shù)據(jù)
  792.         ADXL345_SendACK(1);
  793.     ADXL345_Stop();//停止信號
  794.         return REG_data;
  795.         }


  796. /*連續(xù)讀出ADXL345內部加速度數(shù)據(jù),地址范圍0x32~0x37*/
  797. void Multiple_read_ADXL345(void)
  798. {
  799.   uchar i;
  800.   ADXL345_Start();//起始信號
  801.   ADXL345_SendByte(SlaveAddress);//發(fā)送設備地址+寫信號
  802.   ADXL345_SendByte(0x32);//發(fā)送存儲單元地址,從0x32開始
  803.   ADXL345_Start();//起始信號
  804.   ADXL345_SendByte(SlaveAddress+1);//發(fā)送設備地址+讀信號
  805.   for(i=0;i<6;i++)//連續(xù)讀取6個地址數(shù)據(jù),存儲中BUF
  806.    {
  807.      BUF[i]=ADXL345_RecvByte();//BUF[0]存儲0x32地址中的數(shù)據(jù)
  808.      if(i==5)
  809.            {
  810.          ADXL345_SendACK(1); //最后一個數(shù)據(jù)需要回NOACK
  811.              }
  812.          else
  813.          {
  814.       ADXL345_SendACK(0);//回應ACK
  815.            }
  816.           }
  817.       ADXL345_Stop(); //停止信號
  818.           Delay5ms();
  819.          }

  820. /**初始化ADXL345,根據(jù)需要請參考pdf進行修改*/
  821. void Init_ADXL345()
  822. {
  823.    Single_Write_ADXL345(0x31,0x0B); //測量范圍,正負16g,13位模式
  824.    Single_Write_ADXL345(0x2C,0x08);  //速率設定為12.5參考pdf13頁
  825.    Single_Write_ADXL345(0x2D,0x08);//選擇電源模式 參考pdf24頁
  826.    Single_Write_ADXL345(0x2E,0x80); //使能DATA_READY中斷
  827.    Single_Write_ADXL345(0x1E,0x00); //X偏移量,根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  828.    Single_Write_ADXL345(0x1F,0x00);  //Y偏移量,根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  829.    Single_Write_ADXL345(0x20,0x05); //Z偏移量,根據(jù)測試傳感器的狀態(tài)寫入pdf29頁
  830. }
  831. /*顯示x軸*/
  832. void display_x()
  833. {
  834.   float tempx;          /**/
  835.   dis_data=(BUF[1]<<8)+BUF[0]; //合成數(shù)據(jù)
  836.   if(dis_data<0)
  837.    {
  838.      dis_data=-dis_data;
  839.          write_12864_addr(2,1);
  840.      write_12864_data('-');//顯示正負符號位
  841.         }
  842.    else
  843.     {
  844.       write_12864_addr(2,1);
  845.       write_12864_data(' ');//顯示空格
  846.          }
  847.    tempx=(float)dis_data*3.9;//計算數(shù)據(jù)和顯示,查考ADXL345快速入門第4頁
  848.    conversion(tempx);//轉換出顯示需要的數(shù)據(jù)
  849.    write_12864_addr(2,0);
  850.    write_12864_data('X');
  851.    write_12864_data(':');
  852.    write_12864_addr(2,2);
  853.    write_12864_data(qian);
  854.    write_12864_data('.');
  855.    write_12864_addr(2,3);
  856.    write_12864_data(bai);
  857.    write_12864_data(shi);
  858. //   write_12864_addr(2,3);                /***/
  859. //   DisplayOneChar(' ');                /**/
  860.    }
  861. /*顯示y軸*/
  862. void display_y()
  863. {
  864.    float tempy;  /**/
  865.    dis_data=(BUF[3]<<8)+BUF[2];//合成數(shù)據(jù)
  866.    if(dis_data<0)
  867.      {
  868.        dis_data=-dis_data;
  869.            write_12864_addr(2,5);
  870.        write_12864_data('-');//顯示正負符號位
  871.            }
  872.         else
  873.          {
  874.       write_12864_addr(2,5);
  875.       write_12864_data(' ');//顯示空格
  876.           }
  877.    tempy=(float)dis_data*3.9;//計算數(shù)據(jù)和顯示,查考ADXL345快速入門第4頁
  878.    conversion(tempy);//轉換出顯示需要的數(shù)據(jù)
  879.    write_12864_addr(2,4);
  880.    write_12864_data('Y');//第1行,第0列顯示y
  881.    write_12864_data(':');
  882.    write_12864_addr(2,6);
  883.    write_12864_data(qian);
  884.    write_12864_data('.');
  885.    write_12864_addr(2,7);
  886.    write_12864_data(bai);
  887.    write_12864_data(shi);
  888. //   write_12864_addr(2,7);/**/
  889. //   DisplayOneChar(' ');        /**/
  890.   }
  891. /*顯示z軸*/
  892. void display_z()
  893. {   
  894. //  float temp; /**/
  895.   dis_data=(BUF[5]<<8)+BUF[4];//合成數(shù)據(jù)     
  896.    if(dis_data<0)
  897.   {   
  898.   dis_data=-dis_data;
  899.   write_12864_addr(3,1);
  900.   write_12864_data('-'); //顯示負符號位
  901.   }
  902.    else   
  903.     {  
  904.           write_12864_addr(3,1);
  905.           write_12864_data(' ');  //顯示空格  

  906.    tempz=(float)dis_data*3.9;//計算數(shù)據(jù)和顯示,查考ADXL345快速入門第4頁
  907.    conversion(tempz); //轉換出顯示需要的數(shù)據(jù)
  908.    write_12864_addr(3,0);
  909.    write_12864_data('Z');//第0行,第10列?顯示Z
  910.    write_12864_data(':');
  911.    write_12864_addr(3,2);
  912.    write_12864_data(qian);
  913.    write_12864_data('.');
  914.    write_12864_addr(3,3);
  915.    write_12864_data(bai);
  916.    write_12864_data(shi);
  917. //   write_12864_addr(3,4);         /**/
  918. //   DisplayOneChar(' ');        /**/
  919.    }
  920.    }
  921. //void adxl()           /*這一段*/
  922. // {
  923. //   uchar devid;
  924. //   uchar i,j;
  925. //   float w;
  926. //   delay(500);
  927. //   Init_ADXL345();//初始化ADXL345
  928. //   devid=Single_Read_ADXL345(0X00);
  929. //    } /*這一段*/
  930. void jiaodu()
  931. {
  932.   uchar i,j,k;
  933.   float w;
  934.   w=(180*atan(tempz/tempx))/3.14;
  935.   if(w>=41&&w<=49)
  936.     {
  937.           LED=0;
  938.          }
  939.   else
  940.    LED=1;
  941.    conversion(w);
  942.    write_12864_addr(1,4);
  943.     {
  944.          for(j=0;tab1[j]!='\0';j++)
  945.          write_12864_data(tab1[j]);
  946.          }
  947.     write_12864_addr(1,6);
  948.         write_12864_data(shi);
  949.         write_12864_data(ge);
  950.         write_12864_addr(1,7);
  951.          {
  952.           for(i=0;tab[i]!='\0';i++)
  953.           write_12864_data(tab[i]);
  954.          }
  955.         write_12864_addr(3,4);
  956.          {
  957.           for(k=0;tab2[k]!='\0';k++)
  958.           write_12864_data(tab2[k]);
  959.           }
  960.         write_12864_addr(1,0);
  961.          {
  962.           for(k=0;tab3[k]!='\0';k++)
  963.           write_12864_data(tab3[k]);
  964.           }
  965.          }

  966. void adxl345()
  967. {
  968.    Multiple_Read_ADXL345();//連續(xù)讀出數(shù)據(jù),存儲在BUF中
  969.    display_x();//---------顯示X軸
  970.    display_y();//---------顯示Y軸
  971.    display_z();//---------顯示Z軸
  972. //   delay(200); /**/
  973.    jiaodu();
  974.    }

復制代碼


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

使用道具 舉報

沙發(fā)
ID:221046 發(fā)表于 2017-7-20 14:26 | 只看該作者
有仿真嗎?
回復

使用道具 舉報

板凳
ID:221458 發(fā)表于 2017-7-23 21:44 | 只看該作者
這個是電賽的程序?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表