微控制器複習筆記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對映成資料庫中的記錄