闲来无聊,给小车车增加个 车载 三温度(水温+室内+室外)+GPS(日期+时间+海拔+定位) ,硬件(STC12+22.114MHz+2oled+ IIC)写的不好,有待优化!
单片机源程序如下:
- /*******************************************************************************
- MCU: STC12C5A60S2
- 晶振: 22.1184MHz
- A_OLED: 0.96寸 128*64
- LCD SCL : P0^6;
- LCD SDA : P0^7;
- GPS : P1^2
- 温度:P1^5.6.7
-
- 说明:此版本出了偶尔跳1秒时间外,暂时没有发现其他问题
-
- 日期、时间、3温度 、有海拔-星期-分屏显示(GPS接串口2)
- *******************************************************************************/
- #include "STC12C5A60S2.h"
- #include "reDefine.h"
- #include "A_oled.h"
- #include "B_oled.h"
- #include "GPS.h"
- #include "18b20.h"
- #include "bmp.h"
- bit gUpdateTempFlag = FALSE; // 将温度标志设置为“假”
- void Timer1_Init(void); //定时1毫秒@22.1184MHz
- //****************************************************
- // 主函数 ***
- //****************************************************
- void main()
- {
- //unsigned long t;
-
- Uart2_Init(); //串口2初始化
- A_OLED_Init(); //初始化A_OLED
- A_OLED_Clear(); //清屏
- B_OLED_Init(); //初始化B_OLED
- B_OLED_Clear(); //清屏
-
-
-
- A_OLED_DrawBMP(0,0,132,8,BMP2); // 显示 福特的 logo
- B_OLED_DrawBMP(0,0,132,8,BMP5); // 显示 福特的 进无止境
- delay_ms(3000);
- B_delay_ms(3000);
- A_OLED_Clear(); //清屏
- B_OLED_Clear(); //清屏
-
-
- Timer1_Init(); // 定时器设置初始化
-
- A_OLED_DrawBMP(0,0,128,8,BMP1); // 显示 温度LOGO
- A_OLED_ShowString(0,0,"....The Temp....",8); // 显示温度屏的屏头
- B_OLED_DrawBMP(4,0,132,8,BMP3); // 显示 GPS-LOGO
- B_OLED_ShowString(0,0,"....The GPS....",8); // 显示GPS屏的屏头
- while(1) // 主循环开始
- {
-
- //for(t=0;t<600000;t++) /***** 温度 部分******/
- //{
- if (gUpdateTempFlag) // 如果温度标志为 “真”,开始执行温度读取操作
- {
- gUpdateTempFlag = FALSE; // 将温度标志设置为“假” ( 0 )复位
-
- datapros(Ds18b20ReadTemp()); //温度数据处理函数
- dataprosN(Ds18b20ReadTempN()); //温度数据处理函数
- dataprosS(Ds18b20ReadTempS()); //温度数据处理函数
-
- A_OLED_ShowString(3,2,"N:",16); //(2:从第几列开始 ,6:从6页开始, 16:占用2页空间显示(32:占用1页空间显示) )
- A_OLED_ShowString(3,4,"W:",16);
- A_OLED_ShowString(3,6,"S:",16);
-
- }
- //}
-
- //for(t=0;t<1000000;t++) /***** GPS 部分*****/
- //{
- if ((gIsRecvGNRMC) || (gIsRecvGNZDA)) // 只要其中一条语句接受完成就执行
-
- {
- GPS_JieXi();
- }
-
- //}
- }
- }
- //=======================================================================================================
- void Timer1_Init(void) // 定时器设置,1毫秒@22.1184MHz 波特率9600
- {
- AUXR |= 0x40; //定时器时钟1T模式
- TMOD &= 0x0F; //设置定时器模式
- TL1 = 0x9A; //设置定时初值
- TH1 = 0xA9; //设置定时初值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- ET1 = 1;
- }
- //-------------------------------------------------------------------------------------
- void Timer() interrupt 3 // GPS数据接收中断
- {
- static unsigned int _1msCnt = 0; // static 是数据储存类型,unsigned int 是数据类型
- if(++_1msCnt >= 1000) // 每隔1000ms,执行1 次
- {
- _1msCnt = 0; // 将毫秒计数复位
-
- gUpdateTempFlag = TRUE; // 将温度标志设置为 “真” ( 1 )
- }
- if (gRecGPSDataTimeCnt > 0) //GPS数据接收超时检测
- {
- gRecGPSDataTimeCnt --;
-
- if (gRecGPSDataTimeCnt == 0)
- {
- gGPSIndex = 0;
- }
- }
- }
复制代码 程序:
2021.2.2---双屏幕显示-SH1106 OLED GPS 温度 - 优化版.7z
(55.94 KB, 下载次数: 121)
|