因上次轉讓出的萬年歷集大成版控制板主要是針對我的數碼管設計的,測試中的程序沒法直接給LCD12864和LCD240128使用,這兩天應個別壇友要求,特調制了兩個小程序供買板的壇友直接拿過去使用。僅調試了個把小時,沒實際進行老化試驗,bug難免。還是老話,我主攻的數碼管顯示,沒精力折騰其他程序。而且工作合同即將到期,很多雜事要處理!
發現bug自己修改,并歡迎技術回帖!
第一個:GPS+LCD12864+DS3231
圖片:
大字體主界面(我故意調到911,以測試自動校時用的):
1.jpg (51.11 KB, 下載次數: 100)
下載附件
2017-9-18 17:31 上傳
鄭重提示:下載程序時必須將GPS斷開!
萬年歷運行中使用GPS時,電腦串口斷不斷開無所謂。
K4切換至GPS顯示界面:
2.jpg (53.44 KB, 下載次數: 72)
下載附件
2017-9-18 17:31 上傳
在此界面隨時使用K1(MOD)鍵強制手動校時。
GPS信息完整顯示界面:
3.jpg (52.22 KB, 下載次數: 84)
下載附件
2017-9-18 17:31 上傳
經緯度第一個小數點前為度,第一個小數點后為分。
如:東經118度59.00分。如需顯示秒,自己轉換:0.00*60=0.0秒。
定位信息出現后5分鐘自動與DS3231校時。
一廣州壇友打電話要求設個定時幾小時校準一次DS3231。
我說首先DS3231已經很準了,日誤差遠低于1s;第二如果把GPS一直掛在萬年歷上,還不如直接把GPS當RTC得了,何須浪費個DS3231!
因此特專做了個GPS+LCD12864的程序供選擇。
二、GPS+LCD12864
大字體主界面(早上手機拍的,將就看):
4.jpg (43.95 KB, 下載次數: 108)
下載附件
2017-9-18 17:31 上傳
GPS沒有溫度了,需要的自己加18B20。
K4切換至GPS信息界面:
5.jpg (35.81 KB, 下載次數: 96)
下載附件
2017-9-18 17:31 上傳
在運行模式下K3鍵是屏幕背景燈開關,GPS支持熱插拔。
只要波特率是9600,NMEA-0183協議就可以直接使用。
如果波特率是4800(GPS常用就這兩個波特率),就可以在程序里面將宏定義BAUD 9600改為 BAUD 4800
#define BAUD 9600
不建議使用4800,雖然波長大抗干擾好,畢竟速度慢,個人意見。
淘寶2手gps風險大,幾塊錢一個,一般都是隨機選擇不包好,本人曾買過8個壞了兩個,那兩個明顯受了外傷的,沒辦法,賣家連這最基本的常識都不知道?
最后教大家一招如何簡單測試GPS好壞的方法。
6.jpg (60.03 KB, 下載次數: 88)
下載附件
2017-9-18 17:31 上傳
外殼上有 9.6kps,恭喜你,我的程序你可以直接使用了。淘寶最常見的二手GPS八成以上都是韓國貨,質量也還過得去。
拆開,接線端子上一般是四根線,最外端的紅黑一般是5V供電+-。
如果不是紅黑色,那么在端子旁邊有個小紐扣電池,電池上有標正負。萬用表測短路檔,一端接電池-,另一端去測試接線端子,找到-。其次可以順著電池+極找到3.3v的穩壓塊,可以在穩壓塊上找到5V供電+。
5V接上通電后板載指示燈會亮:
7.jpg (72.4 KB, 下載次數: 97)
下載附件
2017-9-18 17:31 上傳
拿一發光二極管,二極管-接電源-。正極接任意一根未知端子。
如果發光二極管有規律的一秒亮一次就確定了這根是TX,即接萬年歷的RX。因為GPS是每秒發送一次數據,不管有沒有接受到衛星信號。如果兩根線分別接上發光二極管都常亮或不亮,那就只有默哀了。
常規情況下靠近電源+極的就是TX。
另一根線應該是RX用來刷機用的,我們空置不管。
因為常規的TTL排序是 VCC TX RX GND。
8.jpg (49.29 KB, 下載次數: 93)
下載附件
2017-9-18 17:31 上傳
還有個別種類gps帶綠色尋星指示燈,尋星中為綠色閃爍,定位成功為綠色常亮。如果剛送電就常亮綠燈顯然是壞了。
原本想淘它幾百個來測試挑選出無故障的再來一樂論壇轉讓的,但實在沒精力了……
最后向此次買萬年歷控制板的幾個壇友說聲抱歉。
本人平常上班,晚上下班回來都6:30過了,故平常沒法發快遞。所以我轉讓的東西都是挑周末或節假日發布。
這次剛好撞上了中秋節快遞爆倉,雖然是兩家小快遞,平常也還能實現江浙滬次日達的,這次居然發貨后3天都還沒出本地中轉,實在意外。
所以補發兩個GPS程序以精神安慰!
各收一個幣,象征一下:
GPS+LCD12864+DS3231大字體翻頁版:
GPS 3231 12864.rar
(99.22 KB, 下載次數: 89)
2017-9-18 17:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
GPS+LCD12864大字體翻頁版:
GPS 12864.rar
(69.63 KB, 下載次數: 60)
2017-9-18 17:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
應部分壇友要求,把二手GPS淘寶鏈接發了
提醒:
1、gps模塊實際會裹滿泥巴的,沒照片上好看
2、店主對gps一問三不知,她的主業是賣耳機等配件的
3、建議多淘幾個。自己承擔風險!
4、選這家是因為其價格算是比較低的了
5、本人跟賣家無任何經濟利益關系,里面最長的評論是我的
- /*---------------------------------------------------------------------------
- GPS+DS3231+LCD12864 萬年歷大字體翻頁版程序
- 單 片 機:STC89C58RD+
- 晶 振:12MHz
- 時鐘芯片:DS3231
- 液 晶 屏:LCM-12864-ST7920 LCM12864使用并口連接方式,PSB、RST接高電平
- GPS模塊 :JSA-S100 ATMEL方案
- 通信格式:NMEA0183
- 通信協議:9600,8,N,1
- 時 間:2014年9月10日
- ------------------------------------------------------------------------------*/
- /*
- 運行界面分 DS3231大字體 與 GPS時間定位 ;通過K4鍵切換,詳見下面 按鍵定義
- GPS界面獲取有效定位信息連續超過5min即自動給DS3231校時。
- 如果一些漢字不能正常顯示如"三"等,說明keil需打漢字補丁
- GPS支持熱插拔,如果供電電源質量差,插入GPS后LCD屏幕對比度會明顯變差!
- 經緯度顯示為DD.MM.MM(度分格式)
- 如東經:118.58.99 表示為118度58.99分
- 如果要顯示秒,則為0.99*60=59.4秒,需要的自己動手改進!!
- 程序僅經初步測試,用以臨時測試GPS、DS3231、LCD12864和【集大成萬年歷】控制板焊接組裝是否正常,并未經老化實驗!
-
- 核心程序都是博采眾長,自己付出的僅是刪減組合微調而已,向原作者致敬!*/
-
- /*-------------------------------頭文件---------------------------------------*/
- #include <reg52.h>
- #include <intrins.h>
- #include <string.h>
- #include <stdlib.h>
- #include "LCD12864.h"
- #include "DS3231.h"
- #include "nongli.h"
- #include "displaytime.h"
- #include "dashuzi.h"
- const char chHex[16] = "0123456789ABCDEF";
- /********************************************************************************************************************
- 以下為GPS部分定義 (如果純為顯示GPS信息只需要定義變量RsBuf[80]就夠了,兩個結構體可以不要,邊解析邊顯示 )
- ********************************************************************************************************************/
- //串口中斷需要的變量
- uchar seg_count; /** 逗號計數器 **/
- uchar byte_count; /** 位數計數器 **/
- uchar mode; /** 0:結束模式,1:命令模式,2:數據模式 **/
- uchar buf_full; /** 1:整句接收完成,相應數據有效。0:緩存數據無效 **/
- typedef xdata struct
- {
- uchar TIME[10];
- uchar VA[2];
- uchar WD[11];
- uchar WDNS[2];
- uchar JD[12];
- uchar JDWE[2];
- uchar DATE[9];
- } GPS_GPRMC;
- GPS_GPRMC gps;
- typedef xdata struct /** 作時區轉換時需要用到年、月、日進一 **/
- {
- uchar Hour;
- uchar Min;
- uchar Sec;
- uchar Day;
- uchar Mon;
- uchar Year;
- } TIMER;
- TIMER Timer;
- char idata RsBuf[80]; /** 全局變量 **/
- void InitBps(); /** 串口初始化 **/
- void UTCToLocal(TIMER *GPS_DataTmp);
- /**** 以上為GPS部分定義 ***************************************************/
- /*--------------------定義按鍵-----------------------------------------------*/
- sbit K1 = P3 ^ 4; //K1-進入設置;GPS模式下為強制校時
- sbit K2 = P1 ^ 7; //K2-調時模式下為 加
- sbit K3 = P1 ^ 6; //K3-調時模式下為 減;運行模式下為背景燈控制
- sbit K4 = P1 ^ 5; //K4-調時模式下為 確認、返回 ;運行模式下為DS3231與GPS運行界面切換
- sbit BLK = P2 ^ 0; //液晶背光控制輸出,低電平有效,PNP三極管控制。
- sbit Bell_Out = P1 ^ 2;
- /*---------------------函數聲明------------------------------*/
- void DelayM(uint);
- void Delay(int);
- void ds_w(void);
- void GetDS3231(void);
- void Conver_week(uchar year, uchar month, uchar day);
- /*-----------------------------定義全局變量------------------------------*/
- bit q = 0, w = 0; //調時標志位
- uchar yy, mo, dd, xq, hh, mm, ss, month_moon, day_moon, week, tiangan, dizhi, moontemp1, moontemp2; //定義時間映射全局變量(專用寄存器)
- signed char address, item, max, mini;
- /*-----------------------------延時函數 1MS/次-------------------------------*/
- void DelayM(uint a)
- {
- uchar i;
- while( --a != 0)
- {
- for(i = 0; i < 125; i++);
- }
- }
- /*-----------------------------日期、時間設置函數-----------------------------*/
- void tiaozheng(void)
- {
- yy = read_random(DS3231_YEAR);
- mo = read_random(DS3231_MONTH);
- dd = read_random(DS3231_DAY);
- week = read_random(DS3231_WEEK);
- lcm_w_test(0, 0x80);
- lcm_w_word("20"); //顯示內容字符20
- lcm_w_test(1, yy / 10 + 0x30); //函數參數1,代表本行寫數據,YY/10+0X30得出年十位數字的顯示碼地址,送顯示
- lcm_w_test(1, yy % 10 + 0x30);
- lcm_w_word("年");
- lcm_w_test(1, mo / 10 + 0x30);
- lcm_w_test(1, mo % 10 + 0x30);
- lcm_w_word("月"); //調用字符顯示函數,顯示文字 月
- lcm_w_test(1, dd / 10 + 0x30);
- lcm_w_test(1, dd % 10 + 0x30);
- lcm_w_word("日"); //顯示字符 日
- if(read_random(DS3231_HOUR) != hh) //如果程序中的小時與1302芯片中的不同,
- {
- hh = read_random(DS3231_HOUR); //刷新程序中的小時數據
- }
- lcm_w_test(0, 0x91); //第一個參數0,表示本行寫入LCM的是指令,指定顯示位置88H(第三行左端)
- lcm_w_test(1, (hh / 10) + 0x30); //顯示十位
- lcm_w_test(1, hh % 10 + 0x30); //顯示個位
- lcm_w_word("時");
- if(read_random(DS3231_MINUTE) != mm) //如果1302芯片中的分鐘數據與程序中的分鐘變量不相等
- {
- mm = read_random(DS3231_MINUTE) ; //刷新程序中的分鐘數據
- }
- lcm_w_test(1, (mm / 10) + 0x30); //向液晶寫數據,顯示分鐘的十位數
- lcm_w_test(1, mm % 10 + 0x30); //向液晶寫數據,顯示分鐘的個位數
- lcm_w_word("分");
- if(read_random(DS3231_SECOND) != ss) //如果1302芯片中的分鐘數據與程序中的秒鐘變量不相等
- {
- ss = read_random(DS3231_SECOND); //刷新程序中的秒鐘數據
- }
- lcm_w_test(1, (ss / 10) + 0x30); //向液晶寫數據,顯示分鐘的十位數
- lcm_w_test(1, ss % 10 + 0x30); //向液晶寫數據,顯示分鐘的個位數
- lcm_w_word("秒");
- }
- /**********************************************************************************************************/
- //調整時間子函數,設置鍵、數據范圍、上調加一,下調減一功能。
- void Set_time(unsigned char sel) //根據選擇調整的相應項目加1并寫入DS1302,函數參數是按動設置鍵的次數
- {
- write_com(0x30);
- write_com(0x06);
- lcm_w_test(0, 0x98); //第一參數0表示本行寫入指令,指定下面行的 調整 顯示起始位置為9AH
- lcm_w_word("★調整");//調用字符顯示函數,顯示 調整字樣
- if(sel == 5)
- {
- lcm_w_word("秒鐘");
- address = DS3231_SECOND;
- max = 59;
- mini = 0;
- tiaozheng(); //調用日期、時間調整函數
- ds_w(); //被調數據加一或減一函數
- tiaozheng();
- } //秒7,按動7次顯示 調整秒鐘
- //并指定秒鐘數據寫入1302芯片的地址是0x82,秒鐘數據的最大值是59,最小值是0
- if(sel == 4)
- {
- lcm_w_word("分鐘");
- address = DS3231_MINUTE;
- max = 59;
- mini = 0;
- tiaozheng();
- ds_w();
- tiaozheng();
- } //分鐘6,按動6次顯示 調整分鐘
- //并指定分鐘數據寫入1302芯片的地址是0x82,分鐘數據的最大值是59,最小值是0
- if(sel == 3)
- {
- lcm_w_word("小時");
- address = DS3231_HOUR;
- max = 23;
- mini = 0;
- tiaozheng();
- ds_w();
- tiaozheng();
- } //小時5,按動5次顯示 調整小時
- //規定小時數據寫入1302芯片的位置是0x84,小時數據最大值23,最小值是0
- if(sel == 2)
- {
- lcm_w_word("日期");
- address = DS3231_DAY;
- mo = read_random(DS3231_MONTH);//讀月數據
- yy = read_random(DS3231_YEAR);//讀年數據
- if(mo == 2 && yy % 4 != 0)
- {
- max = 28; //平年2月28天
- mini = 1;
- }
- if(mo == 2 && yy % 4 == 0)
- {
- max = 29; //閏年2月29天
- mini = 1;
- }
- if(mo == 1 || mo == 3 || mo == 5 || mo == 7 || mo == 8 || mo == 10 || mo == 12)
- {
- max = 31; //31天的月份
- mini = 1;
- }
- if(mo == 4 || mo == 6 || mo == 9 || mo == 11)
- {
- max = 30; //30天的月份
- mini = 1;
- }
- tiaozheng();
- ds_w();
- tiaozheng(); //調用日期、時間調整函數
- } //日3,按動3次顯示 調整日期
- //規定日期數據寫入1302的位置地址是0x86,日期最大值31,最小值是1
- if(sel == 1)
- {
- lcm_w_word("月份");
- address = DS3231_MONTH;
- max = 12;
- mini = 1;
- tiaozheng();
- ds_w();
- tiaozheng();
- } //月2,按動2次顯示 調整月份
- //規定月份寫入1302的位置地址是0x88,月份最大值12,最小值1
- if(sel == 0)
- {
- lcm_w_word("年份");
- address = DS3231_YEAR;
- max = 99;
- mini = 0;
- tiaozheng();
- ds_w(); //被調數據加一或減一函數
- tiaozheng(); //調用日期、時間調整函數
- } //年1,按動1次顯示 調整年份,
- //規定年份寫入1302的地址是0x8c,年份的最大值99,最小值0
- }
- /*****************************************************************************/
- //被調數據加一或減一,并檢查數據范圍,寫入1302指定地址保存
- void ds_w(void)
- {
- item = read_random(address);
- if(K2 == 0) //如果按動上調鍵
- {
- item++;//數加 1
- }
- if(K3 == 0) //如果按動下調鍵
- {
- item--;//數減 1
- }
- if(item > max) item = mini; //查看數值是否在有效范圍之內
- if(item < mini) item = max; //如果數值小于最小值,則自動等于最大值
- ModifyTime(address, item);
- }
- //=================================BEEP驅動===========================================//
- //需要定義Delay,輸出Bell_Out引腳
- /********************************************************************************************/
- void beep ( unsigned char a, unsigned char b,
- unsigned char c, unsigned char d)
- {
- for(; a > 0; a--) //第一個聲音的長度
- {
- Bell_Out = ~Bell_Out;//取反揚聲器驅動口,以產生音頻
- Delay(b);//音調設置延時
- }
- for(; c > 0; c--) //同上
- {
- Bell_Out = ~Bell_Out;
- Delay(d);//
- }
- Bell_Out = 1;
- }
- void Beep_y(void)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|