IIC驱动oled 串口1和GPS通讯,波特率38400,功能简单,仅有GPS显示和速度时间显示。需要的随便玩,注释不是很清楚,见谅。
制作出来的实物图如下:
单片机源程序如下:
- #include "oled.h"
- void sysinit(); //系统初始化
- void Timer0Init(void); //T0初始化
- void UartInit(void); //9600bps@27.000MHz
- void hex_show(u8 a,u8 b,u8 c,u8 d,u8 e);//显示原码
- void OLED_Show2m(u8 x,u8 y,u8 num,u8 size2);//显示2个数字
- void jingwei();
- unsigned char jc,js,jcc;//计次处理
- unsigned char str0[80]; // 存放收到的数据
- unsigned char code digit[ ]={"0123456789ABCDEF"}; //定义字符数组显示数字
- int main(void)
- {
- sysinit();SBUF=0x66;
- // DHT11_receive(); //探头数据读取
- //// OLED_Clear(); //清
- while(1)
- {
- // OLED_Clear(); //清屏
- // OLED_Show2m(33,3,55,16);//显示THI
- // OLED_Show2m(102,3,23,16);//显示湿度
- // OLED_Showwd(44,6,231,16);//显示温度
- // hex_show(str0[60],str0[1],str0[2],str0[23],str0[24]);
- // SBUF=str1[4];
- jingwei();
- // delay_ms(800);
- }
- }
- void jingwei()
- {
- unsigned char hh,mm,ss,vv,jd1,wd1;
- unsigned int jd,wd;
- if(str0[17]==0x41)//数据有效
- {
-
- hh=(str0[7]-0x30)*10+(str0[8]-0x30)+8; //转换为UT8时区
- mm=(str0[9]-0x30)*10+(str0[10]-0x30); //转换为UT8时区
- ss=(str0[11]-0x30)*10+(str0[12]-0x30); //转换为UT8时区
-
- jd=(str0[32]-0x30)*10000+(str0[33]-0x30)*1000 //经度 xxxxx’xx
- +(str0[34]-0x30)*100+(str0[35]-0x30)*10+(str0[36]-0x30);
- jd1=((str0[38]-0x30)*100+(str0[39]-0x30)*10+(str0[40]-0x30))*0.06;
-
- wd=(str0[19]-0x30)*1000+(str0[20]-0x30)*100 //纬度 xxxx’xx
- +(str0[21]-0x30)*10+(str0[22]-0x30);
- wd1=((str0[24]-0x30)*100+(str0[25]-0x30)*10+(str0[26]-0x30))*0.06;
-
- if(str0[46]<=0x39) //速度
- {vv=((str0[46]-0x30)+(str0[48]-0x30)/10)*1.852+0.5;} //速度个位(节)
- else {vv=((str0[46]-0x30)*10+(str0[47]-0x30)+(str0[49]-0x30)/10)*1.852+0.5;} //速度2位(节)
-
- OLED_ShowChar(0,0,(digit[hh/10]),16); //小时 1
- OLED_ShowChar(8,0,(digit[hh%10]),16); //小时 2
- OLED_ShowString(16,0,":",16); //:
- OLED_ShowChar(22,0,(digit[mm/10]),16); //分钟 1
- OLED_ShowChar(30,0,(digit[mm%10]),16); //分钟 2
- OLED_ShowString(38,0,":",16); //:
- OLED_ShowChar(44,0,(digit[ss/10]),16); //秒钟 1
- OLED_ShowChar(52,0,(digit[ss%10]),16); //秒钟 2
-
- OLED_ShowString(70,0,"V:",16); //:
- OLED_ShowChar(84,0,(digit[vv/10]),16); //速度 1
- OLED_ShowChar(92,0,(digit[vv%10]),16); //速度 2
- OLED_ShowString(100,0,"Kmh",16); //:
- /*经度 5+2*/
- OLED_ShowCHinese( 0,3,0);//经
- OLED_ShowCHinese(18,3,2);//度
- OLED_ShowString(36,3,":",16); //:
- OLED_ShowChar(44,3,(digit[jd/10000]),16); //经度1
- OLED_ShowChar(52,3,(digit[jd%10000/1000]),16); //经度1
- OLED_ShowChar(60,3,(digit[jd%1000/100]),16); //经度1
- OLED_ShowString(68,3,"'",16); //:
- OLED_ShowChar(74,3,(digit[jd%100/10]),16); //经度1
- OLED_ShowChar(82,3,(digit[jd%10]),16); //经度1
- OLED_ShowString(90,3,"'",16); //:
- OLED_ShowChar(96,3,(digit[jd1/10]),16); //经度1
- OLED_ShowChar(104,3,(digit[jd1%10]),16); //经度1
- if(str0[44]==0x45){OLED_ShowString(116,3,"E",16);}
- else {OLED_ShowString(116,3,"W",16);}
- /*纬度4+2*/
- OLED_ShowCHinese(0,6,1);//经
- OLED_ShowCHinese(18,6,2);//度
- OLED_ShowString(36,6,":",16); //:
- OLED_ShowChar(42,6,(digit[wd/1000]),16); //经度1
- OLED_ShowChar(50,6,(digit[wd%1000/100]),16); //经度1
- OLED_ShowString(58,6,"'",16); //:
- OLED_ShowChar(64,6,(digit[wd%100/10]),16); //经度1
- OLED_ShowChar(72,6,(digit[wd%10]),16); //经度1
- OLED_ShowString(80,6,"'",16); //:
- OLED_ShowChar(86,6,(digit[wd1/10]),16); //经度1
- OLED_ShowChar(94,6,(digit[wd1%10]),16); //经度1
-
- if(str0[30]==0x4E){OLED_ShowString(116,6,"N",16);}
- else {OLED_ShowString(116,6,"S",16);}
- }
- else {OLED_ShowString(20,3,"Waiting GPS",16); }
- }
- void UART1(void) interrupt 4 // 串行口1中断函数
- {
-
- if(RI) // 只处理接收中断
- {
- RI=0; //清除标志位
- str0[jc]=SBUF;//依次存放数据
- if(jc==0)
- {
- if(SBUF==0x24) {jc++;} else {jc=0;} // 判断帧头是否正确
- }
- else {jc++; if(SBUF==0x0A) {jc=0;} }
- }
-
- }
- void sysinit()
- {
- OLED_Init();//初始化OLED
- OLED_Clear(); //清屏
- OLED_ShowCHinese(37,3,0);//启
- OLED_ShowCHinese(55,3,1);//动
- OLED_ShowCHinese(73,3,2);//中
- UartInit();//串口1初始化
- Timer0Init();//定时器0初始化
- delay_ms(800);
- OLED_Clear(); //清屏
- // OLEDGS();//显示页面格式
- }
- void UartInit(void) //38400bps@22.1184MHz
- {
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x01; //串口1选择定时器2为波特率发生器
- AUXR |= 0x04; //定时器2时钟为Fosc,即1T
- T2L = 0x70; //设定定时初值
- T2H = 0xFF; //设定定时初值
- AUXR |= 0x10; //启动定时器2
- ES = 1; // 开串口1中断
- EA = 1; // 开总中断
- }
- void Timer0Init(void) //25毫秒@27MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x46; //设置定时初值
- TH0 = 0x24; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- // ET0=1; //定时器0中断
- EA = 1; // 开总中断
- }
- void hex_show(u8 a,u8 b,u8 c,u8 d,u8 e)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有程序51hei提供下载:
GPS接收.zip
(155.38 KB, 下载次数: 116)
|