一、前言
今天給大家推薦一個51單片機小實驗,帶你使用51單片機做一款簡易的電子時鐘,其中計時模塊采用DS1302硬件模塊,顯示采用LCD顯示屏,具體怎么實現開來一起看看吧!
二、DS1302模塊介紹
DS1302 是 DALLAS 公司推出的涓流充電時鐘芯片,內含有一個實時時鐘和31字節靜態 RAM,通過簡單的串行接口與單片機進行通信。實時時鐘、日歷電路提供秒、分、時、日、周、月、年的信息,每月的天數和閏年自動補償等多種功能。時鐘操作可通過 AM/PM 指示,DS1302 與單片機之間能簡單地采用同步串行的方式進行通信,簡易三線SPI通信模式:
RES 復位
I/O 數據線
SCLK 串行時鐘
SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節約了芯片的管腳,同時為PCB的布局上節省空間,提供方便,正是出于這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議,比如MSP430單片機系列處理器。
DS1302時鐘芯片的工作原理如下:
DS1302芯片內部有一組定時器和寄存器,通過這些寄存器可以實現時鐘的讀寫操作。
DS1302通過三根引腳與外部設備連接,分別是RST、DAT和CLK。RST引腳用于復位
DS1302,DAT引腳用于數據傳輸,CLK引腳用于時鐘信號。
DS1302芯片使用BCD碼表示時間信息,即用4位二進制數表示一個十進制數。例如,分的BCD碼為00H到59H。
三、驅動DS1302的代碼
以下是使用51單片機驅動DS1302時鐘芯片的代碼,具體實現步驟如下:
3.1 初始化DS1302時鐘芯片
voidDS1302Init(){
//初始化DS1302時鐘芯片
DS1302WriteByte(0x8E,0x00);
//關閉寫保護
DS1302WriteByte(0x90,0x00);
}
3.2 讀取DS1302時鐘芯片的時間
voidDS1302ReadTime(unsignedchar*p){ //讀取DS1302時鐘芯片的時間 unsignedchari; DS1302WriteByte(0xBF,0x00); for(i=0;i7;?i++)?{ ????????p[i]?=?DS1302ReadByte(); ????} }
3.3 設置DS1302時鐘芯片的時間
voidDS1302WriteTime(unsignedchar*p){
//設置DS1302時鐘芯片的時間
unsignedchari;
DS1302WriteByte(0xBE,0x00);
for(i=0;i7;?i++)?{
????????DS1302WriteByte(p[i],?0x00);
????}
}
3.4 讀取DS1302時鐘芯片的RAM
//從DS1302讀取一個字節的數據
voidDS1302ReadByte(uchar*dat){
uchari;
for(i=0;i8;?i++)?{
????????SCLK?=?0;
????????_nop_();
????????*dat?|=?IO?<
四、讀取DS1302時鐘芯片的RAM
DS1302時鐘芯片有31個字節的RAM空間,可以用來存儲一些數據。在實際應用中,我們可能需要讀取這些存儲的數據。讀取DS1302的RAM和讀取寄存器類似,也需要先向DS1302發送讀取RAM的命令,然后再讀取RAM的內容。
讀取DS1302的RAM需要使用到DS1302的另一個引腳——CE(片選使能)引腳,該引腳在讀寫DS1302的RAM時需要保持為低電平。讀取RAM的過程如下:
4.1 發送讀取RAM的命令
向DS1302寫入讀取RAM的命令:0x61。DS1302會自動切換到RAM讀取模式,準備將RAM中的數據傳輸給單片機。
DS1302Write(0x61);//發送讀取RAM命令
4.2 讀取RAM的內容
發送讀取RAM命令后,就可以讀取RAM中的數據了。讀取RAM的數據需要先讀取DS1302的數據引腳(IO引腳)上的高電平脈沖,然后再讀取8個位的數據。具體的讀取過程可以使用DS1302ReadByte函數實現,該函數會讀取一個字節的數據。
for(i=0;i31;?i++)?{
????DS1302ReadByte(&byte);?//?讀取一個字節的數據
????ram[i]?=?byte;?//?存儲到數組中
}
讀取完RAM后,我們可以將其存儲到一個數組中,方便后續的使用。
4.3 讀取部分單獨代碼實現(注重邏輯)
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSCLK=P2^0;
sbitIO=P2^1;
sbitCE=P2^2;
uchards1302_read_ram(ucharaddress)
{
uchari,dat;
CE=0;
_nop_();
SCLK=0;
_nop_();
CE=1;
_nop_();
IO=0;//寫指令
SCLK=0;
_nop_();
SCLK=1;
_nop_();
IO=address|0xc0;//選擇地址并讀取RAM
for(i=0;i8;?i++)?{
????????SCLK?=?0;
????????_nop_();
????????SCLK?=?1;
????????_nop_();
????}
????IO?=?0;?//?接收數據
????for?(i?=?0;?i?8;?i++)?{
????????dat?>>=1;
if(IO)dat|=0x80;
SCLK=0;
_nop_();
SCLK=1;
_nop_();
}
CE=0;
returndat;
}
在上述代碼中,ds1302_read_ram 函數接收一個參數 address,用于指定要讀取的 RAM 地址,返回一個字節表示該地址處的 RAM 數據。
該函數的具體實現過程如下:
置 CE 為低電平,并延遲一段時間。
置 SCLK 為低電平,并延遲一段時間。
置 CE 為高電平,并延遲一段時間。
置 IO 為低電平,表示寫指令。
置 SCLK 為低電平,并延遲一段時間。
置 SCLK 為高電平,并延遲一段時間。
置 IO 為 address | 0xc0,即選擇地址并讀取 RAM。
依次進行 8 次時鐘上升沿,在每個上升沿時讀取數據位。
置 CE 為低電平。
返回讀取到的數據。
需要注意的是,讀取 RAM 數據時需要將地址的最高位(即 bit7)置為 1,以表示要讀取 RAM。另外,在讀取數據位時需要依次進行 8 次時鐘上升沿,且每次讀取時需要先右移數據,再將新數據左移并或上讀到的數據位。
五、整體代碼實現
下面是使用51單片機和DS1302時鐘芯片實現的簡易電子時鐘的代碼實現。代碼中包含了DS1302的初始化、時鐘讀取、RAM讀寫等基本功能。
#include
#include"LCD1602.h"
#include"DS1302.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitbeep=P3^6;//定義蜂鳴器接口
voidmain()
{
ucharyear,month,day,hour,minute,second;//年月日時分秒
ucharstr_data[11],str_time[11];//用于存放LCD上顯示的日期和時間
LCD_Init();//初始化LCD顯示屏
DS1302_Init();//初始化DS1302時鐘芯片
//將時間初始化為2023年2月21日0時0分0秒
DS1302_Write(0x8e,0);//關閉寫保護
DS1302_Write(0x80,0x23);//年份
DS1302_Write(0x82,0x02);//月份
DS1302_Write(0x84,0x21);//日期
DS1302_Write(0x86,0x00);//時鐘
DS1302_Write(0x88,0x00);//分鐘
DS1302_Write(0x8a,0x00);//秒鐘
DS1302_Write(0x8e,0x80);//開啟寫保護
while(1)
{
//讀取DS1302時鐘芯片中的年月日時分秒
year=DS1302_Read(0x80);
month=DS1302_Read(0x82);
day=DS1302_Read(0x84);
hour=DS1302_Read(0x86);
minute=DS1302_Read(0x88);
second=DS1302_Read(0x8a);
//將年月日時分秒轉換成字符串
sprintf(str_data,"Data:20%02x-%02x-%02x",year,month,day);
sprintf(str_time,"Time:%02x:%02x:%02x",hour,minute,second);
//在LCD上顯示日期和時間
LCD_Write_String(0,0,str_data);
LCD_Write_String(0,1,str_time);
Delay_Ms(1000);//延時1秒
}
}
六、顯示效果

審核編輯:湯梓紅
-
單片機
+關注
關注
6076文章
45494瀏覽量
670262 -
51單片機
+關注
關注
278文章
5714瀏覽量
134266 -
時鐘芯片
+關注
關注
2文章
296瀏覽量
42102 -
DS1302
+關注
關注
8文章
451瀏覽量
53606 -
電子時鐘
+關注
關注
11文章
205瀏覽量
26531
發布評論請先 登錄
基于51單片機DS1302時鐘芯片12864顯示時鐘(原理圖和代
DS1302電子時鐘的組成及設計方案的介紹
51單片機DS1302實時時鐘驅動程序
使用51單片機實現DS1302時鐘芯片的顯示資料和程序免費下載
使用51單片機和DS1302芯片設計的LED時鐘的C語言程序和工程文件
基于51單片機的電子時鐘
使用51單片機和DS1302時鐘芯片做一個簡易的電子時鐘
評論