STC15L2K16S2--96OLED-gps-sucess.rar
(5.76 MB, 下載次數: 59)
2020-8-19 21:47 上傳
點擊文件名下載附件
----------------------------------------------------------------------------------------------------------------
/*
本機器下載頻率11.0592M
基于GPS 接收時間顯示在OLED上
采用STC15L2K16S2--單片機
3.3V 低功耗
串口2接收GPS數據,在串口2上不用上拉10K電阻
*/
/////////////////////////////////////////////////////////////////////////////////////////*/
//-----------今天改成STC15F2K16S2--28PIN系列 --------------------------------------------------
//
//芯片型號 : STC15F2K16S2
//
//關于此芯片的重要說明:
// 有定時器0 定時器1 定時器2
// 有比較器 (可當作一路ADC使用)
// 有SPI (可為主模式和從模式)
// 有3路PCA/PWM/CCP (可用作DAC)
// 有8通道10位精度的A/D
//=======================================================================================
// 程序存儲器:16K
// 數據存儲器:2kBYTES;
// 定時器:T0 T1 T2 ,
// 串口: 2個
// 外部中斷: 5個
// AD 轉換:8路,10位
// EEPROM:45K
// 內部高精時鐘:有
// CCP/PWM/: 3-CH
// 掉電檢測,看門狗:有
// 支持RS485下載
// 工作頻率 35M
//**********************************************************/
//-------------------------------------------------------------------------
/*
上電沒有顯示的*************
分辨率:128*64
自發光 ,不需要背光
*/
//-------------------------------------------------------------------------
#include <STC15F2K16S2.H>
#include <intrins.H>
//串口1定義9600bps,8-N-1 ,CPU工作頻率11.0592M
#include <STC15W_UART.H>
#include <OLED_FONT.C>
#include <OLED_96.C>
#include <stdlib.h>
#include <string.h>
#include <GPS_INFO1.C>
#include <GPS_INFO2.C>
#include <GPS_INFO31_height.C>
#include <GPS_INFO32_height.C>
#include <STC15W_UART2.H>
#include <string.H>
//-------------------------------------------------------------------------
sbit RED_LED=P3^3;
sbit GREEN_LED=P3^4;
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
unsigned int t0_nnn=0;
unsigned int t0_mmm=0;
unsigned int t0_xxx=0;
unsigned int t0_ggg=0;
unsigned int t0_eee=0;
//------------------------------------------------------------------------
//-------------------------------------------------------------------------
unsigned int Time_out_FLAG=0;
//------------------------------------------------------------------------
unsigned int char_num=0;
unsigned char Receive_flag=0;
//---------------------------------------------------------------------------------------------------
unsigned char beijing_year_4=0;
unsigned char beijing_year_3=0;
unsigned char beijing_year_2=0;
unsigned char beijing_year_1=0;
//---------------------------------------------------------------------------------------------------
unsigned char beijing_month_shi=0;
unsigned char beijing_month_ge=0;
unsigned char beijing_day_shi=0;
unsigned char beijing_day_ge=0;
//---------------------------------------------------------------------------------------------------
unsigned char beijing_hour_shi=0;
unsigned char beijing_hour_ge=0;
unsigned char beijing_min_shi=0;
unsigned char beijing_min_ge=0;
unsigned char beijing_second_shi=0;
unsigned char beijing_second_ge=0;
//---------------------------------------------------------------------------------------------------
unsigned long int Count=0;
//---------------------------------------------------------------------------------------------------
unsigned char GPS_FLAG=0;
unsigned char GPS_INFO_output_FLAG=0;
//-----------------------------------------------------------------------------------------------------
unsigned char Finish_GPS_DATA_flag=0;
//-----------------------------------------------------------------------------------------------------
unsigned int display_interval_time=0;
unsigned int display_interval_time_flag=0;
//--------------------------------------------------------------------------------------------------------
void Config_Timer0() //1000微秒@11.0592.000MHz
{
//----------------------------------------------------------------
// T0X12 T1X12 UART_MX06 T2R T2_C/T T2X12 EXT_RAM S1ST2
// 1 0 0 0 0 0 0 0
// 0 12分頻; T1 12分頻
// 1 1T模式
AUXR |= 0x80; //定時器時鐘1T模式
//EXT_RAM ==0 允許使用內部1024字節RAM
//---------------------------------------------------------------
//GATE C/T M1 M0 GATE C/T M1 M0
// 0 0 0 0 0 0 0 0
// T1 T0 模式0
// 自動重裝16位模式
TMOD &= 0xF0; //設置定時器模式,自動重裝初值*****************
//--------12T下定時器計算方法----------------------------------
// 24M
//65536-1000------------
// 12(分頻)
// 24M
//65536-1000------------ = 41536=0XA240H,明白了沒有?
// 1 (1分頻)
// 24M
//65536-500------------ = 53536=0XD120H,明白了沒有?
// 1 (1分頻)
// 24M
//65536-600------------ = 51136=0XC7C0H,明白了沒有?
// 1 (1分頻)
TL0 = 0xCD; //設置定時初值
TH0 = 0xD4; //設置定時初值
TF0 = 0; //清除TF1標志
TR0 = 0; //定時器1開始計時
ET0=1;
//---------- * * * * *---------PT0------------------------
// PS PT1 PX1 PT0 PX0
//IP= 0X02;
EA=1;
}
//
////T2做波特率發生器,不可單獨使用************************************
//
//void Config_Timer2() //10000微秒@24.000MHz
//{
//
//
// EA=1;
// //----------------------------------------------------------------
// // T0X12 T1X12 UART_MX06 T2R T2_C/T T2X12 EXT_RAM S1ST2
// // 0 0 0 0 0 1 0 0
//
//
// AUXR |= 0x04; //這個只是定義,定時器T2時鐘1T模式
//
// T2L = 0x40; //設置定時初值
// T2H = 0xA2; //設置定時初值 //24Hz,1ms
// // 0001 0000
//
// //開放ET2中斷----------------------------------------------------
//
// //IE2
// // - ET4 ET3 ES4 ES3 ET2 ESPI ES2
// // 0 0 0 0 0 1 0 0
//
// IE2 =IE2 & 0x00;
// IE2 =IE2 | 0X04;
//
//
// // T0X12 T1X12 UART_MX06 T2R T2_C/T T2X12 EXT_RAM S1ST2
// // 0 0 0 1 0 0 0 0
// //T2R 定時器已經啟動了
// AUXR |= 0x10; //定時器2開始計時
//
// //T2R禁止運行
// //AUXR=AUXR & 0X1110 1111
// //AUXR=AUXR & 0XEF;
//
//
//}
void delayxms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*
==================================================================================
//顯示ACSII 使用單個字符顯示函數
OLED_Fill(0x00);
for(i=0; i<16 ;i++)
{
//入 參 : x:列0~127;y:頁地址0~7;
OLED_ShowChar(i*8,0,' '+i); //加空格的意思是字符,1行0+16個字符
OLED_ShowChar(i*8,2,' '+i+16); //加空格的意思是字符,2行i+16個字符
OLED_ShowChar(i*8,4,' '+i+32); //加空格的意思是字符,2行i+32個字符
OLED_ShowChar(i*8,6,' '+i+48); //加空格的意思是字符,2行i+48個字符
}
delay_ms(2000);
//顯示數字和字母 使用字符串顯示函數 // x:列0~127;y:頁地址0~7;
OLED_Fill(0x00);
LCD_P8x16Str(0,0,"0123456789"); //0表示總是從坐標0開始,0表示第0頁,第1頁是08--15像素行
LCD_P8x16Str(0,2,"abcdefghijklmnop"); //0表示總是從坐標0開始,2表示第2頁,第3頁是24--31像素行
LCD_P8x16Str(0,4,"ABCDEFGHIJKLMNOP");
LCD_P8x16Str(0,6,"0123456789");
delay_ms(2000);
==================================================================================
*/
void OLED_START_VALUE()
{
unsigned char i=0;
/* 取消這一句,屏幕不再閃爍******************************
OLED_Fill(0x00);
------------------------------------------------------- */
//6個漢字,最后一個i 是在數組 F16x16[]中漢字的序號,如 康1金2輝3
for(i=0; i<8; i++)
{
if (i==0) LCD_P16x16Ch(i*16,0,beijing_min_shi); //i是漢字的序號, 漢字0,
if (i==1) LCD_P16x16Ch(i*16,0,beijing_min_ge); //i是漢字的序號, 漢字9
if (i==2) LCD_P16x16Ch(i*16,0,10); //i是漢字的序號,漢字“月”
if (i==3) LCD_P16x16Ch(i*16,0,beijing_second_shi); //i是漢字的序號,漢字2
if (i==4) LCD_P16x16Ch(i*16,0,beijing_second_ge); //i是漢字的序號,漢字6
if (i==5) LCD_P16x16Ch(i*16,0,11); //i是漢字的序號,漢字“日”
if (i==6) LCD_P16x16Ch(i*16,0,beijing_second_shi);//i是漢字的序號,漢字“@”
if (i==7) LCD_P16x16Ch(i*16,0,beijing_second_ge); //i是漢字的序號,漢字“三”
}
//01是一行漢字----------------------------------------------
//23是一行漢字----------------------------------------------
//45是一行漢字-------------------------------------------------
//第一個參數:0-127,
//第二個參數:第3個頁面地址開始,連續3,4,5頁面
//因為每個頁面8行像素,漢字是高度32像素,占用3個頁面像素
//第三個參數是在字符點陣中的漢字的“序號”
LCD_P18x32Ch(2+0, 3,beijing_hour_shi); //小時的十位
LCD_P18x32Ch(2+18,3,beijing_hour_ge); //小時的個位
LCD_P08x32Ch(2+18+18,3,0); //冒號:
LCD_P18x32Ch(2+18+18+8,3,beijing_min_shi); //分鐘的十位
LCD_P18x32Ch(2+18+18+18+8,3,beijing_min_ge); //分鐘的個位
LCD_P08x32Ch(2+18+18+18+18+8,3,0); //冒號:
LCD_P18x32Ch(2+18+18+18+18+8+8,3,beijing_second_shi); //秒的十位
LCD_P18x32Ch(2+18+18+18+18+8+8+18,3,beijing_second_ge); //秒的個位
}
void main()
{
unsigned char j=0;
unsigned char i=0;
unsigned char Speed_Len=0;
// P17 16 15 14 13 12 11 10
// 0 0 0 0 0 0 0 0
// 1 1 1 1 1 0 1 0 //
P1M1 = P1M1 & 0x00; //
P1M0 = P1M0 | 0x00; //
// 0 0 0 0 0 0 0 0
// 1 1 0 1 1 1 1 1
P2M1 = P2M1 & 0x00; //
P2M0 = P2M0 | 0x00; //
//配置P3口為準雙向口**********************************************
//P33 P34為_LED
//
// 0 0 0 0 0 0 0 0
// 0 0 0 1 1 0 0 0
P3M1 = P3M1 & 0x00; //
P3M0 = P3M0 | 0x00; //
//配置P5口**********************************************
// 0 0 0 0 0 0 0 0
// 0 0 1 0 0 0 0 0
P5M1 = P5M1 & 0x00;
P5M0 = P5M0 | 0x00;
//--------------------------------------------------------------
Config_Timer0();
//************************* *********************************
UART_INIT();
delayxms(1);
UART2_INIT();
delayxms(200);
//*************************************************************
TR0=1;
//**********************************************************
SEND_STRING_TO_SBUF("Program Start....\r\n");
//-----雙色燈是共陽極的=====且不能同時為1==============================
RED_LED=1;
GREEN_LED=0;
//--------------------------------------------------------------------------
//oled 初始化
OLED_Init();
LCD_Clear();
LCD_Clear();
//清屏
OLED_Fill(0x00);
delayxms(1000);
//GPS定位數據刪除 //清空緩存數組
CLEAR_STRUCT_BUFFER();
OLED_START_VALUE();
CLEAR_STRUCT_BUFFER_height();
//允許串口2接收的所有GPS數據,從串口1輸出
//僅僅用于監視,當允許時,導致數據顯示可能不正常
Enable_S2_SBUF_direct_output=0;
while(1)
{
//==========通過串口2中斷自動接收GPS數據**************************************
//=========----------------------------------------
//
if (From_S2_S2BUF_receive_finish_FLAG==1)
{
From_S2_S2BUF_receive_finish_FLAG=0;
Resulotion_Gpsinfo_Buffer();
//if (get_GPS_info_FLAG==0)
{
SEND_STRING_TO_SBUF("------------Wait GPS Data-------------\r\n");
SEND_STRING_TO_SBUF(Save_Data.GPS_Buffer);
SEND_STRING_TO_SBUF("\r\n");
}
//GPS信號每秒采集一次------接收到,還是沒有接受到,上面的函數300ms執行一次
//GPS信號每秒采集一次---------------------------------------------------
GPS_FLAG=0;
//如果采集到GPS信號,則get_GPS_info_FLAG=1,此值在上面的函數中,得到新值
}
if (From_S2_S2BUF_receive_HEIGHT_finish_FLAG==1)
{
From_S2_S2BUF_receive_HEIGHT_finish_FLAG=0;
{
SEND_STRING_TO_SBUF("------------Wait GPS Height_Data-------------\r\n");
SEND_STRING_TO_SBUF(my_height_Data.GPS_height_Buffer);
Resulotion_Gpsinfo_Buffer_height();
SEND_STRING_TO_SBUF("\r\nHeight===");
SEND_STRING_TO_SBUF(my_height_Data.Ocean_Height);
SEND_STRING_TO_SBUF("\r\n");
get_ocean_height_data[0]= my_height_Data.Ocean_Height[0]-0x30;
get_ocean_height_data[1]= my_height_Data.Ocean_Height[1]-0x30;
get_ocean_height_data[2]= my_height_Data.Ocean_Height[2]-0x30;
}
}
//每200ms 輸出一次GPS信息--------定時器T0控制---------------------------------
//這個句子必須有------------------------------------------------------------
if (GPS_INFO_output_FLAG==1)
{
GPS_INFO_output_FLAG=0;
if (get_GPS_info_FLAG==1)
{
//唉!!曾經沒有這個句子,導致死機重啟!!!***********
get_GPS_info_FLAG=0;
//解碼函數----------------------------------------------
get_GPS_Date_Time_info();
// 函數 OUTPUT_GPS_BUFFER_DATA()中已經得到下列實際參數
UTC_TO_BEIJING_TIME(my_year,my_month,my_day,my_hour,my_min,my_second);
/*
本不應該從 串口1 輸出,但是調試的時候,先斷開串口1無線發射部分
調試完畢改成,串口2輸出,似乎串口2無法監視
*/
/*
填充北京時間
*/
beijing_year_4 = beijing_year /1000;
beijing_year_3 = (beijing_year %1000)/100;
beijing_year_2 = (beijing_year %100)/10;
beijing_year_1 = beijing_year %10;
beijing_month_shi= beijing_month /10;
beijing_month_ge = beijing_month %10;
beijing_day_shi = beijing_day /10;
beijing_day_ge = beijing_day %10;
beijing_hour_shi = beijing_hour /10;
beijing_hour_ge = beijing_hour %10;
beijing_min_shi = beijing_min /10;
beijing_min_ge= beijing_min %10;
beijing_second_shi = beijing_second /10;
beijing_second_ge = beijing_second %10;
beijing_week = beijing_week;
//在這里將數據推送到OLED上----------------------------------------
Finish_GPS_DATA_flag=1;
SEND_STRING_TO_SBUF("\r\n-------------------------\r\n");
SEND_STRING_TO_SBUF("\r\n\r\nBeijing_GPS_Date=");
SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING(beijing_year));
SEND_STRING_TO_SBUF("-");
SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING_2WEI(beijing_month));
SEND_STRING_TO_SBUF("-");
SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING_2WEI(beijing_day));
SEND_STRING_TO_SBUF("\r\n\r\nBeijing_GPS_Time=");
SEND_STRING_TO_SBUF("-");
SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING_2WEI(beijing_hour));
SEND_STRING_TO_SBUF("-");
SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING_2WEI(beijing_min));
SEND_STRING_TO_SBUF("-");
SEND_STRING_TO_SBUF(CONVERT_INT_TO_DECIMAL_STRING_2WEI(beijing_second));
SEND_STRING_TO_SBUF("\r\n");
SEND_STRING_TO_SBUF("\r\n\r\nTo Earth direction=");
Speed_Len =strlen(Save_Data.my_Speed_direction);
//SEND_STRING_TO_SBUF("\r\n\r\nSpeed_direction=");
//SEND_STRING_TO_SBUF(Speed_Len);
if (Speed_Len!=0)
{
SEND_STRING_TO_SBUF(Save_Data.my_Speed_direction);
}
else
{
SEND_STRING_TO_SBUF("*******");
}
SEND_STRING_TO_SBUF("\r\n");
} //判斷是否接收到GPS信號
else
{
beijing_year_4=0;
beijing_year_3=0;
beijing_year_2=0;
beijing_year_1=0;
beijing_month_shi=0;
beijing_month_ge=0;
beijing_day_shi=0;
beijing_day_ge=0;
beijing_hour_shi = 0;
beijing_hour_ge = 0;
beijing_min_shi = 0;
beijing_min_ge= 0;
beijing_second_shi = 0;
beijing_second_ge= 0;
} //IF ...else 語句,接收完整信息成功語句塊
} //GPS 信息輸出
if (Finish_GPS_DATA_flag==1)
{
Finish_GPS_DATA_flag=0;
/* 取消這一句,屏幕不再閃爍******************************
OLED_Fill(0x00);
------------------------------------------------------- */
//6個漢字,最后一個i 是在數組 F16x16[]中漢字的序號,如 康1金2輝3
for(i=0; i<8; i++)
{
if (i==0) LCD_P16x16Ch(i*16,0,beijing_month_shi); //i是漢字的序號, 漢字0,
if (i==1) LCD_P16x16Ch(i*16,0,beijing_month_ge); //i是漢字的序號, 漢字9
if (i==2) LCD_P16x16Ch(i*16,0,10); //i是漢字的序號,漢字“月”
if (i==3) LCD_P16x16Ch(i*16,0,beijing_day_shi); //i是漢字的序號,漢字2
if (i==4) LCD_P16x16Ch(i*16,0,beijing_day_ge); //i是漢字的序號,漢字6
if (i==5) LCD_P16x16Ch(i*16,0,11); //i是漢字的序號,漢字“日”
if (i==6) LCD_P16x16Ch(i*16,0,12);//i是漢字的序號,漢字“@”
if (i==7) //星期 //i是漢字的序號,漢字“三”
{
if (beijing_week==1) LCD_P16x16Ch(i*16,0,13); //星期一
if (beijing_week==2) LCD_P16x16Ch(i*16,0,14); //星期一
if (beijing_week==3) LCD_P16x16Ch(i*16,0,15); //星期一
if (beijing_week==4) LCD_P16x16Ch(i*16,0,16); //星期一
if (beijing_week==5) LCD_P16x16Ch(i*16,0,17); //星期一
if (beijing_week==6) LCD_P16x16Ch(i*16,0,18); //星期一
if (beijing_week==0) LCD_P16x16Ch(i*16,0,19); //星期天
}
}
//01是一行漢字----------------------------------------------
//23是一行漢字----------------------------------------------
//45是一行漢字-------------------------------------------------
//第一個參數:0-127,
//第二個參數:第3個頁面地址開始,連續3,4,5頁面
//因為每個頁面8行像素,漢字是高度32像素,占用3個頁面像素
//第三個參數是在字符點陣中的漢字的“序號”
LCD_P18x32Ch(2+0, 3,beijing_hour_shi); //小時的十位
LCD_P18x32Ch(2+18,3,beijing_hour_ge); //小時的個位
LCD_P08x32Ch(2+18+18,3,0); //冒號:
LCD_P18x32Ch(2+18+18+8,3,beijing_min_shi); //分鐘的十位
LCD_P18x32Ch(2+18+18+18+8,3,beijing_min_ge); //分鐘的個位
LCD_P08x32Ch(2+18+18+18+18+8,3,0); //冒號:
LCD_P18x32Ch(2+18+18+18+18+8+8,3,beijing_second_shi); //秒的十位
LCD_P18x32Ch(2+18+18+18+18+8+8+18,3,beijing_second_ge); //秒的個位
/*
//顯示圖形
OLED_Fill(0x00);
delay_ms(1);
//起始點坐標(x,y),x的范圍0~127,y為頁的范圍0~7
OLED_DrawBMP(0,0,128,8,BMP3);
delay_ms(2000);
*/
if ( display_interval_time_flag==1)
{
display_interval_time_flag=2;
for(i=0; i<8; i++)
{
//i是漢字的序號, 漢字N,
if (i==0) LCD_P16x16Ch(i*16,0,20);
//i是漢字的序號,
if (i==1) LCD_P16x16Ch(i*16,0,Speed_direction_data[0]);
//i是漢字的序號,
if (i==2) LCD_P16x16Ch(i*16,0,Speed_direction_data[1]);
//i是漢字的序號,
if (i==3) LCD_P16x16Ch(i*16,0,Speed_direction_data[2]);
//i是漢字的序號, 漢字空格
if (i==4) LCD_P16x16Ch(i*16,0,21);
//i是漢字的序號, 漢字空格
if (i==5) LCD_P16x16Ch(i*16,0,get_ocean_height_data[0]);
//i是漢字的序號, 漢字空格
if (i==6) LCD_P16x16Ch(i*16,0,get_ocean_height_data[1]);
//i是漢字的序號, 漢字空格
if (i==7) LCD_P16x16Ch(i*16,0,get_ocean_height_data[2]);
}
}
} //Finish_GPS_DATA_flag===0
}
}
//******************用于時鐘******************************************************
void TIMER0_INTERRUPT() interrupt 1
{
//收到GPS完整的信息后,每秒通過串口1輸出一次
if (GPS_INFO_output_FLAG==0)
{
t0_ggg++;
if (t0_ggg>200)
{
t0_ggg=0;
GPS_INFO_output_FLAG=1;
}
}
if (ALL_GPS_DATA_RECEIVE_FINISH_FLAG==1)
{
if (display_interval_time_flag==0)
{
display_interval_time++;
if (display_interval_time>5000)
{
display_interval_time=0;
display_interval_time_flag=1; //執行
}
}
}
if (display_interval_time_flag==2)
{
display_interval_time++;
if (display_interval_time>2000)
{
display_interval_time=0;
display_interval_time_flag=0;
}
}
}
/*
//顯示漢字==完整的程序=============================================================
/*
第一個參數表示:從行16個像素位置開始顯示,
第二個參數表示:0---表示第1行,行像素從00-07,第1頁
1---表示第2行,行像素從08-15,第2頁 ,因為漢字是16X16,一行漢字占2頁
2---表示第3行,行像素從16-23,第3頁,
3---表示第4行,行像素從24-31,第4頁 ,這是第1行漢字
4---表示第5行,行像素從32-39,第5頁,
5---表示第6行,行像素從40-47,第6頁 ,這是第2行漢字
6---表示第5行,行像素從48-55,第7頁,
7---表示第6行,行像素從56-64,第8頁 ,這是第3行漢字
*/
/*
OLED_Fill(0x00);
//6個漢字,最后一個i 是在數組 F16x16[]中漢字的序號,如 康1金2輝3
for(i=0; i<6; i++)
{
LCD_P16x16Ch(i*16+16,0,i);
}
//這里空幾個漢字顯示4個漢字==========================================
for(i=0; i<4; i++)
{
LCD_P16x16Ch(i*16+32,4,i+6);
LCD_P16x16Ch(i*16+32,6,i+6+4);
}
delay_ms(2000);
*/
|