找回密码
 立即注册

QQ登录

只需一步,快速开始

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

GY-26电子指南针资料(串口+IIC+温度源程序)

[复制链接]
跳转到指定楼层
楼主
如题 我只想下个别的资料但是积分不够,程序有51单片机版本的和pic单片机的


所有资料51hei提供下载:
GY-26电子指南针模块电子罗盘模块+机器人配件送资料.rar (628.2 KB, 下载次数: 48)

单片机源程序如下:
  1. //  GY-26电子指南针模块测试程序
  2. //  使用单片机:STC89C52
  3. //  晶振:  11.0592 M
  4. //  液晶屏:LCD1602
  5. #include<REG52.H>       
  6. #include<math.h>       //Keil library  
  7. #include<stdio.h>      //Keil library       
  8. #include<INTRINS.H>
  9. #define uchar unsigned char
  10. #define uint  unsigned int       
  11. #define DataPort P0           //LCD1602 数据端口       
  12. sbit    LCM_RS=P2^0;   //LCD1602 控制端口               
  13. sbit    LCM_RW=P2^1;   //LCD1602 控制端口       
  14. sbit    LCM_EN=P2^2;   //LCD1602 控制端口
  15. sbit    KEY_1 =P2^6;
  16. sbit    KEY_2 =P2^5;
  17. sbit    KEY_3 =P2^4;
  18. sbit    KEY_4 =P2^3;       
  19. //********定义变量*****************************
  20. uchar   BUF[8];        //数据缓存区
  21. uchar   cnt;           //接收数据的累计值
  22. //********定义函数*****************************
  23. void    delay(unsigned int k);
  24. void    InitLcd();
  25. void    WriteDataLCM(uchar dataW);
  26. void    WriteCommandLCM(uchar CMD,uchar Attribc);
  27. void    DisplayOneChar(uchar X,uchar Y,uchar DData);
  28. void    SeriPushSend(uchar send_data);
  29. void    ReadKey(void);
  30. void         display(void);
  31. //*********************************************
  32. //串口中断
  33. void serial_serve(void) interrupt 4       
  34. {
  35.   if(RI==1){
  36.     RI=0;
  37.     BUF[cnt]=SBUF;
  38.         cnt++;
  39. //        if(cnt==7)flag=1;
  40.   }
  41. }
  42. //*********************************************
  43. //串口初始化
  44. //9600 bps @ 11.059 MHz
  45. void init_uart()
  46. {
  47.         TMOD=0x21;                               
  48.         TH1=0xfd;                               
  49.         TL1=0xfd;                               
  50.         SCON=0x50;
  51.         PS=1;      //串口中断设为高优先级别
  52.         TR0=1;           //启动定时器                       
  53.         TR1=1;
  54.         ET0=1;     //打开定时器0中断                       
  55.         ES=1;       
  56. }
  57. //*********LCD1602初始化**********************
  58. void InitLcd()                               
  59. {                       
  60.         WriteCommandLCM(0x38,1);       
  61.         WriteCommandLCM(0x08,1);       
  62.         WriteCommandLCM(0x01,1);
  63.         WriteCommandLCM(0x06,1);       
  64.         WriteCommandLCM(0x0c,1);
  65. }
  66. //**********检测忙信号************************
  67. void WaitForEnable(void)       
  68. {                                       
  69.         DataPort=0xff;               
  70.         LCM_RS=0;LCM_RW=1;_nop_();
  71.         LCM_EN=1;_nop_();_nop_();
  72.         while(DataPort&0x80);       
  73.         LCM_EN=0;                               
  74. }                                       
  75. //**********写命令至LCD***********************
  76. void WriteCommandLCM(uchar CMD,uchar Attribc)
  77. {                                       
  78.         if(Attribc)WaitForEnable();       
  79.         LCM_RS=0;LCM_RW=0;_nop_();
  80.         DataPort=CMD;_nop_();       
  81.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  82. }                                       
  83. //**********写数据至LCD************************
  84. void WriteDataLCM(uchar dataW)
  85. {                                       
  86.         WaitForEnable();               
  87.         LCM_RS=1;LCM_RW=0;_nop_();
  88.         DataPort=dataW;_nop_();       
  89.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  90. }                                       
  91. //*********写一个字符数据到指定的目标***********
  92. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  93. {                                               
  94.         Y&=1;                                               
  95.         X&=15;                                               
  96.         if(Y)X|=0x40;                                       
  97.         X|=0x80;                       
  98.         WriteCommandLCM(X,0);               
  99.         WriteDataLCM(DData);               
  100. }
  101. //**********延时函数***************
  102. void delay(unsigned int k)       
  103. {                                               
  104.         unsigned int i,j;                               
  105.         for(i=0;i<k;i++)
  106.         {                       
  107.         for(j=0;j<121;j++)                       
  108.         {;}
  109.         }                                               
  110. }                                                           
  111. //*********串口数据发送******************
  112. void  SeriPushSend(uchar send_data)
  113. {
  114.     SBUF=send_data;  
  115.         while(!TI);TI=0;          
  116. }
  117. //*********按键检测**********************
  118. void ReadKey(void)
  119. {

  120.     EA=0;
  121.     if(KEY_1==0){
  122.        delay(50);
  123.        if(KEY_1==0){
  124.        SeriPushSend(0XC0);                                    //发送校准命令。
  125.            display();
  126.        while(KEY_1==0);                                       //等待按键放开
  127.        }
  128.     }
  129.     if(KEY_2==0){
  130.        delay(50);
  131.        if(KEY_2==0){
  132.        SeriPushSend(0XC1);                                    //发送停止校准命令。
  133.            display();
  134.        while(KEY_2==0);                                       //等待按键放开
  135.        }
  136.     }
  137.     if(KEY_3==0){
  138.        delay(50);
  139.        if(KEY_3==0){
  140.        SeriPushSend(0XA0);                                    //发送恢复出厂命令。
  141.            display();
  142.        SeriPushSend(0XAA);                                    //发送恢复出厂命令。
  143.            display();
  144.        SeriPushSend(0XA5);                                    //发送恢复出厂命令。
  145.            display();
  146.        SeriPushSend(0XC5);                                    //发送恢复出厂命令。
  147.            display();
  148.        while(KEY_3==0);                                       //等待按键放开
  149.        }
  150.     }

  151.     if(KEY_4==0){
  152.        delay(50);
  153.        if(KEY_4==0){
  154.        SeriPushSend(0X3);                                    //发送设定磁偏角高8位命令。
  155.            display();
  156.        SeriPushSend(0X0);                                    //发送磁偏角高8位的数据。
  157.            display();
  158.        SeriPushSend(0X4);                                    //发送设定磁偏角低8位命令
  159.            display();
  160.        SeriPushSend(0X64);                                   //发送磁偏角低8位的数据。此时磁偏角被设定为10.0度
  161.            display();
  162.        while(KEY_4==0);                                       //等待按键放开
  163.        }
  164.     }
  165. /*
  166.     if(KEY_5==0){
  167.        delay(50);
  168.        if(KEY_4==0){
  169.        SeriPushSend(0XAE);                                    //发送当前角度为0度命令。
  170.            display();
  171.        while(KEY_4==0);                                       //等待按键放开
  172.        }
  173.     }
  174. */

  175.     EA=1;

  176. }
  177. //*******************数据接收并显示**********************
  178. void display(void)
  179. {
  180.     uchar SUM;
  181.     uint   i ;
  182.    for (i=0;i<3000;i++);                                      //传送数据延时
  183.           if(BUF[0]==0X0D&&BUF[1]==0X0A){                         //帧头判断
  184.         SUM=BUF[6]+BUF[5]+BUF[4]+BUF[3]+BUF[2]+BUF[1]+BUF[0]; //校验和
  185.                if (BUF[7]==SUM){                                     //校验和判断
  186.           DisplayOneChar(0,0,BUF[2]);                         //角度百位值 写入LCD,因为是字符类型,所以不用转换,直接显示
  187.           DisplayOneChar(1,0,BUF[3]);                         //角度十位值 写入LCD
  188. ……………………

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








评分

参与人数 1黑币 +5 收起 理由
LAYLAY21JA + 5 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:29032 发表于 2019-4-3 15:37 | 只看该作者
谢谢分享~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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