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