這可以當做學習單片機之後的第一套作品
做單片機這塊確實非常有趣,比原來單純的編程要好多了,即動腦又動手,而且很容易入門。跟著網上down的郭天翔視頻教程學完了理論之後開始動手製作電子時鐘,電路就是一般的電路:一塊洞洞板,幾個晶片座,杜邦線就OK了,至於排針用不用都行,可以直接把杜邦線焊在晶片座上。
電路搞定之後就是連線,根據DS1302晶片說明書(pdf等)裡面的引腳介紹來考慮把這些引腳連到單片機的相關引腳上。Vcc2引腳就接Vcc,Vcc1接3V紐扣電池,GND接地,X1 X2 32.768KHz 晶振管腳,此外就是 3個訊號線啦!
RST 複位腳
I/O 資料輸入/輸出引腳
SCLK 串列時鐘
我們還可以焊上串口母頭,外加一片Max232,這樣就可以直接和板子上的單片機(我用的是STC89C52RC)串口通訊
Lcd1602用的是P0口,要焊上8個10K的上拉電阻;
還有一個溫度感應器18b20,實現代碼如下
uint rd_temperature() //讀取溫度值
{
uchar a=0,b=0;
uint t=0;
float tt=0;
rst_18b20(); //複位
wr_18b20(0xcc); //跳過ROM
wr_18b20(0x44); //啟動溫度轉換
rst_18b20(); //再次對18B20操作時,需要重新複位一次
wr_18b20(0xcc); //跳過ROM
wr_18b20(0xbe); //讀取內部RAM的內容
a=rd_18b20(); //讀溫度值低位(內部RAM的第0個位元組)
b=rd_18b20(); //讀溫度值高位(內部RAM的第1個位元組)
t=b;
t<<=8; //溫度值的高8位放在t的高8位
t=t|a; //溫度值的低8位放在t的低8位
if(t<0x0fff) //判斷溫度值得正負值
tflag=0; //tflag=0溫度值為正
else
{
t=~t+1; //溫度值為負,負值以補碼形式存放,這裡要將其還原成原碼
tflag=1; //tflag=1溫度值為負
}
tt=t*0.0625;
t = tt*100 ;
return(t);
}
//***********************************************//
void tem_conv() //溫度轉換
{
uchar flagdat ;//定義溫度值符號
if(tflag==0)
temdata[4]=flagdat=0x20;//溫度為正不顯示符號
else
temdata[4]=flagdat=0x2d;//負溫度顯示負號:-
temdata[0]=tdat/1000+0x30;//溫度十位
temdata[1]=tdat%1000/100+0x30;//溫度個位
temdata[2]=tdat%100/10+0x30;//小數十位
temdata[3]=tdat%10+0x30;//小數百位
/*if(temdata[0]==0x30)
{temdata[0]=0x20;//
if(temdata[1]==0x30)
{
temdata[1]=0x20;//
}
}*/
}
再者就是一些開關了,可以用杜邦線相連。
一切就緒之後就是編程,這裡面要注意一點就是這個晶片第一次使用的時候需要一系列初始化設定,最重要的就是晶振起振:
DS1302_write_byte(0x8e,0x00) ;//允許寫操作
DS1302_write_byte(0xc8,0xf0) ; //寫入初始化標誌 ,系統上電。
接著就是年到秒的初始化如:
DS1302_write_byte(0x8c,0x10) ;//年
讀時間為:
timedata[0] = DS1302_read_byte(0x8d) ; //年
定時鬧鈴蜂鳴器方法:void alarm_check(void)
秒錶功能STOPWATCH
/****************************************************************
底層驅動函數(指定地址寫一個位元組的資料)
*****************************************************************/
void DS1302_write_byte(uchar cmd , uchar dat)
{
DS1302_SCLK = 0 ;
DS1302_RST = 0 ;
DS1302_RST = 1 ;
DS1302_input(cmd) ;
DS1302_input(dat) ;
DS1302_RST = 0 ;
DS1302_SCLK = 1 ;
}
/****************************************************************
底層驅動函數(指定地址讀取一位元組的資料)
*****************************************************************/
uchar DS1302_read_byte(uchar cmd)
{
uchar receivedata = 0 ;
DS1302_SCLK = 0 ;
DS1302_RST = 0 ;
DS1302_RST = 1 ;
DS1302_input(cmd) ;
receivedata = DS1302_output() ;
DS1302_RST = 0 ;
DS1302_SCLK = 1 ;
return(receivedata) ;
}
定時器T0,T1,T2都要使用;
接著就是串口中斷實現串口通訊:
void Serial_Int() interrupt 4
uchar data Txddate[23];//電腦讀單片機時間
uchar Rxddate[13];//電腦寫單片機時間(同步調時)
再者就是重新整理時間顯示的方法及掃描按鍵控制調時的方法
void key_scan(void);
給出的void main(void)
{
T2CON=0x04; //設定T2CON寄存器
TMOD=0x21;
TL2=0x00;
TH2=0xdc;
TL1=0xfd;
TH1=0xfd;
SCON=0x50;
TR1=1;
ET2=1;
ES=1;
EA=1;
TH0 = 0xd8 ;
TL0 = 0xf0 ;
ET0 = 1 ;
TR0 = 0 ;
///////////讀者自己借鑒
這是電腦讀單片機時間和電腦同步調時的VB程式,
為簡單Text最後的1指MONDAY
參考資料:http://www.ctdisk.com/u/665442
!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!
這就是簡單的電子時鐘程式