找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc8f单片机0.96 oled GPS和串口1通讯源程序

  [复制链接]
跳转到指定楼层
楼主
IIC驱动oled   串口1和GPS通讯,波特率38400,功能简单,仅有GPS显示和速度时间显示。需要的随便玩,注释不是很清楚,见谅。
制作出来的实物图如下:


单片机源程序如下:
  1. #include "oled.h"
  2. void sysinit(); //系统初始化
  3. void Timer0Init(void);   //T0初始化
  4. void UartInit(void);                //9600bps@27.000MHz
  5. void hex_show(u8 a,u8 b,u8 c,u8 d,u8 e);//显示原码
  6. void OLED_Show2m(u8 x,u8 y,u8 num,u8 size2);//显示2个数字
  7. void jingwei();
  8. unsigned char jc,js,jcc;//计次处理
  9.   unsigned char str0[80];        // 存放收到的数据
  10.         unsigned char code digit[ ]={"0123456789ABCDEF"}; //定义字符数组显示数字


  11. int main(void)
  12. {       
  13.     sysinit();SBUF=0x66;
  14. //             DHT11_receive();        //探头数据读取  
  15.         ////                OLED_Clear(); //清
  16.         while(1)
  17.         {       
  18. //                OLED_Clear(); //清屏
  19. //       OLED_Show2m(33,3,55,16);//显示THI               
  20. //                   OLED_Show2m(102,3,23,16);//显示湿度               
  21. //       OLED_Showwd(44,6,231,16);//显示温度
  22. //       hex_show(str0[60],str0[1],str0[2],str0[23],str0[24]);
  23. //                SBUF=str1[4];       
  24.                 jingwei();
  25. //                delay_ms(800);
  26.         }                 
  27. }

  28. void jingwei()
  29. {
  30.         unsigned char hh,mm,ss,vv,jd1,wd1;
  31.         unsigned int  jd,wd;
  32.         if(str0[17]==0x41)//数据有效
  33. {
  34.                
  35.         hh=(str0[7]-0x30)*10+(str0[8]-0x30)+8;     //转换为UT8时区
  36.         mm=(str0[9]-0x30)*10+(str0[10]-0x30);     //转换为UT8时区
  37.         ss=(str0[11]-0x30)*10+(str0[12]-0x30);     //转换为UT8时区
  38.        
  39.         jd=(str0[32]-0x30)*10000+(str0[33]-0x30)*1000 //经度 xxxxx’xx
  40.             +(str0[34]-0x30)*100+(str0[35]-0x30)*10+(str0[36]-0x30);
  41.         jd1=((str0[38]-0x30)*100+(str0[39]-0x30)*10+(str0[40]-0x30))*0.06;
  42.        
  43.         wd=(str0[19]-0x30)*1000+(str0[20]-0x30)*100  //纬度 xxxx’xx
  44.             +(str0[21]-0x30)*10+(str0[22]-0x30);
  45.         wd1=((str0[24]-0x30)*100+(str0[25]-0x30)*10+(str0[26]-0x30))*0.06;
  46.        
  47.         if(str0[46]<=0x39)  //速度
  48.            {vv=((str0[46]-0x30)+(str0[48]-0x30)/10)*1.852+0.5;}  //速度个位(节)
  49.         else {vv=((str0[46]-0x30)*10+(str0[47]-0x30)+(str0[49]-0x30)/10)*1.852+0.5;}        //速度2位(节)
  50.        
  51.   OLED_ShowChar(0,0,(digit[hh/10]),16);  //小时 1
  52.   OLED_ShowChar(8,0,(digit[hh%10]),16);  //小时 2
  53.         OLED_ShowString(16,0,":",16); //:
  54.   OLED_ShowChar(22,0,(digit[mm/10]),16);  //分钟 1
  55.   OLED_ShowChar(30,0,(digit[mm%10]),16);  //分钟 2
  56.         OLED_ShowString(38,0,":",16); //:
  57.         OLED_ShowChar(44,0,(digit[ss/10]),16);  //秒钟 1
  58.   OLED_ShowChar(52,0,(digit[ss%10]),16);  //秒钟 2
  59.        
  60.         OLED_ShowString(70,0,"V:",16); //:
  61.          OLED_ShowChar(84,0,(digit[vv/10]),16);  //速度 1
  62.          OLED_ShowChar(92,0,(digit[vv%10]),16);  //速度 2
  63.         OLED_ShowString(100,0,"Kmh",16); //:
  64.         /*经度 5+2*/
  65.         OLED_ShowCHinese( 0,3,0);//经
  66.         OLED_ShowCHinese(18,3,2);//度
  67.   OLED_ShowString(36,3,":",16); //:
  68.           OLED_ShowChar(44,3,(digit[jd/10000]),16);     //经度1
  69.                 OLED_ShowChar(52,3,(digit[jd%10000/1000]),16);   //经度1
  70.                 OLED_ShowChar(60,3,(digit[jd%1000/100]),16);     //经度1
  71.         OLED_ShowString(68,3,"'",16); //:
  72.                 OLED_ShowChar(74,3,(digit[jd%100/10]),16);   //经度1
  73.                 OLED_ShowChar(82,3,(digit[jd%10]),16);   //经度1
  74.   OLED_ShowString(90,3,"'",16); //:
  75.                 OLED_ShowChar(96,3,(digit[jd1/10]),16);   //经度1
  76.                 OLED_ShowChar(104,3,(digit[jd1%10]),16);   //经度1
  77.                 if(str0[44]==0x45){OLED_ShowString(116,3,"E",16);}
  78.                 else              {OLED_ShowString(116,3,"W",16);}
  79.         /*纬度4+2*/
  80. OLED_ShowCHinese(0,6,1);//经
  81. OLED_ShowCHinese(18,6,2);//度
  82.         OLED_ShowString(36,6,":",16); //:
  83.                 OLED_ShowChar(42,6,(digit[wd/1000]),16);   //经度1
  84.                 OLED_ShowChar(50,6,(digit[wd%1000/100]),16);   //经度1
  85.         OLED_ShowString(58,6,"'",16); //:
  86.                 OLED_ShowChar(64,6,(digit[wd%100/10]),16);   //经度1
  87.                 OLED_ShowChar(72,6,(digit[wd%10]),16);   //经度1       
  88.         OLED_ShowString(80,6,"'",16); //:       
  89.           OLED_ShowChar(86,6,(digit[wd1/10]),16);   //经度1       
  90.           OLED_ShowChar(94,6,(digit[wd1%10]),16);   //经度1       
  91.                
  92.         if(str0[30]==0x4E){OLED_ShowString(116,6,"N",16);}
  93.                 else            {OLED_ShowString(116,6,"S",16);}
  94. }
  95.   else {OLED_ShowString(20,3,"Waiting GPS",16); }

  96. }
  97.         void UART1(void) interrupt 4  // 串行口1中断函数
  98. {       
  99.        
  100.         if(RI)                              // 只处理接收中断
  101.         {
  102.                 RI=0;                        //清除标志位               
  103.         str0[jc]=SBUF;//依次存放数据
  104.                 if(jc==0)
  105.                 {
  106.      if(SBUF==0x24) {jc++;} else {jc=0;}          // 判断帧头是否正确       
  107.           }
  108.                 else {jc++; if(SBUF==0x0A) {jc=0;} }
  109.          }
  110.       
  111. }





  112. void sysinit()
  113. {
  114.          OLED_Init();//初始化OLED
  115.                 OLED_Clear(); //清屏
  116.          OLED_ShowCHinese(37,3,0);//启
  117.    OLED_ShowCHinese(55,3,1);//动
  118.    OLED_ShowCHinese(73,3,2);//中
  119.    UartInit();//串口1初始化
  120.          Timer0Init();//定时器0初始化
  121.    delay_ms(800);       
  122.          OLED_Clear(); //清屏
  123. //   OLEDGS();//显示页面格式
  124. }

  125. void UartInit(void)                //38400bps@22.1184MHz
  126. {
  127.         SCON = 0x50;                //8位数据,可变波特率
  128.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  129.         AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
  130.         T2L = 0x70;                //设定定时初值
  131.         T2H = 0xFF;                //设定定时初值
  132.         AUXR |= 0x10;                //启动定时器2
  133.         ES   = 1;                // 开串口1中断
  134.         EA   = 1;                // 开总中断       
  135. }
  136. void Timer0Init(void)                //25毫秒@27MHz
  137. {
  138.         AUXR &= 0x7F;                //定时器时钟12T模式
  139.         TMOD &= 0xF0;                //设置定时器模式
  140.         TL0 = 0x46;                //设置定时初值
  141.         TH0 = 0x24;                //设置定时初值
  142.         TF0 = 0;                //清除TF0标志
  143.         TR0 = 1;                //定时器0开始计时
  144. //        ET0=1;   //定时器0中断
  145.         EA   = 1;                // 开总中断       
  146. }

  147. void hex_show(u8 a,u8 b,u8 c,u8 d,u8 e)
  148. ……………………

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

所有程序51hei提供下载:
GPS接收.zip (155.38 KB, 下载次数: 96)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:501401 发表于 2020-11-14 19:49 | 只看该作者
gps是什么型号的模块?
回复

使用道具 举报

板凳
ID:499469 发表于 2020-11-18 16:00 来自手机 | 只看该作者
louruijia 发表于 2020-11-14 19:49
gps是什么型号的模块?

只要是串口通信的   使用图中协议的都可以的
回复

使用道具 举报

地板
ID:35873 发表于 2021-4-9 01:34 | 只看该作者
不错  不知道那种剪线的模块能不能用  有空试下
回复

使用道具 举报

5#
ID:80768 发表于 2021-4-9 10:56 | 只看该作者
图上是你家坐标吗,我要去找你
回复

使用道具 举报

6#
ID:1091279 发表于 2023-8-20 11:13 | 只看该作者
请问能把程序移植到stm32c8上吗
回复

使用道具 举报

7#
ID:517502 发表于 2023-12-3 16:22 来自手机 | 只看该作者
1091212269 发表于 2020-11-18 16:00
只要是串口通信的   使用图中协议的都可以的

请问串口1是那个引脚
单片机下载程序晶振频率选择多少
回复

使用道具 举报

8#
ID:517502 发表于 2023-12-3 17:25 | 只看该作者
1091212269 发表于 2020-11-18 16:00
只要是串口通信的   使用图中协议的都可以的

串口1是那个单片机引脚呀?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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