用ds1302製作一個精密的電子時鐘

2021-01-11 電子產品世界
題目:用ds1302製作一個精密電子時鐘

感想:我看視頻的時候講的是DS12CR887這塊晶片,兩塊畢竟是不一樣的,所以,我只是看了他講怎樣看時序,之後的就沒再看了。我就拿著自己下載列印的DS1302數據手冊,研習,研習,再研習。還查了書上的,網上的,源程序。但是,你別指望著誰會把所有的東西都給你寫上去。只能作為參考。後來,我終於寫出了一個程序,可是一編譯,就漏洞百出。最主要的有兩點:for循環和BCD碼。不過還好,都得到了很好的解決。

本文引用地址:http://www.eepw.com.cn/article/201611/320167.htm

解決方案:

#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar data table[]="2009-01-01 Mon.";
uchar data table1[]=" 00:00:00";
uchar code xingqi[]="Mon. Tue. Wed. Thu. Fri. Sat. Sun.";
uchar num;
uchar hour,min,sec,week,day,month,year;
sbit ds1302_sclk=P1^4;
sbit ds1302_io=P1^5;
sbit ds1302_ce=P2^2;
sbit acc0=ACC^0;
sbit acc7=ACC^7;
sbit lcdrs=P1^7; //埠定義
sbit lcdrw=P1^6;
sbit lcde=P2^4;
sbit le=P3^6;
sbit leden=P2^5;
sbit dkle=P3^7;
void delay(uint a);
void write_byte(uchar dat)//寫入一個字節
{
uchar i;
ACC=dat;
for(i=8;i>0;i--)
{
ds1302_io=acc0;
ds1302_sclk=1;
ds1302_sclk=0;
ACC=ACC>>1;
}
}

uchar read_byte() //讀出一個字節
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
acc7=ds1302_io;
ds1302_sclk=1;
ds1302_sclk=0;
}
return(ACC);
}

void s_write(uchar add,uchar dat)//單字節寫入子函數
{
ds1302_ce=0;
ds1302_sclk=0;
ds1302_ce=1;
write_byte(add);
write_byte(dat);
ds1302_sclk=1;
ds1302_ce=0;
}
uchar s_read(uchar add) //單字節讀出子函數
{
uchar temp;
ds1302_ce=0;
ds1302_sclk=0;
ds1302_ce=1;
write_byte(add);
temp=read_byte();
ds1302_sclk=1;
ds1302_ce=0;

temp=(temp/0x0a)*10+temp%0x0a;

return(temp);
}
void set_ds1302(uchar *pClock)//設置ds1302的時間
{
uchar i;
uchar add=0x80;
EA=0;
s_write(0x8e,0x00);
for(i=7;i>0;i--)
{
s_write(add,*pClock);
pClock++;
add+=2;
}
s_write(0x8e,0x80);
EA=1;
}
void read_ds1302(uchar Curtime[]) //讀取ds1302的時間
{
uchar i;
uchar add=0x81;
EA=0;
for(i=7;i>0;i--)
{
Curtime[i]=s_read(add);
add+=2;
}
EA=1;
}
void write_com(uchar com) //寫命令子函數
{
lcde=0;
lcdrw=0;
lcdrs=0;
delay(1);
lcde=1;
delay(1);
P0=com;
delay(1);
lcde=0;
}
void write_data(uchar dat)//寫數據子函數
{
lcde=0;
lcdrw=0;
lcdrs=1;
delay(1);
lcde=1;
delay(1);
P0=dat;
delay(1);
lcde=0;
}
void init()
{
month=1;
day=1;
year=9;

lcde=0; //LCD1602初始化
le=0;
leden=0;
write_com(0x38);
delay(100);
write_com(0x38);
delay(50);
write_com(0x38);
delay(10);
write_com(0x08);
write_com(0x01);
write_com(0x0c);
write_com(0x80);

for(num=0;num<15;num++) //在第一行顯示「 2000-00-00 Mon.」
{
write_data(table[num]);
}
write_com(0x80+0x40);
for(num=0;num<10;num++) //在第二行末尾顯示「 00:00:00」
{
write_data(table1[num]);
}

}
void write_time(uchar add,uchar dat) //寫入時間子函數
{
uchar shi,ge;
shi=dat/16;
ge=dat%16;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_riqi(uchar add,uchar dat) //寫入日期子函數
{
uchar shi,ge;
shi=dat/16;
ge=dat%16;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_xingqi(uchar dat) //寫入星期子函數
{
write_com(0x80+0x0b);
switch(dat)
{
case 1: for(num=0;num<4;num++)
{
write_data(xingqi[num]);
};break;
case 2: for(num=5;num<9;num++)
{
write_data(xingqi[num]);
};break;
case 3: for(num=10;num<14;num++)
{
write_data(xingqi[num]);
};break;
case 4: for(num=15;num<19;num++)
{
write_data(xingqi[num]);
};break;
case 5: for(num=20;num<24;num++)
{
write_data(xingqi[num]);
};break;
case 6: for(num=25;num<29;num++)
{
write_data(xingqi[num]);
};break;
case 7: for(num=30;num<34;num++)
{
write_data(xingqi[num]);
};break;

}
}
void main()
{
init();
delay(5);
s_write(0x8e,0x00); //控制寫入WP=0
s_write(0x90,0xa5);
s_write(0x80,0x00); //秒
s_write(0x82,0x20); //分
s_write(0x84,0x09); //時24時制
s_write(0x86,0x27); //日
s_write(0x88,0x08); //月
s_write(0x8a,0x04); //星期
s_write(0x8c,0x09); //年 */
s_write(0x8e,0x80);//控制寫入WP=1;

P0=0xff;

while(1)
{
sec=s_read(0x81);
write_time(8,sec);
write_com(0x80+0x40+9);
min=s_read(0x83);
write_time(5,min);
write_com(0x80+0x40+6);
hour=s_read(0x85);
write_time(2,hour);
write_com(0x80+0x40+3);
week=s_read(0x8b);
write_xingqi(week);
write_com(0x80+0x0d);
day=s_read(0x87);
write_riqi(8,day);
write_com(0x80+9);
month=s_read(0x89);
write_riqi(5,month);
write_com(0x80+6);
year=s_read(0x8d);
write_riqi(2,year);
write_com(0x80+3);
}
}
void delay(uint a) { //延時子函數
uint i,j;
for(j=a;j>0;j--)
for(i=250;i>0;i--) ;
}

相關焦點

  • SPI時鐘晶片DS1302的應用
    DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為
  • DS1302時鐘模塊的使用
    ds1302.h庫文件已經上傳,有需要的自行下載。注意ds1302.h要與zhy.h配合使用。接下來我詳細講解一下,ds1302.h庫文件的使用方法。uchar time_buf[8] = {0x20,0x10,0x06,0x01,0x23,0x59,0x55,0x02};//2010年6月1號23點59分55秒星期二注意,time_buf數組中只能為BCD碼,也就是只能為十進位,不能出現十六進位或者其它進位字符ds1302_init()函數是用來給DS1302進行初始化設置的
  • Arduino提高篇22—實時時鐘DS1302
    很多電子愛好者都熱衷製作電子時鐘來練手,這些時鐘會使用數碼管、點陣屏、LCD液晶屏、OLED屏、TFT屏等顯示模塊,所使用的RTC時鐘晶片也各不相同,DS1302、DS3231、DS12C887等。通過單片機等MCU驅動RTC模塊,讀取時間數據並交給顯示模塊進行展示,還可以加入按鍵來調節時鐘,可以說是一個非常全面的練手項目。
  • ds1302是什麼,ds1302引腳圖和寄存器詳解
    簡單的來說就是時鐘晶片,作用就是計時。根據百度百科來說的話就是DS1302是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘晶片。它可以對年、月、日、周、時、分、秒進行計時,且具有閏年補償等多種功能,工作電壓為2.0V~5.5V。   採用三線接口與CPU進行同步通信,並可採用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個31×8的用於臨時性存放數據的RAM寄存器。
  • 淺談單片機c語言模塊化編程-附ds1302時鐘晶片驅動程序
    本文引用地址:http://www.eepw.com.cn/article/201611/318723.htmC51中為了節省ram資源,數組用code定義在rom中,這樣定義數組就不能重新賦值。自己對著例程一條一條的看。真心表示沒有發現錯誤。最後把函數一個一個替換成例程中的。
  • ds1302引腳圖,ds1302引腳圖功能詳解
    打開APP ds1302引腳圖,ds1302引腳圖功能詳解 發表於 2017-10-19 15:39:22   DS1302是時鐘晶片
  • ds1302晶振不起振_ds1302晶振電路圖
    打開APP ds1302晶振不起振_ds1302晶振電路圖 發表於 2017-08-26 18:31:28   實時時鐘電路DS1302
  • LCD1602液晶顯示DS1302實時時鐘Proteus仿真
    LCD*******sbitLCDRS=P2^0; //LCD數據/命令選擇端sbitLCDRW=P2^1;sbitLCDEN=P2^2; //LCD使能新號端//******DS1302******sbitIO=P1^0; //1302數據線sbitSCLK=P1^1; //1302時鐘線
  • 時鐘晶片接口分析與DS1302典型原理電路圖
    每個程序的運行都需要頻率這個東西來恆量,所以我們就會需要用到時鐘晶片,它才會產生時鐘頻率。時鐘晶片是日常生活中應用最為廣泛的消費類電子產品之一。它為人們提供精確的實時時間,可以對年、月、日、周日、時、分、秒進行計時,且具有閏年補償等多種功能;或者為電子系統提供精確的時間基準,目前實時時鐘晶片大多採用精度較高的晶體振蕩器作為時鐘源。
  • ds1302讀取數據問題分析及解決
    DS1302內部有一個31×8的用於臨時性存放數據的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/後備電源雙電源引腳,同時提供了對後備電源進行涓細電流充電的能力。   結構   DS1302的引腳排列,其中Vcc2為主電源,VCC1為後備電源。在主電源關閉的情況下,也能保持時鐘的連續運行。
  • DS1302時鐘晶片顯示時間C51程序
    當然時間顯示也可以用單片機的定時器來控制,比起延時     子函數來說較精準。       case 4:       case 6:       case 8:       case 10:           tmpdisplay[0]=tmpdata[2]/16;           tmpdisplay[1]=tmpdata[2]0x0f;           tmpdisplay[2]=10; //在時與分之間加一個
  • ds1302帶鬧鐘功能的單片機控制的時鐘程序
    埠自己修改一下 用的1602液晶顯示#include#include#define uchar unsigned char#define uint unsigned intsbit wela=P2^7;sbit nz=P2^3;//鬧鐘sbit lcdrs=P3^5;sbit lcdwr=P3^6;sbit lcden
  • 基於STM32和DS1302設計的時鐘程序
    extern u8 d[7]; //依次為年,周,月,日,時,分,秒extern u8 disp[14];//依次為年[0]【1】;周[2]【3】;月[4]【5】//***********************日[6]【7】;時[8]【9】;分[10]【11】;秒[12]【13】void ds1302d_convert(void); //如果用低
  • ATMEGA16四線驅動LCD顯示時間-DS1302
    _sec_add0x80//秒數據地址#define ds1302_min_add0x82//分數據地址#define ds1302_hr_add_sec_add,0x80);//秒寄存器的第7 位時鐘停止位設置為0 時起動時鐘開始、設置為1時時鐘停止運行 DS1302_WriteByte(ds1302_year_add,0x10); //年 DS1302
  • arduino設置ds1302電子時鐘模塊
    DS1302 是美國 DALLAS 公司推出的一種高性能、低功耗、帶 RAM 的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能。工作電壓為 2.5V~5.5V。採用三線接口與 CPU 進行同步通信,並可採用突發方式一次傳送多個字節的時鐘信號或 RAM 數據。
  • 告別電子小白,8個優選DS1302數字時鐘方案大合輯
    數字時鐘是一個在主屏幕顯示數字時間和日期的 android 桌面插件。是一款樸實簡約的時鐘 widget,能展示時間,觸摸激活鬧鐘和日曆,並且字體顏色都可以進行設置,界面看起來十分的簡潔大方,有iPhone 的氣勢!有大量的自定義功能,可以為時間和日期設置數百萬中RGB顏色,可以選擇不同的背景,可以顯示/隱藏上午/下午, 選擇Widget 單擊操作,支持多國語言以及蜂窩平板。
  • 物理學家製作了一個極其精密的時鐘,通過量子糾纏來保持時間
    幾年前,麻省理工學院和塞爾維亞貝爾格勒大學的研究人員提出,量子糾纏可以將時鐘推到這個模糊的邊界之外。現在,我們有了實驗形式的概念證明。物理學家將鐿-171原子云與從周圍鏡子反射的光子流連接在一起,並測量了它們微小擺動的時間。
  • 《我的世界》時鐘怎麼製作 時鐘製作教程
    導 讀我的世界時鐘製作方式是用四個金錠、一個紅石在工作檯合成一個時鐘,時鐘在物品展示架上、物品欄或者快捷欄、手中以及其他地方都會顯示時間,時鐘可以作為時間之瓶的素材。
  • DS1302時鐘晶片介紹_DS1302的使用技巧和特點詳解
    DS1302 是DALLAS 公司推出的涓流充電時鐘晶片,內含有一個實時時鐘/日曆和31 字節靜態RAM,通過簡單的串行接口與單片機進行通信。實時時鐘/日曆電路提供秒、分、時、日、日期、月、年的信息,每月的天數和閏年的天數可自動調整,時鐘操作可通過AM/PM 指示決定採用24 或12 小時格式。
  • 實時時鐘晶片DS1302
    DS1302是一種三線制的串行時鐘晶片,即CE(片選),SCLK(時鐘),I/O(雙向數據)。4.時鐘運行:秒寄存器的最高位(BIT7)是作為時鐘控制位,當為邏輯1時,時鐘停止,為0時鐘運行。所以如果要時鐘運行的話就必須將秒寄存器的最高位清05.12/24小時模式:小時寄存器的第7位(最高位)是選擇12小時制還是24小時制。當為邏輯1時選擇12小時,邏輯0選擇24小時。