找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2622|回复: 0
打印 上一主题 下一主题
收起左侧

MMA7455电路原理图与单片机源程序等资料

[复制链接]
跳转到指定楼层
楼主
MMA7455电路原理图如下:


单片机源程序如下:
  1. /*
  2. * MMA7455模块
  3. *
  4. * 用途:MMA7455模块测试程序
  5. *
  6. * 作者                                        日期                                备注
  7. * Huafeng Lin                        2010/12/10                        新增
  8. * Huafeng Lin                        2011/08/13                        修改
  9. *
  10. */

  11. #include <reg52.h>
  12. #include <intrins.h>

  13. #define uchar unsigned char
  14. #define uint  unsigned int
  15. /***************************************************************************/
  16. /***********               单片机引脚定义                       ************/
  17. /***************************************************************************/
  18. //CS 接3.3V
  19. sbit sda=P0^6;              //I2C 数据传送位
  20. sbit scl=P0^7;              //I2C 时钟传送位
  21. //
  22. sbit rs=P0^3;                                //1602RS控制位
  23. sbit rw=P0^2;                                //1602RW控制位
  24. sbit e =P0^1;                                //1602E 控制位

  25. /******************************************************************************/
  26. /**********                     数据部分                            ***********/
  27. /******************************************************************************/
  28. #define IIC_READ  0x1D      //定义读指令
  29. #define IIC_WRITE 0x1D      //定义写指令

  30. uchar table1[16]=" MMA7455 X= 0.00";                //1602显示数据
  31. uchar table2[16]=" Y= 0.00 Z= 0.00";
  32. uchar table3[16]="No Find MMA7455!";
  33. uchar table4[10]="0123456789";
  34. uchar table5[8] =" MMA7455";
  35. uchar table7[16]="Value:   X=0.50 ";

  36. /**************************************************************************/
  37. /************                  各延时程序                    **************/
  38. /**************************************************************************/
  39. void iic_delay()        //5us延时
  40. {
  41.         _nop_();
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45. }

  46. void delay_50us(uint t)
  47. {
  48.     uchar j;
  49.         for(;t>0;t--)
  50.         for(j=19;j>0;j--);
  51. }

  52. void delay_50ms(uchar t)
  53. {
  54.     uint j;
  55.         for(;t>0;t--)
  56.         for(j=6245;j>0;j--);
  57. }

  58. /************************************************************************/
  59. /**************                  1602显示部分           *****************/
  60. /************************************************************************/
  61. void  write_com(uchar com)           //函数功能:写指令
  62. {
  63.   e=0;
  64.         rs=0;
  65.         rw=0;
  66.         P2=com;
  67.         delay_50us(10);
  68.         e=1;
  69.         delay_50us(20);
  70.         e=0;
  71. }

  72. void write_data(uchar dat)           //函数功能:写数据
  73. {
  74.     e=0;
  75.         rs=1;
  76.         rw=0;
  77.         P2=dat;
  78.         delay_50us(10);
  79.         e=1;
  80.         delay_50us(20);
  81.         e=0;
  82. }

  83. void init1602(void)                           //函数功能:初始化1602
  84. {
  85.     delay_50us(300);
  86.         write_com(0x38);
  87.         delay_50us(100);
  88.         write_com(0x38);
  89.         delay_50us(100);
  90.         write_com(0x38);
  91.         write_com(0x38);
  92.         write_com(0x01);
  93.         write_com(0x01);
  94.         write_com(0x06);
  95.         write_com(0x0c);
  96. }

  97. /*********************************************************************/
  98. /**************               I2C通信部分              ***************/
  99. /*********************************************************************/
  100. void iic_start()               //函数功能:I2C通信开始
  101. {
  102.         sda=1;
  103.     iic_delay();
  104.         scl=1;
  105.     iic_delay();
  106.         sda=0;
  107.         iic_delay();       
  108. }

  109. void iic_stop()                //函数功能:I2C通信停止
  110. {
  111.         sda=0;
  112.         iic_delay();
  113.         scl=1;
  114.         iic_delay();
  115.         sda=1;
  116.         iic_delay();       
  117. }

  118. void iic_ack()                 //函数功能:I2C通信查应答位
  119. {       
  120.   sda=1;
  121.         scl=1;
  122.         iic_delay();
  123.         scl=0;          
  124. }

  125. void iic_write_byte(uchar wdata)        //函数功能:向I2C从机写入一个字节
  126. {
  127.         uchar i,temp,temp1;
  128.        
  129.         temp1=wdata;
  130.         for(i=0;i<8;i++)
  131.         {
  132.                 scl = 0;
  133.                 iic_delay();
  134.                 temp=temp1;
  135.                 temp=temp&0x80;
  136.                 if(temp==0x80)
  137.                         sda=1;                               
  138.                 else
  139.                         sda=0;
  140.                 iic_delay();
  141.                 scl=1;
  142.                 iic_delay();
  143.                 scl=0;
  144.                 iic_delay();
  145.                 temp1=temp1<<1;                       
  146.         }
  147. }

  148. char iic_read_byte(void)        //函数功能:从I2C从机中读出一个字节
  149. {
  150.         uchar x;
  151.         char data_data;
  152.         for(x=0;x<8;x++)
  153.         {       
  154.                 data_data=data_data<<1;
  155.                 sda=1;
  156.                 iic_delay();
  157.                 scl=0;
  158.                 iic_delay();
  159.                 scl=1;
  160.                 iic_delay();
  161.                 if(sda==1)
  162.                         data_data|=0x01;
  163.                 //else  
  164.                 //   data_data&=0xfe;
  165.         }
  166.         return data_data;
  167. }

  168. void iic_write(uchar byte_add,uchar wdata)        //函数功能:按地址写入一字节数据
  169. {
  170.      uchar t;
  171.          t=(IIC_WRITE<<1);
  172.          iic_start();
  173.          iic_write_byte(t);
  174.          iic_ack();
  175.          iic_write_byte(byte_add);
  176.          iic_ack();
  177.          iic_write_byte(wdata);
  178.          iic_ack();
  179.          iic_stop();
  180. }

  181. char iic_read(uchar byte_add)        //函数功能:按地址读出一字节数据
  182. {
  183.      uchar t;
  184.          char x;
  185.          t=(IIC_WRITE<<1);
  186.          iic_start();
  187.          iic_write_byte(t);
  188.          iic_ack();
  189.          iic_write_byte(byte_add);
  190.          iic_ack();
  191.          t=((IIC_READ<<1)|0x01);
  192.          iic_start();
  193.          iic_write_byte(t);
  194.          iic_ack();
  195.          x=iic_read_byte();
  196.          iic_ack();
  197.          iic_stop();
  198.          return x;
  199. }

  200. /************************************************************************/
  201. /*************               LED显示阵列部分               **************/
  202. /************************************************************************/

  203. char self_test7455(void)                                         //函数功能:检测7455有没有插好
  204. {                                                                                 //          如果没有插好,1602将会显示
  205.         uchar j;                                                         //                         “No acceleration!"
  206.         char t;

  207.         delay_50us(10);
  208.         iic_write(0x16,0x05);
  209.         delay_50us(20);
  210.         t=iic_read(0x16);

  211.         if(t!=0x05)
  212.         {
  213.                 write_com(0x80);
  214.                 for(j=0;j<16;j++)
  215.                 {
  216.                     write_data(table3[j]);
  217.                         delay_50us(10);
  218.                 }               
  219.                 return 0;
  220.         }
  221.         return 1;
  222. }
  223. void Testinit1602()
  224. {
  225.         char  j;
  226.                 write_com(0x80);
  227.                 for(j=0;j<16;j++)
  228.                 {
  229.                     write_data(table1[j]);
  230.                         delay_50us(10);
  231.                 }
  232.                 write_com(0x80+0x40);
  233.                 for(j=0;j<16;j++)
  234.                 {
  235.                     write_data(table2[j]);
  236.                         delay_50us(10);
  237.                 }
  238. }

  239. void sendx()        //函数功能:向1602发送x轴测量数据
  240. {       
  241.         uchar x1,x2,x3,xsign;
  242.         char x;

  243.         x=iic_read(0x06);
  244.         if((x&0x80)==0x00)
  245.         {
  246.                 xsign=0x2b;        //+
  247.         }
  248.         else
  249.         {
  250.                 xsign=0x2d;        //-
  251.                 x=x-0x01;
  252.                 x=~x;
  253.         }

  254.         x1=(x/63);
  255.         x2=((x*100/63)%100)/10;
  256.         x3=(x*100/63)%10;

  257.         write_com(0x8B);
  258.         write_data(xsign);
  259.         delay_50us(10);
  260.         write_com(0x8C);
  261.         write_data(table4[x1]);
  262.         delay_50us(10);
  263.         write_com(0x8E);
  264.         write_data(table4[x2]);
  265.         delay_50us(10);
  266.         write_com(0x8F);
  267.         write_data(table4[x3]);
  268.         delay_50us(20);
  269. }

  270. void sendy()        //函数功能:向1602发送y轴测量数据
  271. {
  272.         uchar y1,y2,y3,ysign;
  273.         char y;

  274.         y=iic_read(0x07);
  275.         if((y&0x80)==0x00)
  276.         {
  277.                 ysign=0x2b;        //+
  278.         }
  279.         else
  280.         {
  281.                 ysign=0x2d;        //-
  282.                 y=y-0x01;
  283.                 y=~y;
  284.         }

  285.         y1=(y/63);
  286.         y2=((y*100/63)%100)/10;
  287.         y3=(y*100/63)%10;

  288.         write_com(0xC3);
  289.         write_data(ysign);
  290.         delay_50us(10);
  291.         write_com(0xC4);
  292.         write_data(table4[y1]);
  293.         delay_50us(10);
  294.         write_com(0xC6);
  295.         write_data(table4[y2]);
  296.         delay_50us(10);
  297.         write_com(0xC7);
  298.         write_data(table4[y3]);
  299.         delay_50us(20);
  300. }

  301. void sendz()        //函数功能:向1602发送z轴测量数据
  302. {
  303.         uchar z1,z2,z3,zsign;
  304.         char z;

  305.         z=iic_read(0x08);
  306.         if((z&0x80)==0x00)
  307.         {
  308.                 zsign=0x2b;        //+
  309.         }
  310.         else
  311.         {
  312.                 zsign=0x2d;        //-
  313.                 z=z-0x01;
  314.                 z=~z;
  315.         }

  316.         z1=(z/63);
  317.         z2=((z*100/63)%100)/10;
  318.         z3=(z*100/63)%10;

  319.         write_com(0xCB);
  320.         write_data(zsign);
  321.         delay_50us(10);
  322.         write_com(0xCC);
  323.         write_data(table4[z1]);
  324.         delay_50us(10);
  325.         write_com(0xCE);
  326.         write_data(table4[z2]);
  327.         delay_50us(10);
  328.         write_com(0xCF);
  329.         write_data(table4[z3]);
  330.         delay_50us(20);
  331. }

  332. /***********************************************************/
  333. /****************          主函数           ****************/
  334. /***********************************************************/

  335. void main()
  336. {
  337.         uchar j;

  338.         init1602();
  339.         self_test7455();

  340.         iic_write(0x10,0x15);//校正X值
  341.         iic_write(0x12,0x25);//校正Y值
  342.         iic_write(0x14,0x10);//校正Z值

  343.         delay_50ms(2);

  344.         write_com(0x80);
  345.         for(j=0;j<8;j++)
  346.         {
  347. ……………………

  348. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



所有资料51hei提供下载:
MMA7455模块.rar (729.26 KB, 下载次数: 16)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表