|
STC15L2K16S2--96OLED-gps-sucess.rar
(5.76 MB, 下载次数: 59)
----------------------------------------------------------------------------------------------------------------
/*
本机器下载频率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);
*/
|
评分
-
查看全部评分
|