1. 程式人生 > >微控制器複習筆記005 -- DS1302時鐘晶片

微控制器複習筆記005 -- DS1302時鐘晶片

1、DS1302時鐘晶片的講解

待完成!!!

2、自己寫的DS1302晶片的配置檔案

//DS1302_SPIdriver.h
//DS1302_SPIdriver.h
#ifndef __SPIDRIVER_H__
#define __SPIDRIVER_H__

#include<reg52.h>     //包含微控制器暫存器的標頭檔案
#include<intrins.h>   //包含_nop_()函式定義的標頭檔案
#include "DELAY_FUNCTION_FELL.h"

sbit SCLK=P1^0;   //位定義1302晶片的介面,時鐘輸出埠定義在P1.0引腳
sbit DATA=P1^1;   //位定義1302晶片的介面,資料輸出端定義在P1.1引腳
sbit RST=P1^2;    //位定義1302晶片的介面,復位埠定義在P1.2引腳


 void Write1302(unsigned char dat) ;	//向DS1302寫一個位元組的資料(或指令)
 unsigned char Read1302(void) ;	//從DS1302中讀一個位元組的資料
 void WriteSet1302(unsigned char Cmd,unsigned char dat) ;//根據命令字,向1302寫一個位元組資料
 unsigned char  ReadSet1302(unsigned char Cmd) ; //根據命令字,從1302讀取一個位元組資料

 void DS1302_Set_Second(int second) ; //設定秒
 void DS1302_Set_Minute(int minute) ;	//設定分
 void DS1302_Set_Hour(int hour) ;	//設定時
 void DS1302_Set_Day(int day) ;	//設定日
 void DS1302_Set_Month(int month) ;	//設定月
 void DS1302_Set_Weekday(int weekday) ;	//設定星期
 void DS1302_Set_Year(int year) ;	//設定年 

 void DS1302_Init(void) ; //對1302進行初始化設定

 int Read_DS1302_Second(void)	;
 int Read_DS1302_Minute(void) ; 
 int Read_DS1302_Hour(void) ; 
 int Read_DS1302_Day(void) ;
 int Read_DS1302_Month(void) ; 
 int Read_DS1302_Weekday(void) ;
 int Read_DS1302_Year(void) ;


#endif



//DS1302_SPIdriver.c
//DS1302_SPIdriver.c

#include "DS1302_SPIdriver.h"


/*****************************************************
函式功能:向1302寫一個位元組資料
入口引數:x
***************************************************/ 
void Write1302(unsigned char dat)
{
  unsigned char i; 
  SCLK=0;            //拉低SCLK,為脈衝上升沿寫入資料做好準備
  delay1us(2);       //稍微等待,使硬體做好準備
  for(i=0;i<8;i++)      //連續寫8個二進位制位資料
    {
	     DATA=dat&0x01;    //取出dat的第0位資料寫入1302  低位在前,高位在後
		 delay1us(2);       //稍微等待,使硬體做好準備
		 SCLK=1;           //上升沿寫入資料
		 delay1us(2);      //稍微等待,使硬體做好準備
		 SCLK=0;           //重新拉低SCLK,形成脈衝
		 dat>>=1;          //將dat的各資料位右移1位,準備寫入下一個資料位
	  }
	
 }
/*****************************************************
函式功能:根據命令字,向1302寫一個位元組資料
入口引數:Cmd,儲存命令字;dat,儲存待寫的資料
***************************************************/ 
void WriteSet1302(unsigned char Cmd,unsigned char dat)
 {	  
        RST=0;           //禁止資料傳遞
        SCLK=0;          //確保寫數居前SCLK被拉低
	    RST=1;           //啟動資料傳輸
	    delay1us(2);     //稍微等待,使硬體做好準備
	    Write1302(Cmd);  //寫入命令字
	    Write1302(dat);  //寫資料
	    SCLK=1;          //將時鐘電平置於高電平狀態
	    RST=0;           //禁止資料傳遞
 }
/*****************************************************
函式功能:從1302讀一個位元組資料
入口引數:x
***************************************************/ 
 unsigned char Read1302(void)
 {
    unsigned char i,dat;
	delay1us(2);       //稍微等待,使硬體做好準備
	for(i=0;i<8;i++)   //連續讀8個二進位制位資料
	 {	 dat>>=1;
		 if(DATA==1)    //如果讀出的資料是1
		 dat|=0x80;    //將1取出,寫在dat的最高位
		 SCLK=1;       //將SCLK置於高電平,為下降沿讀出
		 delay1us(2);  //稍微等待
		 SCLK=0;       //拉低SCLK,形成脈衝下降沿
		 delay1us(2);  //稍微等待
	  }	 
  return dat;        //將讀出的資料返回
}  
/*****************************************************
函式功能:根據命令字,從1302讀取一個位元組資料
入口引數:Cmd
***************************************************/ 
unsigned char  ReadSet1302(unsigned char Cmd)
 {
  unsigned char dat;
  RST=0;                 //拉低RST
  SCLK=0;                //確保寫數居前SCLK被拉低
  RST=1;                 //啟動資料傳輸
  Write1302(Cmd);       //寫入命令字
  dat=Read1302();       //讀出資料
  SCLK=1;              //將時鐘電平置於已知狀態
  RST=0;               //禁止資料傳遞
  return dat;          //將讀出的資料返回
}

/******************************************************************************
 *	名稱:DS1302_Set_Second()
 *	功能:設定時鐘 秒 位
 *	引數:int second
 *	返回:無
 ******************************************************************************/
 void DS1302_Set_Second(int second)
 {
 	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
	   	WriteSet1302(0x80,((second/10)<<4|(second%10)));   //根據寫秒暫存器命令字,寫入秒的初始值
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
 }

 /******************************************************************************
 *	名稱:DS1302_Set_Minute()
 *	功能:設定時鐘 分 位
 *	引數:int minute
 *	返回:無
 ******************************************************************************/
 void DS1302_Set_Minute(int minute)
 {
 	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
		WriteSet1302(0x82,((minute/10)<<4|(minute%10)));   //根據寫分暫存器命令字,寫入分的初始值
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
 }

 /******************************************************************************
 *	名稱:DS1302_Set_Hour()
 *	功能:設定時鐘 時 位
 *	引數:int hour
 *	返回:無
 ******************************************************************************/
 void DS1302_Set_Hour(int hour)
 {
 	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
		WriteSet1302(0x84,((hour/10)<<4|(hour%10))); //根據寫小時暫存器命令字,寫入小時的初始值
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
 }

 /******************************************************************************
 *	名稱:DS1302_Set_Day()
 *	功能:設定時鐘 日 位
 *	引數:int day
 *	返回:無
 ******************************************************************************/
 void DS1302_Set_Day(int day)
 {
 	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
		WriteSet1302(0x86,((day/10)<<4|(day%10))); //根據寫日暫存器命令字,寫入日的初始值
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
 }

 /******************************************************************************
 *	名稱:DS1302_Set_Month()
 *	功能:設定時鐘 月 位
 *	引數:int month
 *	返回:無
 ******************************************************************************/
 void DS1302_Set_Month(int month)
 {
 	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
		WriteSet1302(0x88,((month/10)<<4|(month%10))); //根據寫月暫存器命令字,寫入月的初始值
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
 }

 /******************************************************************************
 *	名稱:DS1302_Set_Weekday()
 *	功能:設定時鐘 星期 位
 *	引數:int weekday
 *	返回:無
 ******************************************************************************/
 void DS1302_Set_Weekday(int weekday)
 {
 	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
		WriteSet1302(0x8a,( weekday%7 ));  //根據寫星期暫存器命令字,寫入星期的初始值
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
 }

 /******************************************************************************
 *	名稱:DS1302_Set_Year()
 *	功能:設定時鐘 年 位
 *	引數:int year
 *	返回:無
 ******************************************************************************/
 void DS1302_Set_Year(int year)
 {
 	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
		WriteSet1302(0x8c,((year/10)<<4|(year%10)));  //根據寫年暫存器命令字,寫入年的初始值
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
 }






/*****************************************************
函式功能: 1302進行初始化設定
***************************************************/ 
void DS1302_Init(void)
{	
  unsigned char flag;
   
    flag= ReadSet1302(0x81);
	if(flag&0x80)	
	{      //判斷時鐘晶片是否關閉
	    WriteSet1302(0x8E,0x00);                 //根據寫狀態暫存器命令字,寫入不保護指令 
	   	WriteSet1302(0x80,((55/10)<<4|(55%10)));   //根據寫秒暫存器命令字,寫入秒的初始值
		WriteSet1302(0x82,((59/10)<<4|(59%10)));   //根據寫分暫存器命令字,寫入分的初始值
		WriteSet1302(0x84,((23/10)<<4|(23%10))); //根據寫小時暫存器命令字,寫入小時的初始值
		WriteSet1302(0x86,((5/10)<<4|(5%10))); //根據寫日暫存器命令字,寫入日的初始值
		WriteSet1302(0x88,((4/10)<<4|(4%10))); //根據寫月暫存器命令字,寫入月的初始值
		WriteSet1302(0x8a,( 6%7 ));  //根據寫星期暫存器命令字,寫入星期的初始值
		WriteSet1302(0x8c,((14/10)<<4|(14%10)));  //根據寫年暫存器命令字,寫入年的初始值
		WriteSet1302(0x90,0xa5);                //開啟充電功能 選擇2K電阻充電方式
		WriteSet1302(0x8E,0x80);			   //根據寫狀態暫存器命令字,寫入保護指令
	}

  }

/******************************************************************************
 *	名稱:Read_DS1302_Second()
 *	功能:讀DS1302的 秒 位
 *	引數:無
 *	返回:second
 ******************************************************************************/
 int Read_DS1302_Second(void)
 {
 	  int second ;
	  unsigned char ReadValue ; 

 	  ReadValue = ReadSet1302(0x81);   //從秒暫存器讀資料
     second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//將讀出資料轉化十進位制數
	 return second ;

 }

 /******************************************************************************
 *	名稱:Read_DS1302_Minute()
 *	功能:讀DS1302的 分 位
 *	引數:無
 *	返回:minute
 ******************************************************************************/
 int Read_DS1302_Minute(void)
 {
 	  int minute ;
	  unsigned char ReadValue ;

	  ReadValue = ReadSet1302(0x83);  //從分暫存器讀
      minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出資料轉化
	  return minute ;
 
 }

 /******************************************************************************
 *	名稱:Read_DS1302_Hour()
 *	功能:讀DS1302的 時 位
 *	引數:無
 *	返回:hour
 ******************************************************************************/
 int Read_DS1302_Hour(void)
 {
 	  int hour ;
	  unsigned char ReadValue ;

     ReadValue = ReadSet1302(0x85);  //從分暫存器讀
     hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出資料轉化
	 return hour ;
 
 }

 /******************************************************************************
 *	名稱:Read_DS1302_Day()
 *	功能:讀DS1302的 日 位
 *	引數:無
 *	返回:day
 ******************************************************************************/
 int Read_DS1302_Day(void)
 {
 	  int day ;
	  unsigned char ReadValue ;

     ReadValue = ReadSet1302(0x87);  //從分暫存器讀
     day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出資料轉化
	 return day ; 
 
 }

 /******************************************************************************
 *	名稱:Read_DS1302_Month()
 *	功能:讀DS1302的 月 位
 *	引數:無
 *	返回:month
 ******************************************************************************/
 int Read_DS1302_Month(void)
 {
 	  int month ;
	  unsigned char ReadValue ;

	  ReadValue = ReadSet1302(0x89);  //從月暫存器讀
      month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出資料轉化
	  return month ;

 }

 /******************************************************************************
 *	名稱:Read_DS1302_Weekday()
 *	功能:讀DS1302的 星期 位
 *	引數:無
 *	返回:weekday
 ******************************************************************************/
 int Read_DS1302_Weekday(void)
 {
 	  int weekday ;
	  unsigned char ReadValue ;

 	  ReadValue = ReadSet1302(0x81);   //從星期暫存器讀資料
      weekday = ReadValue&0x0F ;//將讀出資料轉化
	  return weekday ;
 
 }

 /******************************************************************************
 *	名稱:Read_DS1302_Year()
 *	功能:讀DS1302的 年 位
 *	引數:無
 *	返回:year
 ******************************************************************************/
 int Read_DS1302_Year(void)
 {
 	  int year ;
	  unsigned char ReadValue ;

	  ReadValue = ReadSet1302(0x8d);  //從年暫存器讀
      year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F); //將讀出資料轉化
	  return year ;
 
 }


相關推薦

微控制器複習筆記005 -- DS1302時鐘晶片

1、DS1302時鐘晶片的講解 待完成!!! 2、自己寫的DS1302晶片的配置檔案 //DS1302_SPIdriver.h //DS1302_SPIdriver.h #ifndef __SPIDRIVER_H__ #define __SPIDRIVER_H__ #

MSP430F6638微控制器複習筆記

作者:BerenCamlost 適應於南理工王巨集波老師的《MSP430微控制器》課 緊急更新!!!已完結 。求關注、收藏、點贊、評論 更新啦!還是到第七章,小更新,對部分錯誤做出修改,還有增加了部分重要知識點。 參考: MSP430資料手冊 王巨集波老師的

點陣之路_STC15微控制器+8*16點陣+DS1302時鐘

資源共享一下,8*16點陣系列的程式,自己參考例程寫的,不太完善還望多多包涵! 對應此文章應該是檔名字為下圖的資料夾! 硬體介紹 1. 主控: STC15F2K60S2        2. 點陣: 1588BR 8*8點陣 經過測試發現型號為 788BS的8

點陣之路_STC15微控制器+16*24點陣+DS1302時鐘

程式碼是在工作室大神的指導下完成的,有bug的地方,還望多多包涵,開源給大家做一個參考~話不多說,先把程式碼奉上~~~ 資料夾內容如下: 實物圖片如下,先有一個大概的圖片,然後才能給大家說一下下邊的原理~ 這個是時間顯示: 這個是年份以及日期顯示: 這個

時鐘晶片DS1302異常

異常現象:DS1302時間不走時,秒位是一個大於60的錯誤數字。 分析原因:DS1302受到干擾,軟體模擬發現DS1302的秒暫存器最高位被置為1(為時鐘停止位)。 解決方法:軟體中增加判斷機制,當讀出的時間大於60秒。就立即重新設定時間,這樣發生故障時,最多相差1秒就可以糾正回來。

基於STM32F1的時鐘晶片DS1302驅動

目錄 DS1302.h原始碼 DS1302.c原始碼 DS1302.h原始碼 /** ****************************************************************************** * @file DS1302.h

利用51微控制器和DS12C887時鐘晶片製作萬年曆

半個學期51的學習之後在終於動手敲了人生中第一個模組,期間出現了很多的bug,但還好的是最後都改正了希望對大家有一點用處。(微控制器小白一個,歡迎大佬指點。如果有大佬碰巧看見的話能不能幫我找一下相關的proteus模擬圖,不勝感激!)#include<reg52.h&g

51微控制器實時時鐘 PCF8563時鐘晶片

實現實時時鐘,電源拔插時間不重置(內建電池供電維持時間變化)。功能有檢視日期,檢視星期,檢視鬧鐘和分別的調整時間,調整日期,調整鬧鐘,調整星期。且預設情況下不可以調整,當按下可調控鍵之後才可以調整、再次按可調控鍵關閉變為不可調整狀態。還有整點報時功能(有個小瑕疵就是鬧鐘正好是

PCF8563時鐘晶片(C語言微控制器編寫)

#i nclude <reg51.h>#i nclude <intrins.h>sbit SDA=P1^0;                          // 將p1.0口模擬資料口sbit SCL=P1^1;                  

PCF8563實時時鐘晶片51微控制器簡單例程

做時鐘顯示如果用微控制器做,會產生很大的累積誤差,本程式採用時鐘晶片PCF8563 一:晶片主要電氣特性: 1)大工作電壓範圍:1.0~5.5V 2)400KHz 的 I2C 匯流排介面(VDD=1.8~5.5V 時)。  時鐘頻率最大400KH 3)i2C 匯流排從地址:讀,0

STM32與DS1302設計時鐘晶片,超詳細

上圖左邊為暫存器和RAM的地址,右邊為具體內容。各個暫存器的最高位都是1,最低位都是“RD/W”,比如要讀秒暫存器則命令為1000 0101,反之寫為1000 0100,要注意其含義。(圖片不是很清楚,看不清楚的朋友用軟體放大)我們一個一個看: SEC:秒暫存器,注意具體右邊內容:低四位為SEC,高的次三位為

C++筆記005:用面向過程和面向對象方法求解圓形面積

函數 ont 自定義數據類型 行為 能夠 變量 面向對象 數據類型 結構體 結束了第一個hello world程序後,我們來用面向過程和面向對象兩個方法來求解圓的面積這個問題,以能夠更清晰的體會面向對象和面向過程。 第一,面向過程計算圓的面積 程序中我們看到一個標準輸入流c

C語言基礎複習筆記(一)指標

最近linux很火,年前對linux再詳細瞭解了個大概,結合在windows平臺活躍與強大無比的C++,最終得出一個結論:C語言依然強大。 過年回來,便對的C語言充滿了興趣,於是乎去網上下載了教程回來,細細研讀,基礎程式設計思想始終是很重要的。 首先,入手的便是C語言的核心精華部分,指標。要

Kettle學習筆記005之引數與變數

1. 啟動作業或者轉換時初始化的叫做引數 。在 呼叫作業或者轉換的時候傳入。 2. 作業或者轉換執行過程中數值會變動的某些資料,叫做變數。在流程內部配置。 3. 引數的配置與使用      a. 引數配置位置:  轉換設定  -

spark複習筆記(4):RDD變換

一、RDD變換   1.返回執行新的rdd的指標,在rdd之間建立依賴關係。每個rdd都有一個計算函式和指向父rdd的指標   2.Spark是惰性的,因此除非呼叫某個轉換或動作,否則不會執行任何操作,否則將觸發工作建立和執行。   3.map()是對每個元素進行變換,應用變換函式;而mapPartit

mysql複習筆記

 -- 註釋 //自增插入資料,必須一一對應表的每一個數據列,不可空出來。 CREATE TABLE class(id int PRIMARY KEY auto_increment, sname VARCHAR(50) not null DEFAULT ''); # 插入改INSE

Java複習筆記,程式碼篇

變數型別轉換,個位數char與int型別的變數如何轉換? 思路:直接char賦值int,會將char對應編碼的十進位制值(‘1’=49,‘0’=48)賦給int變數,故減去’0’編碼所代表的十進位制數即可。 答:int intA = char charA - ‘0’; 如

Java複習筆記 基礎理論篇

1. Java是解釋性的語言嗎? 答: java程式的原始碼是解釋性的,但.java檔案要通過2個步驟才能變成機器語言: 1)在java平臺上被編譯成位元組碼(bytecode)的.class形式,這是二進位制的JVM的機器語言。 2)JVM附帶直譯器,對這些位元組碼解釋執行。 PS:Jav

spark複習筆記(7):sparkSQL

一、saprkSQL模組,使用類sql的方式訪問Hadoop,實現mr計算,底層使用的是rdd   1.hive      //hadoop  mr  sql   2.phenoix    //hbase上構建sql的互動過程   該模組能在spark上執行sql語句   3.Da

mybatis複習筆記(1):

一、簡介:什麼是MyBatis   1.MyBatis是一款優秀的持久層框架,支援定製化SQL、儲存過程以及高階對映。MyBatis避免了幾乎所有的JDBC程式碼和手動設定引數以及獲取結果集。MyBatis可以使用簡單的XML或者註解來配置和對映原生資訊,將介面和Java的POJOs對映成資料庫中的記錄