找回密码
 立即注册

QQ登录

只需一步,快速开始

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

GY25的单片机源代码

[复制链接]
跳转到指定楼层
楼主
ID:366164 发表于 2018-7-6 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GY25源代码,简单实用,具体见附件

单片机源程序如下:
  1. //  GY25-51-1602
  2. //  使用单片机:STC89C52
  3. //  显示:lcd1602
  4. //  晶振:  11.0592 M(一定是11.0592m的)
  5. //  注意:请参考说明书焊上GY25焊点,或者串口修改GY25波特率9600掉电保存
  6. //  接线
  7. //  GY25    51MCU
  8. //   VCC-------5V
  9. //   GND-------GND
  10. //   TX--------RX(P3.0  PIN10)
  11. //   RX--------TX(P3.1  PIN11)
  12. //   LCD1602引脚请根据下面定义修改
  13. //  功能:GY25跟89c52 串口通信,lcd1602显示
  14. #include<REG52.H>       
  15. #include<math.h>       //Keil library  
  16. #include<stdio.h>      //Keil library       
  17. #include<INTRINS.H>
  18. #define uchar unsigned char
  19. #define uint  unsigned int       

  20. //   LCD1602引脚请根据下面定义修改
  21. #define DataPort P2           //LCD1602 数据端口       
  22. sbit    LCM_RS=P0^7;   //LCD1602 控制端口               
  23. sbit    LCM_RW=P0^6;   //LCD1602 控制端口       
  24. sbit    LCM_EN=P0^5;   //LCD1602 控制端口
  25.        
  26. //********定义函数*****************************
  27. void    delay(unsigned int k);
  28. void    InitLcd();
  29. void    WriteDataLCM(uchar dataW);
  30. void    WriteCommandLCM(uchar CMD,uchar Attribc);
  31. void    DisplayOneChar(uchar X,uchar Y,uchar DData);
  32. void    SeriPushSend(uchar send_data);
  33. //********定义变量*****************************
  34. uchar   BUF[10];          //数据缓存区
  35. uchar   cnt=0;           //接收数据的累计值
  36. uchar   sign=0;
  37. int YPR[3];
  38. //********定义函数*****************************
  39. void    delay(unsigned int k);
  40. void    SeriPushSend(uchar send_data);
  41. void           display(void);
  42. //*********************************************
  43. //串口中断
  44. void serial_serve(void) interrupt 4       
  45. {
  46.     if(RI==1){         //中断标志
  47.     RI=0;
  48.         BUF[cnt]=SBUF;       
  49.         if(cnt==0&&BUF[0]!=0xAA) return;      // 检查帧头     
  50.         cnt++;        //接收计数
  51.     if(cnt==8)                //
  52.     {   
  53.        cnt=0;                 //
  54.        sign=1;
  55.     }
  56.   }
  57.        
  58. }
  59. //*********************************************
  60. //串口初始化
  61. //9600 bps @ 11.059 MHz
  62. void init_uart()
  63. {
  64.         TMOD=0x21;                               
  65.         TH1=0xfd;                               
  66.         TL1=0xfd;                               
  67.         SCON=0x50;
  68.         PS=1;      //串口中断设为高优先级别
  69.         TR0=1;           //启动定时器                       
  70.         TR1=1;
  71.         ET0=1;     //打开定时器0中断                       
  72.         ES=1;       
  73. }

  74. //**********延时函数***************
  75. void delay(unsigned int k)       
  76. {                                               
  77.         unsigned int i,j;                               
  78.         for(i=0;i<k;i++)
  79.         {                       
  80.         for(j=0;j<121;j++)                       
  81.         {;}
  82.         }                                               
  83. }                                                           
  84. //*********串口数据发送******************
  85. void  SeriPushSend(uchar send_data)
  86. {
  87.     SBUF=send_data;  
  88.         while(!TI);TI=0;          
  89. }

  90. //*********LCD1602初始化**********************
  91. void InitLcd()                               
  92. {                       
  93.         WriteCommandLCM(0x38,1);       
  94.         WriteCommandLCM(0x08,1);       
  95.         WriteCommandLCM(0x01,1);
  96.         WriteCommandLCM(0x06,1);       
  97.         WriteCommandLCM(0x0c,1);
  98. }
  99. //**********检测忙信号************************
  100. void WaitForEnable(void)       
  101. {                                       
  102.         DataPort=0xff;               
  103.         LCM_RS=0;LCM_RW=1;_nop_();
  104.         LCM_EN=1;_nop_();_nop_();
  105.         while(DataPort&0x80);       
  106.         LCM_EN=0;                               
  107. }                                       
  108. //**********写命令至LCD***********************
  109. void WriteCommandLCM(uchar CMD,uchar Attribc)
  110. {                                       
  111.         if(Attribc)WaitForEnable();       
  112.         LCM_RS=0;LCM_RW=0;_nop_();
  113.         DataPort=CMD;_nop_();       
  114.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  115. }                                       
  116. //**********写数据至LCD************************
  117. void WriteDataLCM(uchar dataW)
  118. {                                       
  119.         WaitForEnable();               
  120.         LCM_RS=1;LCM_RW=0;_nop_();
  121.         DataPort=dataW;_nop_();       
  122.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  123. }                                       
  124. //*********写一个字符数据到指定的目标***********
  125. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  126. {                                               
  127.         Y&=1;                                               
  128.         X&=15;                                               
  129.         if(Y)X|=0x40;                                       
  130.         X|=0x80;                       
  131.         WriteCommandLCM(X,0);               
  132.         WriteDataLCM(DData);               
  133. }
  134.                                                            
  135. //******************************************************
  136. //*************************************
  137. void dis_play(uchar A,uchar B,int num)       
  138. {
  139.         if(num<0)
  140.         {
  141.                 num=-num;
  142.                 DisplayOneChar(A,B,('-'));
  143.         }
  144.         else
  145.             DisplayOneChar(A,B,('+'));

  146.     DisplayOneChar(++A,B,(0x30|(num/10000)));       
  147.         DisplayOneChar(++A,B,(0x30|(num%10000/1000)));
  148.         DisplayOneChar(++A,B,(0x30|(num%1000/100)));
  149.         DisplayOneChar(++A,B,(0x2e));
  150.         DisplayOneChar(++A,B,(0x30|(num%100/10)));
  151. //        DisplayOneChar(++A,B,(0x30|(num%10)));   //小数点后2位
  152. }

  153. //*******************数据接收并显示**********************
  154. void display(void)
  155. {
  156.   int YPR[3];
  157.   if(sign){
  158.        sign=0;                
  159.             if(BUF[0]==0XAA&&BUF[7]==0X55){                         //帧头判断   
  160.                                  
  161.           YPR[0]=(BUF[5]<<8|BUF[6]);  
  162.           YPR[1]=(BUF[3]<<8|BUF[4]);
  163.           YPR[2]=(BUF[1]<<8|BUF[2]);
  164.                        
  165.                      dis_play(2,1,YPR[0]);
  166.                      dis_play(10,1,YPR[1]);               
  167.                      dis_play(2,0,YPR[2]);                                   
  168.         }
  169.    }  
  170. }
  171. //*******************数据接收并显示**********************

  172. //***************************************
  173. //主程序
  174. void main()
  175. {
  176.    EA=0;  
  177.    delay(200);                                                      //延时               
  178.    InitLcd();                                                 //初始化LCD
  179.    init_uart();                                               //初始化串口
  180.    EA=1;                                                      //开总中断
  181.    cnt=0;   
  182.    DisplayOneChar(0,0,('Y'));
  183.    DisplayOneChar(1,0,(':'));
  184.    DisplayOneChar(0,1,('P'));
  185.    DisplayOneChar(1,1,(':'));
  186.    DisplayOneChar(8,1,('R'));
  187.    DisplayOneChar(9,1,(':'));

  188.    SeriPushSend(0XA5);
  189.    SeriPushSend(0X52); //发送欧拉角(默认50HZ)1帧读取命令。                                
  190.   
  191.   while(1){                                                   //循环  
  192.                                       
  193.    display();                                   
  194.    }                                                          //end while
  195. }
复制代码

所有资料51hei提供下载:
GY25.zip (38.14 KB, 下载次数: 32)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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