原來做的4位數(shù)碼管時鐘用的是ds1302時鐘芯片,跑的還是挺準的,現(xiàn)在在家里正用,那個是1.5寸的?吹接胁捎胓ps模塊接收衛(wèi)星的時鐘信號做家庭時鐘用的,就照貓畫虎做了一個,的確不錯,這個精度是微秒級別的,只要接收到信號那效果沒得說。因為我買的模塊帶室外天線,所以時鐘上面就不需要調(diào)整時間的按鍵了,只要把天線放在窗邊,數(shù)碼管就很快顯示出精確的時間來。
這次我還是用的洞洞板焊的電路,數(shù)碼管是舊板子拆的1寸,GPS模塊是淘寶來的,5元一個,其他小零件是淘寶來的。6位帶秒顯示的感覺更好一些。唯一遺憾的是要離窗戶近些,在農(nóng)村比較不錯,不必放窗前也能收到信號,這個很奇怪。
這個時鐘最初是分四部分:數(shù)碼管、三極管驅(qū)動、單片機系統(tǒng)和GPS模塊。所以就有四塊板子相連,實驗成功以后重新把數(shù)碼管和三極管驅(qū)動設計在一塊板子上 ,這樣兩塊板子前后固定比較美觀些,GPS模塊很小,固定在中間看不見。
先來個現(xiàn)在正常運行的視頻:
用Sprint-Layout設計電路板非常方便,標準的2.54mm的孔間距,修改也很方便,看看我的單片機和驅(qū)動部分圖:

下面是最初實驗的樣子:
單片機背面和前面


四塊板子連接在一起

通電顯示,由于數(shù)碼管參數(shù)的離散性及數(shù)碼管動態(tài)顯示和拍攝的原因,亮度不是均勻的,實際顯示還是可以的,。

下面是安裝在一起的樣子,有兩個表頭的是維修電源,暫時給時鐘供電用的,可以無視。后面找個5v電源即可,反正耗電也不大的。
附上源代碼 的精華部分:(GPS數(shù)據(jù)接收部分,數(shù)碼管顯示比較簡單的)
void TimerInit() //初始化程序
{
TMOD=0x21;
TH0 = 0xF1; //4ms左右
TL0 = 0x9A;
EA=1;
ET0=1;
TR0=1;
SCON = 0x50;//使用串行工作方式1,10位異步收發(fā)8位數(shù)據(jù),波特率可變(由T1的溢出率控制)
TH1 = 0xFD;//9600波特率的初值
TL1 = TH1;//9600波特率的初值
ES = 1;
TR1 = 1;
}
void main()
{
TimerInit();
while(1)
{
if((rev_stop==1)&&(buf[5]=='C'))//如果接收到GPS模塊的GPRMC數(shù)據(jù)
{
ES=0;
hour= (buf [7]-0x30)* 16+ buf[8] -0x30;
min= (buf [9]-0x30)* 16+ buf[10]-0x30;
sec= (buf[11]-0x30)* 16+ buf[12]-0x30;
hour= hour / 16 * 10 + hour % 16;
hour= (hour+8) % 24;//UTC Time換算成北京時間
hour=hour/10*16+hour%10;
ES=1;
rev_stop=0;
}
}
}
void Timer0() interrupt 1 //中斷函數(shù)
{
TH0 = 0xF1;
TL0 = 0x9A;
Display();//定時器兄弟簡單而單調(diào)的工作,很輕松的。每4ms刷新下數(shù)碼管,全年無休哦
}
/***************************************************************/
/*************************單片機串口數(shù)據(jù)接收**************************/
/***************************************************************/
void Uart_Receive(void) interrupt 4
{
unsigned char ch,num;
ES = 0;
if (RI)//如果接收完成則進入
{
ch = SBUF;
if (ch == '$') //如果收到字符'$',便開始接收
{
rev_start = 1;
rev_stop = 0; //接收停止標志
}
if (rev_start == 1) //標志位為1,開始接收
{
buf[num++] = ch; //字符存到數(shù)組中
if (ch == '\n') //如果接收到換行
{
buf[num] = '\n';
rev_start = 0;
rev_stop = 1; //接收停止標志
num = 0;
}
}
}
RI = 0; //RI清0,重新接收
ES = 1; //串口1中斷允許
}
|