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

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


四塊板子連接在一起

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

下面是安裝在一起的樣子,有兩個表頭的是維修電源,暫時給時鐘供電用的,可以無視。后面找個5v電源即可,反正耗電也不大的。
附上源代碼 的精華部分:(GPS數據接收部分,數碼管顯示比較簡單的)
void TimerInit() //初始化程序
{
TMOD=0x21;
TH0 = 0xF1; //4ms左右
TL0 = 0x9A;
EA=1;
ET0=1;
TR0=1;
SCON = 0x50;//使用串行工作方式1,10位異步收發8位數據,波特率可變(由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數據
{
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 //中斷函數
{
TH0 = 0xF1;
TL0 = 0x9A;
Display();//定時器兄弟簡單而單調的工作,很輕松的。每4ms刷新下數碼管,全年無休哦
}
/***************************************************************/
/*************************單片機串口數據接收**************************/
/***************************************************************/
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; //字符存到數組中
if (ch == '\n') //如果接收到換行
{
buf[num] = '\n';
rev_start = 0;
rev_stop = 1; //接收停止標志
num = 0;
}
}
}
RI = 0; //RI清0,重新接收
ES = 1; //串口1中斷允許
}
|