IIC驅動oled 串口1和GPS通訊,波特率38400,功能簡單,僅有GPS顯示和速度時間顯示。需要的隨便玩,注釋不是很清楚,見諒。
制作出來的實物圖如下:
e03c9fa2b4795e33f3029a70836246c.jpg (93.59 KB, 下載次數: 97)
下載附件
2020-11-14 08:05 上傳
418cccc8f57e79d05d4b8891e6d6a3d.png (238.39 KB, 下載次數: 110)
下載附件
2020-11-14 08:05 上傳
單片機源程序如下:
- #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)
2020-11-14 08:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|