GPS(日期+时间)+温度(3温度)+LCD2004(IIC 显示模块)+STC12C5A60S2+22.1184MHz+串口1+串口2
综合性那么高的资料网上应该时找不到了吧!反正是花了我好久好久的时间才弄出来的。反正我是被折磨的快疯掉了!!!
初学者可以看看,高手可以帮忙指正!
单片机源程序如下:
- #include "GPS.h"
- unsigned char RX_Buffer[68]; //此数组用于直接储存来自GPS的原始数据
- unsigned char RX_Count = 0;
- bit Flag_GPS_OK = 0;
- void Uart_Init()
- {
- SCON = 0X50; //UART方式1;8位UART
- REN = 1; //允许串行口接收数据
- PCON = 0x00; //SMOD=0;波特率不加倍
- TMOD = 0x20; //T1方式2,用于产生波特率
- TH1 = 0xFD; //装初值
- TL1 = 0xFD;
- TR1 = 1; //启动定时器1
- EA = 1; //打开全局中断控制
- ES = 1; //打开串行口中断
- }
- void RECEIVE_DATA(void) interrupt 4 using 3 //串口中断函数,收到GPS的数据时进入此中断
- {
- unsigned char temp = 0;
- ES=0; //先关闭串行口中断
- temp = SBUF; //接收SBUF中的数据
- RI = 0; //接收完成的标志位清零
- // LED1 = ~LED1;
-
- if(temp == '*******************************************************************************
- 此程序使用 22.1184MHz 晶振
- *******************************************************************************/
- #include "STC12C5A60S2.h"
- #include "1602IIC.h"
- #include "GPS.h"
- #include "18b20.h"
- uchar code table1[]={0x00,0x00,0x10,0x07,0x08,0x08,0x07,0x00};//字符℃
- //****************************************************
- // 主函数 ***
- //****************************************************
- void main()
- {
- unsigned char num;
- Init_Lcd(); //LCD初始化
- Uart2_Init(); //串口初始化
- LCD_write_command(0xc0);
- LCD_write_word("Welcome to use GPS..");
- Delay1ms();
- LCD_write_command(0x01);
-
- LCD_write_command(0x80);
- LCD_write_word("n:");
- LCD_write_command(0xc0);
- LCD_write_word("w:");
- LCD_write_command(0x94);
- LCD_write_word("s:");
- LCD_write_command(0x8a);
- LCD_write_word("D:");
- LCD_write_command(0xca);
- LCD_write_word("T:");
-
-
- Write_LCD(5,0,".");
- Write_LCD(5,1,".");
- LCD_write_command(0x99);
- LCD_write_word(".");
-
- LCD_write_command(0x9E);
- LCD_write_word("*:");
-
- LCD_write_command(0x40); //自建字符的第一个指令地址
- for(num=0;num<8;num++)
- {
- LCD_write_data(table1[num]);
- }
- LCD_write_command(0x87); //自建字符显示位置
- LCD_write_data(0X00); //自建字符的第一个数据地址(1602 总共可以自建8个字符)
- LCD_write_command(0xc7); //自建字符显示位置
- LCD_write_data(0X00); //自建字符的第一个数据地址(1602 总共可以自建8个字符)
- LCD_write_command(0x9b); //自建字符显示位置
- LCD_write_data(0X00); //自建字符的第一个数据地址(1602 总共可以自建8个字符)
- while(1)
- {
-
- unsigned int t;
- qian_OK=0; // 标志变量归零
- k=0; // 累计量归零
- P2=0x00;
- //for(t=0;t<60000;t++) // 此数值小于5000则GPS数据更新太慢,甚至不正常;大于7000则会让温度更新时间超过三秒。
- {
- GPS_JieXi();
- P2=0xff;
- delay1(10);
- }
-
-
- //datapros(Ds18b20ReadTemp()); //温度数据处理函数
- //dataprosN(Ds18b20ReadTempN()); //温度数据处理函数
- //dataprosS(Ds18b20ReadTempS()); //温度数据处理函数
-
-
- }
- }
- ) //若是统一的数据头,则作为数组第一个元素
- {
- RX_Count = 0;
- Flag_GPS_OK = 0;
- }
- RX_Buffer[RX_Count++] = temp; //收到的数据放到数组中
- if(RX_Count >= 66) //序号大于66的数据无用,统一放到第66位覆盖掉
- {
- RX_Count = 66;
- }
- if(temp == '*') //收到*,则完成一帧数据的接收,不管是否完整有效
- {
- Flag_GPS_OK = 1; //标志变量置为1
- }
- ES=1; //重新打开串行口中断
- }
复制代码- /*******************************************************************************
- 此程序使用 22.1184MHz 晶振
- *******************************************************************************/
- #include "STC12C5A60S2.h"
- #include "1602IIC.h"
- #include "GPS.h"
- #include "18b20.h"
- uchar code table1[]={0x00,0x00,0x10,0x07,0x08,0x08,0x07,0x00};//字符℃
- //****************************************************
- // 主函数 ***
- //****************************************************
- void main()
- {
- unsigned char num;
- Init_Lcd(); //LCD初始化
- Uart2_Init(); //串口初始化
- LCD_write_command(0xc0);
- LCD_write_word("Welcome to use GPS..");
- Delay1ms();
- LCD_write_command(0x01);
-
- LCD_write_command(0x80);
- LCD_write_word("n:");
- LCD_write_command(0xc0);
- LCD_write_word("w:");
- LCD_write_command(0x94);
- LCD_write_word("s:");
- LCD_write_command(0x8a);
- LCD_write_word("D:");
- LCD_write_command(0xca);
- LCD_write_word("T:");
-
-
- Write_LCD(5,0,".");
- Write_LCD(5,1,".");
- LCD_write_command(0x99);
- LCD_write_word(".");
-
- LCD_write_command(0x9E);
- LCD_write_word("*:");
-
- LCD_write_command(0x40); //自建字符的第一个指令地址
- for(num=0;num<8;num++)
- {
- LCD_write_data(table1[num]);
- }
- LCD_write_command(0x87); //自建字符显示位置
- LCD_write_data(0X00); //自建字符的第一个数据地址(1602 总共可以自建8个字符)
- LCD_write_command(0xc7); //自建字符显示位置
- LCD_write_data(0X00); //自建字符的第一个数据地址(1602 总共可以自建8个字符)
- LCD_write_command(0x9b); //自建字符显示位置
- LCD_write_data(0X00); //自建字符的第一个数据地址(1602 总共可以自建8个字符)
- while(1)
- {
-
- unsigned int t;
- qian_OK=0; // 标志变量归零
- k=0; // 累计量归零
- P2=0x00;
- //for(t=0;t<60000;t++) // 此数值小于5000则GPS数据更新太慢,甚至不正常;大于7000则会让温度更新时间超过三秒。
- {
- GPS_JieXi();
- P2=0xff;
- delay1(10);
- }
-
-
- //datapros(Ds18b20ReadTemp()); //温度数据处理函数
- //dataprosN(Ds18b20ReadTempN()); //温度数据处理函数
- //dataprosS(Ds18b20ReadTempS()); //温度数据处理函数
-
-
- }
- }
复制代码
所有资料51hei提供下载:
22.1184MHz版本-最终版本IIC-GPS+1602+C52-日期、时间、速度、3温度 - (GPS接串口2).7z
(40.08 KB, 下载次数: 172)
|