实时时钟参考程序资料
PLC实时时钟
一、定时触发故障PLC程序(PLC为实时时钟)该程序是用三菱PLC编程软件GX Developer V7.08J(SW7D5C-GPPW)简体中文版所编的程序,仅适用于三菱FX2N系列PLC。
程序是为设备制造商收取剩余款项而设的筹码,在设备制造商老板有要求时可以使用,仅适用于信誉度不好的客户。
该程序一旦触发,无论设备是否处于运行状态、PLC是否处于运行状态或通电状态,指定时间以后将会准时出现故障。
请谨慎使用!该程序应当嵌入应用程序之中,为避免他人识破,可以将程序分成多块分别嵌入在应用程序的各个地方。
为避免他人修改你的程序,应当将整个程序进行加密——设置口令,具体操作方法请参阅程序加密的相关说明。
M490为故障触点,应当串联或并联在程序多个关键动作回路中。
X20 为定时触发故障复位端子,要求该端子为没有被使用的端子(否则请更换为另一个没有被使用的端子)。
需要解除还没有被触发的故障或已经触发的故障时,将该触点和PLC的输入COM端短接即可。
如果系统当前时间还没到故障触发时间,一旦该端子与COM端子断开,故障将在预定时间触发!如果系统当前时间已经过了指定的故障触发时间,一旦该端子与COM端子断开,故障将立即触发!如果需要重新指定故障触发时间,就必须得更改指定的故障触发时间——需要对PLC进行编程!该程序指定的故障触发时间为2007年1月1日0时0分0秒,可以进行更改。
该程序中所用到的通用继电器M481-M499、定时器T198、存储区D0-D5,请不要在程序的其它地方使用,否则该程序可能无法正常发挥作用。
对于三菱其它系列PLC或其它品牌PLC,请对程序作相应更改——各存储器请按照相应存储区域进行更改。
该程序并没有修改PLC的系统时钟,因此程序中的其它地方或和PLC通信的其它设备所调用的PLC系统时钟反映的是正确的当前日期和时间。
在程序动作之前,应当检查PLC的系统时钟是否正确反映当前日期和时间(因为PLC的默认系统时钟可能不正确,笔者就遇到过系统时钟快一个小时多一点的情况)。
实时时钟实验总结
实时时钟实验总结一、实验目的本实验的主要目的是了解实时时钟的原理及其应用,掌握实时时钟的使用方法,以及通过实验学习如何编写驱动程序。
二、实验原理1. 实时时钟是一种能够提供时间和日期信息的芯片,它通常由一个晶体振荡器和一组计数器组成。
2. 实时时钟可以通过I2C总线与处理器进行通信,读取或设置时间和日期信息。
3. 实现实时时钟需要编写相应的驱动程序,并将其与操作系统进行集成。
三、实验设备与材料1. 实验板:STM32F407ZET6开发板;2. 模块:DS1307实时时钟模块;3. 软件:Keil uVision5开发环境。
四、实验内容1. 硬件连接:将DS1307模块与STM32F407ZET6开发板连接,包括SDA、SCL、VCC和GND等引脚。
2. 编写驱动程序:根据DS1307模块手册编写相应的驱动程序,并将其集成到操作系统中。
3. 测试程序:编写测试程序,通过读取DS1307模块返回的时间和日期信息来验证驱动程序是否正常工作。
五、实验步骤1. 连接硬件:将DS1307模块与STM32F407ZET6开发板连接。
2. 编写驱动程序:根据DS1307模块手册编写相应的驱动程序,并将其集成到操作系统中。
3. 编写测试程序:编写测试程序,通过读取DS1307模块返回的时间和日期信息来验证驱动程序是否正常工作。
4. 下载程序:使用Keil uVision5开发环境将编写好的程序下载到STM32F407ZET6开发板上。
5. 运行测试:启动STM32F407ZET6开发板,通过串口助手等工具查看DS1307模块返回的时间和日期信息,验证驱动程序是否正常工作。
六、实验结果经过测试,实时时钟模块能够正确返回当前时间和日期信息,并且能够根据需要进行设置和调整。
七、实验总结本次实验通过对实时时钟原理的学习以及编写驱动程序和测试程序的练习,加深了对嵌入式系统中硬件与软件协同工作的理解。
同时也掌握了一些基本的嵌入式系统开发技能,如硬件连接、驱动编写、调试等。
STM32系列MCU硬件实时时钟(RTC)应用笔记说明书
2017年6月Doc ID 018624 Rev 1 [English Rev 5]1/45AN3371应用笔记在 STM32 F0、F2、F3、F4 和 L1 系列MCU 中使用硬件实时时钟(RTC )前言实时时钟 (RTC) 是记录当前时间的计算机时钟。
RTC 不仅应用于个人计算机、服务器和嵌入式系统,几乎所有需要准确计时的电子设备也都会使用。
支持 RTC 的微控制器可用于精密计时器、闹钟、手表、小型电子记事薄以及其它多种设备。
本应用笔记介绍超低功耗中等容量、超低功耗大容量、F0、F2和 F4 系列器件微控制器中嵌入式实时时钟 (RTC) 控制器的特性,以及将 RTC 用于日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用时所需的配置步骤。
本应用笔记提供了含有配置信息的示例,有助于您快速准确地针对日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用配置 RTC 。
注:所有示例和说明均基于 STM32L1xx 、STM32F0xx 、STM32F2xx 、STM32F4xx 和STM32F3xx 固件库,以及 STM32L1xx (RM0038)、STM32F0xx (RM0091)、STM32F2xx (RM0033)、STM32F4xx (RM0090)、STM32F37x (RM0313) 和 STM32F30x(RM0316) 的参考手册。
本文提到的STM32 指超低功耗中等容量、超低功耗大容量、F0、F2 和 F4 系列器件。
超低功耗中等 (ULPM) 容量器件包括 STM32L151xx 和 STM32L152xx 微控制器,Flash 容量在 64 KB 到 128 KB 之间。
超低功耗大 (ULPH) 容量器件包括 STM32L151xx 、STM32L152xx 和 STM32L162xx 微控制器,Flash 容量为 384 KB 。
F2 系列器件包括 STM32F205xx 、STM32F207xx 、STM32F215xx 和 STM32F217xx 微控制器。
实时时钟说明文档
2.6 实时时钟模块电路设计现在流行的串行时钟芯片很多,如DSl302、DSl307、PcF8485等。
这些芯片接口简单、价格低廉、使用方便,被广泛地采用。
本模块使用的实时时钟芯为DSl302,是Dallas公司的一种具有涓细电流充电能力的实时时钟芯片,采用普通32.768kHz晶振。
主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用DS1302 作为记录测控系统中的数据记录,其软硬件设计简单,时间记录准确,既避免了连续记录的大工作量,又避免了定时记录的盲目性,给连续长时间的测量、控制系统的正常运行及检查都来了很大的方便,可广泛应用于长时间连续的测控系统中。
2.6.1 DS1302的结构及工作原理Ds1302是美国Dallas公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
Dsl302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
1、引脚功能及结构图DSl302的引脚如图2.13所示。
VCCl为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DSl302由VCCl或VCC2两者中的较大者供电。
当VCC2大于VCC1+0.2V时,VCC2给DSl302供电。
当VCC2小于VCC1时,DSl302由VCC1供电。
X1、X2为振荡源,外接32.768Hz晶振。
RST是复位,片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:(1)RST接通控制逻辑,允许地址/命令序列送入移位寄存器。
51单片机ds1302实时时钟程序
51单⽚机ds1302实时时钟程序#ifndef __DS1302_H_#define __DS1302_H_//---包含头⽂件---//#include#include//---重定义关键词---//#ifndefuchar#define uchar unsigned char#endif#ifndefuint#define uint unsigned int#endif//---定义ds1302使⽤的IO⼝---//sbit DSIO=P3^4;sbit RST=P3^5;sbit SCLK=P3^6;//---定义全局函数---//void Ds1302Write(ucharaddr, uchardat); uchar Ds1302Read(ucharaddr);void Ds1302Init();void Ds1302ReadTime();//---加⼊全局变量--//extern uchar TIME[7]; //加⼊全局变量#endif #include"ds1302.h"//---DS1302写⼊和读取时分秒的地址命令---////---秒分时⽇⽉周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1⽉1⽇星期⼆12点00分00秒。
---////---存储顺序是秒分时⽇⽉周年,存储格式是⽤BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/************************************************************************ * 函数名: Ds1302Write* 函数功能: 向DS1302命令(地址+数据)* 输⼊: addr,dat* 输出: ⽆************************************************************************* void Ds1302Write(ucharaddr, uchardat){uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。
实时时钟参考程序
5.6 实时时钟实验5.6.1 实验目的1. 了解实时时钟在嵌入式系统中的作用;2. 掌握实时时钟的使用。
5.6.2 实验内容1. 编程实现实时时钟功能,每秒显示实时时钟;2. 编程实现实时时钟告警功能。
5.6.3 预备知识1. 了解ADT集成开发环境的基本功能;2. 学习S3C24X0的实时时钟模块的使用。
5.6.4 实验设备1. 硬件:JXARM9-2440教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE开发环境。
5.6.5 基础知识1. 实时时钟在嵌入式系统中的作用在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。
2. S3C24X0的实时时钟单元下图为S3C24X0的实时时钟框图。
它具有以下特点:图5-12 S3C24X0的实时时钟框图1)时钟数据采用BCD编码;2)能够对闰年的年月日进行自动处理;3)具有告警功能,当系统处于关机状态时,能产生告警中断;4)具有独立的电源输入;5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。
3. S3C24X0的实时时钟寄存器1) 控制寄存器表5-16 控制寄存器寄存器地址读/写状态描述复位值RTCCON 0x57000040 R/W 实时时钟控制寄存器0x0RTCCON 位描述复位值CLKRST [3] 实时时钟计数器复位0-不复位 1-复位CNTSEL [2] BCD计数选择,将计数器设置为BCD模式0-选择BCD模式 1-保留CLKSEL [1] BCD时钟选择0-将输入时钟进行1/215分频 1-保留RTCEN [0] RTC读写使能0-禁止 1-使能2) 告警控制寄存器3) 实时时钟计数器表5-18 实时时钟计数器4) 告警时间寄存器包括年、月、日、时、分、秒。
实时时钟,日历芯片-BM8563,兼容PCF8563,参考源代码
_nop_(); _nop_(); }
/******************************************************************** 函 数 名:Stop_I2C(void) 功 能:停止 I2C 总线的传输 说 明: 调 用: 入口参数:无 返 回 值:无 ***********************************************************************/ void Stop_I2C(void) { SCL=0; _nop_(); SCL=1; SomeNOP(); SDA=1; SomeNOP(); }
/******************************************************************** 函 数 名: GetBM8563(void) 功 能:从 BM8563 的内部寄存器(时间、状态、报警等寄存器)读取数据 说 明:该程序函数用来读取 BM8563 的内部寄存器,譬如时间,报警,状态等寄存器 采用页写的方式,设置数据的个数为 no,no 参数设置为 1 就是单字节方式 调 用:Start_I2C(),SendByte(),RcvByte(),Ack_I2C(),Stop_I2C() 入口参数:sla(BM8563 从地址) , suba(BM8563 内部寄存器地址) *s(设置读取数据存储的指针) , no(传输数据的个数) 返 回 值:有,返回布尔量(bit)用来鉴定传输成功否 ***********************************************************************/ bit GetBM8563(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2C(); SendByte(sla); if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); Start_I2C(); SendByte(sla+1); if(ack==0)return(0); for (i=0;i<no-1;i++) { *s=RcvByte(); Ack_I2C(0); s++; } *s=RcvByte(); Ack_I2C(1); Stop_I2C();//除最后一个字节外,其他都要从 MASTER 发应答。 return(1); }
LCD12864显示实时时钟例程可运行
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
下面是一段12864液晶显示实时时钟的程序:/****************************************************************************** *********时间:2012.11.30晶振:11.0592MHz芯片:STC89C52RC功能描述:在12864上显示年、月、日、星期、时、分和秒等时间信息******************************************************************************* ********/#include<reg52.h>#define uchar unsigned charsbit CLK=P1^4; //DS1302引脚定义sbit IO=P1^5;sbit CE=P1^6;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit RS=P2^4; //12864引脚定义数据口为P0sbit RW=P2^5;sbit EN=P2^6;sbit PSB=P2^1;sbit RET=P2^3;void Input_1byte(uchar TD) //DS1302输入一字节数据{uchar i;ACC=TD;for(i=8;i>0;i--){IO=ACC0;CLK=1;CLK=0;ACC=ACC>>1;}}uchar Output_1byte(void) //DS1302输出一字节数据{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}return(ACC);}void Write_DS1302(uchar add,uchar dat)//向DS1302写{CE=0;CLK=0;CE=1;Input_1byte(add);Input_1byte(dat);CE=0;}uchar Read_DS1302(uchar add) //从DS1302读{uchar inf; //信息临时存储变量CE=0;CLK=0;CE=1;Input_1byte(add);inf=Output_1byte();CE=0;return(inf);}/**********************DS1302初始化*****************************/void init_1302(){if(Read_DS1302(0xd1)==0x55) //判断内存单元的内容,是否进行初始化 {return;}else{Write_DS1302(0x8e,0x00); //关闭写保护Write_DS1302(0x90,0x00); //电池充电设置Write_DS1302(0x80,0x00); //秒Write_DS1302(0x82,0x54); //分Write_DS1302(0x84,0x20); //时Write_DS1302(0x86,0x30); //日Write_DS1302(0x88,0x11); //月Write_DS1302(0x8a,0x05); //星期Write_DS1302(0x8c,0x12); //年Write_DS1302(0xd0,0x55); //写RAMWrite_DS1302(0x8e,0x80); //打开写保护}}/**********************延时函数*****************************/ void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/**********************12864判忙*****************************/ void check_busy(){RS=0;RW=1;EN=1;while((P0&0x80)==0x80);EN=0;}/**********************12864写指令*****************************/ void write_com(uchar com){check_busy();RS=0;RW=0;EN=1;P0=com;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864写数据*****************************/void write_data(uchar dat){check_busy();RS=1;RW=0;EN=1;P0=dat;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864初始化函数*****************************/void init(){DelayMs(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式DelayMs(1); //延时RET=0; //复位DelayMs(1); //延时RET=1; //复位置高DelayMs(200);write_com(0x30); //选择基本指令集DelayUs2x(250); //延时大于100uswrite_com(0x30); //选择8bit数据流DelayUs2x(200); //延时大于37uswrite_com(0x0c); //开显示(无游标、不反白)DelayUs2x(250); //延时大于100uswrite_com(0x01); //清除显示,并且设定地址指针为00HDelayMs(200); //延时大于10mswrite_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(250); //延时大于100us}/**********************清屏*****************************/void clrscreen(){write_com(0x01);DelayMs(15);}/*********************************************************主函数********************************************************/void main(){uchar sec,sec1,sec2;uchar min,min1,min2;uchar hour,hour1,hour2;uchar date,date1,date2;uchar mon,mon1,mon2;uchar day;uchar year,year1,year2;uchar table1[]="年月日时分秒星期温度摄氏"; //长度24uchar table2[]={0XD2,0XBB, 0XB6,0XFE, 0XC8,0XFD, 0XCB,0XC4, 0XCE,0XE5, 0XCE,0XF9, 0XC8,0XD5}; //长度14 uchar table3[]="0123456789"; //长度10init(); //液晶初始化clrscreen();DelayMs(200);init_1302(); //1302初始化只初始化一下就可以需要下载两次DelayMs(50);write_com(0x80); //显示20write_data('2');write_data('0');write_com(0x82); //显示年write_data(table1[0]);write_data(table1[1]);write_com(0x84); //显示月write_data(table1[2]);write_data(table1[3]);write_com(0x86); //显示日write_data(table1[4]);write_data(table1[5]);write_com(0x91); //显示时write_data(table1[6]);write_data(table1[7]);write_com(0x93); //显示分write_data(table1[8]);write_data(table1[9]);write_com(0x95); //显示秒write_data(table1[10]);write_data(table1[11]);write_com(0x88); //显示星期write_data(table1[12]);write_data(table1[13]);write_data(table1[14]);write_data(table1[15]);while(1){sec=Read_DS1302(0x81); ////读秒sec1=sec&0x0f; //个位sec2=sec>>4; //十位min=Read_DS1302(0x83); ////读分min1=min&0x0f; //个位min2=min>>4; //十位hour=Read_DS1302(0x85); ////读时hour1=hour&0x0f; //个位hour2=hour>>4; //十位date=Read_DS1302(0x87); ////读日date1=date&0x0f; //个位date2=date>>4; //十位mon=Read_DS1302(0x89); ////读月mon1=mon&0x0f; //个位mon2=mon>>4; //十位year=Read_DS1302(0x8d); ////读年year1=year&0x0f; //个位year2=year>>4; //十位day=Read_DS1302(0x8b); ////读星期write_com(0x94); //送显示内容write_data(table3[sec2]); //秒write_data(table3[sec1]);write_com(0x92);write_data(table3[min2]); //分write_data(table3[min1]);write_com(0x90);write_data(table3[hour2]); //时write_data(table3[hour1]);write_com(0x85);write_data(table3[date2]); //日write_data(table3[date1]);write_com(0x83);write_data(table3[mon2]); //月write_data(table3[mon1]);write_com(0x81);write_data(table3[year2]); //年write_data(table3[year1]);write_com(0x8a);write_data(table2[2*day-2]); //星期write_data(table2[2*day-1]);}}。
实时时钟设计试验报告
实时时钟设计试验报告一、实验目的本实验的目的是设计一个实时时钟系统,具有实时显示时间、日期和闹钟功能。
通过该实验,我们可以了解实时时钟的设计原理、硬件电路连接及软件程序编写方法。
二、实验原理实时时钟系统由时钟芯片、显示模块、按键模块和控制模块组成。
时钟芯片负责计时和日期的记录,显示模块用于显示时间和日期,按键模块用于设置时间和日期,控制模块用于控制各模块之间的协作。
三、实验器材1.STM32开发板2.DS3231时钟模块3.数码管显示模块4.按键模块5.连接线四、实验步骤1.连接硬件电路。
将STM32开发板与DS3231时钟模块、数码管显示模块和按键模块进行连接,确保电路连接正确无误。
2.编写程序。
使用C语言编写程序,通过读取DS3231时钟模块的寄存器获取时间和日期数据,并将其显示在数码管模块上。
同时,设置按键模块的功能,使其可以进行时间和日期的设置。
3.烧录程序。
使用烧录器将编写好的程序烧录到STM32开发板上,并进行调试。
4.运行实验。
接通电源,启动实时时钟系统,观察数码管是否正确显示时间和日期,按下按键模块进行时间和日期的设置,并观察设置是否生效。
五、实验结果经过实验,我们成功设计出了一个实时时钟系统。
系统能够实时地显示当前的时间和日期,并且可以通过按键进行时间和日期的设置。
在设置新的时间和日期后,系统能够正确地更新并显示。
六、实验总结通过本次实验,我们深入地了解了实时时钟系统的设计原理和实现方法。
我们熟悉了DS3231时钟模块的使用方法,并学会了通过C语言编写程序来实现实时时钟系统的功能。
同时,我们也发现了实时时钟系统的一些问题,并加以解决。
我们对实时时钟系统的稳定性和精确性进行了测试,发现系统的计时精度较高,能够达到亚秒级的准确度。
然而,在用户进行时间和日期的设置时,可能由于误操作导致时间和日期出错。
需要在后续的工作中进一步优化系统的操作界面,提高用户设置的便捷性和准确性。
总而言之,实时时钟系统是一种非常有实用价值的设计,可以广泛应用于各种计时需求的场合,如办公室、实验室、车载设备等。
ds1302实时时钟程序
/* 时间:4月19日功能:使用ds1302实时时钟芯片,用共阴数码管显示时,分,秒*/#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit io=P3^4;sbit cs=P3^5;sbit clk=P3^6;uchar code table1[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};uchar code table2[]={ //译码器与单片机的接线引脚P2.4 P2.3 P2.20xe3,0xe7,0xeb,0xef,0xf3,0xf7,0xfb,0xff};uchar time[7]={14,2,3,25,23,59,50}; //初始化实时时钟时间uchar register_wr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};uchar register_re[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; uchar temp1[7];uchar shi,ge;void delay_ms(uchar t);void delay(); //大约10usvoid spi_writebyte(uchar dat);uchar spi_readbyte();void ds1302_spiwrite(uchar add,uchar dat);uchar ds1302_spiread(uchar add);void ds1302_init();void ds1302_run(); //ds1302全运行过程void display(); //共阴数码管显示过程void main(){ds1302_init();while(1){ds1302_run();display();}}void delay_ms(uchar t){uchar x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}void ds1302_run(){ //ds1302全运行过程uchar i;for(i=0;i<7;i++){ds1302_spiwrite(0x8e,0x80);//写保护,不让写temp1[i]=ds1302_spiread(register_re[i]); //将十六进制数转换成相同数字的十进制shi=temp1[i]/16;ge=temp1[i]%16;time[i]=shi*10+ge;}}void display(){P0=table1[time[4]/10]; P2=table2[0];delay_ms(1);P0=table1[time[4]%10]; P2=table2[1];delay_ms(1);P0=table1[16];P2=table2[2];delay_ms(1);P0=table1[time[5]/10]; P2=table2[3];delay_ms(1);P0=table1[time[5]%10]; P2=table2[4];delay_ms(1);P0=table1[16];P2=table2[5];delay_ms(1);P0=table1[time[6]/10];P2=table2[6];delay_ms(1);P0=table1[time[6]%10];P2=table2[7];delay_ms(1);}void ds1302_init(){uchar i;ds1302_spiwrite(0x8e,0x00); //wp是写允许位。
PCF8563 实时时钟 日历 产品数据手册说明书
PCF8563实时时钟/日历第11版——2015年10月26日产品数据手册1. 简介PCF8563是一款低功耗的CMOS1实时时钟/日历芯片,支持可编程时钟输出、中断输出和低压检测。
所有地址和数据通过双线双向I2C总线串联传输,最高速率:400 kbps。
每次读写数据字节后,寄存器地址自动累加。
2. 特性和优势◼基于32.768kHz的晶振,提供年、月、日、星期、时、分和秒计时◼Century flag◼时钟工作电压:1.0 - 5.5 V(室温)◼低备用电流;典型值为0.25 μA(V DD = 3.0 V,T amb =25 °C)◼400 kHz 双线I2C总线接口(V DD = 1.8 - 5.5 V)◼可编程时钟输出(32.768 kHz、1.024 kHz、32 Hz和1Hz)◼报警和定时器功能◼集成晶振电容器◼内部上电复位(POR)◼I2C总线从机地址:读:A3h;写:A2h◼开漏中断管脚3. 应用◼移动电话◼便携式仪器◼电子计量◼电池驱动产品1. 有关本资料表所使用的缩略语及首字母缩略语的定义,请参考第18节。
4. 订购信息表1. 订购信息[1] 不推荐用于新产品设计。
替代零件为PCF8563T/5。
[2] 不推荐用于新产品设计。
替代零件为PCF8563TS/5。
5. 标示表2. 标记代码6. 功能框图图1. PCF8563功能框图7. 引脚配置信息7.1 引脚配置图2. HVSON10的引脚配置(PCF8563BS) 图3. SO8的引脚配置(PCF8563T)图4. TSSOP8的引脚配置(PCF8563TS)7.2 引脚说明表3. 引脚说明[1] 晶粒芯片焊盘(外露式焊盘)通过高电阻(非导电的)芯片附着连接到VSS,并应进行电气隔离。
将外露式焊盘焊接到电气隔离的PCB铜焊盘上,以获得更好的传热效果,这是一种较好的工程实践,但由于RTC不会消耗太多功率,因此并不需要这样做。
电子实时时钟万年日历系统-单片机课程设计(含电路图、流程图、汇编语言)
一、题目:电子实时时钟/万年日历系统二、功能要求:1.基本要求:⑴显示准确的北京时间(时、分、秒),可用24小时制式;⑵随时可以调校时间。
2.发挥要求:⑴增加公历日期显示功能(年、月、日),年号只显示最后两位;⑵随时可以调校年、月、日;⑶允许通过转换功能键转换显示时间或日期。
三、方案考虑:1、硬件方案:⑴显示器采用6位LED数码管(共阳),可分别显示时间或日期。
⑵显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。
但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。
可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码。
⑶采用“一键多用方案”,以减少按键数目。
本方案采用了4按键。
⑷整体上要考虑:结构简单、布局美观、操作方便、成本低廉。
2、设计电路图如下:3、元件清单:(我们使用的是TX-1C开发板)⑴ 89C52 1个⑵IC座(40脚) 3个(其中1个用于接插89C51、2个用于接插LED段数码管)。
⑶ 74LS244 1个(用于驱动6个共阳的LED段数码管)。
⑷ IC座(20脚) 1个(用于接插74LS244)。
(5)显示器:LED_8段数码管(共阳型)6个三极管:(6)PNP(8550)6个(用于驱动6个共阳型LED段数码管)。
(7)微型开关:3个(其中1个用于复位电路、其它用于键盘)。
(8)晶体振荡器(12MHz):1个(用于振荡电路)。
(9)电阻器:⑴ 3KΩ 1个(用于系统复位电路)。
⑵ 1KΩ 6个(用作PNP三极管基极电阻)。
⑶ 100Ω 7个(驱动器用作74LS244输出限流电阻)。
(10)电容器:⑴ 10μF1个(用于系统复位电路)。
⑵ 30 pF 2个(用于系统振荡电路)。
(11)其它:⑴万能电路板(10×15):1块⑵焊锡条: 2米⑶带插头、座的电源端子: 1条⑷各种颜色外皮的导线:各1米(12)工具:1.电烙铁:1把2.剪钳:1把3.镊子:1把4.万用表:1个(13)设备:编程器(MEP300或TOP851)6个4、软件方案:(1)使用全汇编编写(2)时钟基准时间由单片机内部定时中断来提供,定时时间应该乘以一个整数得到,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。
35. RTC实时时钟实验[11页]
普中STM32开发板带您进入ARM世界
系统复位后, 默认禁止访问后备寄存器和 RTC,防止对后备区域 (BKP)的意外写操作。执行以下操作使能对后备寄存器和 RTC 的访问: (1) 设置 RCC_APB1ENR 寄存器的 PWREN 和 BKPEN 位来使能电源和后备
普中STM32开发板带您进入ARM世界
(5)更新配置,设置 RTC 中断分组 RTC_ExitConfigMode();//退出配置模式,更新配置 void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); BKP_WriteBackupRegister(BKP_DR1, 0XA0A0); uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
3.硬件电路
本实验使用到硬件资源如下: (1)D1指示灯 (2)串口1 (3)RTC
D1指示灯、串口1电路在前面章节都介绍过,这里就不多说,至于RTC 它属于STM32F1芯片内部的资源,只要通过软件配置好即可使用。D1指示 灯用来提示系统运行状态。串口1将读取的RTC时间日期信息打印出来。
这里需要注意RTC 不能断电,否则时间数据将会丢失,如果想让时间 在断电后还可以继续走,那么必须确保开发板上的纽扣电池有电。
普中STM32开发板带您进入ARM世界
(6)编写RTC中断服务函数 RTC_IRQHandler FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG); RTC_ClearITPendingBit(RTC_IT_SEC);
基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解
基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解实时时钟(Real-Time Clock,简称RTC)是一种能够实时记录时间的设备。
在嵌入式系统中,RTC广泛应用于各种需要时间标记的场景,比如日历、定时任务等等。
本文将基于μPD78F0485单片机实验板,讲解实时时钟程序的设计与实现。
一、硬件连接首先,我们需要正确连接硬件。
μPD78F0485单片机实验板上有一个RTC芯片DS1302,它能够实现实时时钟功能。
将μPD78F0485与DS1302芯片通过引脚连接起来即可。
具体的连接方式可以参照单片机实验板的电路图。
二、软件设计1.寄存器配置首先,我们需要配置单片机的相关寄存器,使其能够与RTC芯片进行通信。
具体操作如下:(1)配置I/O口:将单片机的SDA引脚和SCL引脚设置为输出模式。
(2)配置RTC芯片寄存器:使用I2C总线协议与RTC芯片通信,设置RTC芯片的相关寄存器,比如设置时间、日期、闹钟等。
2.时钟读取与显示接下来,我们需要编写代码读取RTC芯片的时钟数据,并将其显示出来。
具体操作如下:(1)使用I2C总线协议读取RTC芯片的时钟寄存器,包括秒、分、时、日、月、周、年等。
(2)将读取到的时钟数据存储在相应的变量中。
(3)将时钟数据通过数码管、LCD等显示设备进行显示。
3.时钟设置除了读取时钟数据外,我们还需要能够设置RTC芯片的时钟。
具体操作如下:(1)通过按键或者其他输入方式,获取用户设定的时间、日期等数据。
(2)使用I2C总线协议将用户设定的时钟数据写入到RTC芯片的相应寄存器中。
(3)将设定的时钟数据通过数码管、LCD等显示设备进行显示。
4.定时中断为了实时更新时钟数据,我们可以使用定时中断的方式。
具体操作如下:(1)配置定时器:设置定时器的工作模式、计数值等参数。
(2)启动定时器:使定时器开始工作。
(3)在定时中断中,读取RTC芯片的时钟数据,并更新显示。
5.闹钟功能RTC芯片通常也会具备闹钟功能,我们可以通过设置RTC芯片的闹钟寄存器,实现闹钟功能。
可校准的实时时钟原理与测试说明
“可校准的实时时钟”原理与测试说明1 程序设计目标及程序运行效果说明程序设计目标:通过DS1302芯片、晶振、电池和数码管实现实时时钟的数码管显示,并实现实时时钟的时间的准确校准。
程序运行效果说明:将程序下载至芯片,数码管会出现实时的时钟,通过按键key1以及导航键可以实现时间的精确校准。
2程序原理说明及相关电路2.1原理说明本实验在实时时钟的基础上,利用按键Key1以及导航键实现了时间的校准。
程序主要是利用导航按键和数字按键综合校准时钟,利用ADC口对来自导航按键不同方向的电压值进行采集,并将采集后的转换结果获取高三位值,将此值作为导航按键方向判断标准。
导航按键是通过ADC采集电压的改变从而判断按下的方向,而数字按键是通过电平的直接改变判断是否按下。
导航按键的上键:控制时分秒的数值增1;导航按键的下键:控制时分秒的数值减1;K1键:进入或退出时间设置状态;2.2电路原理图及其工作原理2.2.1 DS1302模块电路本实验采用DS1302芯片,DS1302是 DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和 31 字节静态 RAM,外接32.768kHz 晶振,为芯片提供计时脉冲,在电路板的纽扣电池(位于电路板左下方圆柱体)的持续供电下,实现DS1302的独立时间走动。
我们的电子钟电子表是利用这种原理实现的。
DS1302的2、3引脚外接32.768kHz 晶振的晶振,为芯片提供计时脉冲,通过秒寄存器的最高位控制晶振的工作状态,当为高时,停止工作;当为低时,晶振开始工作,实时模块自动计时。
RTC_SCLK 引脚作为输入引脚,用于在串行接口上控制数据的输入与输出 RTC_IO 引脚作为输入输出引脚,为实时时钟的数据线。
RTC_/RST 引脚作为输入引脚,在读、写数据时必须置为高电平。
该引脚有两个功 能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或多字节数据传输的方法,即如图所示: 开始在上升沿按位传输相关地址字读取或者写入相关地址对应的数据字置RTC_/RST 为高置RTC_/RST为低结束DS1302对应的时序:单个字节读:在前8个SCLK 时钟周期内,上升沿写入控制字,在后8个SCLK 时钟周期内,下降沿读取数据字;均从最低位开始。
x1226实时时钟中文资料
800-8808051内含4K(5128) EEPROM 的2线实时时钟日历特性 应用z 实时时钟日历* 多功能电表跟踪时间包括小时分钟和秒* HAVC 设备日期包括星期天或月* 音频/视频元件z 双路报警非易失性* 电视机顶盒装置可设置月日星期时分秒* 调制解调器重置方式* 网络路由器hubs,开关桥式电路周期中断* 无线宽带安装设备z 芯片的振荡器补偿* 寻呼机/PDA 内含反馈电阻和补偿电容* POS 设备z64个位置数位控制调整电容* 测试电表/装置6个数字频率调节设置可设置* 办公自动化复印机传真机 的范围是±30ppm * 家用仪器z 电池切换或大电容输入* 计算机设备z 5128位EEPROM* 其它工用/医用/汽车工业设备64z 字节页面写方式8个块的加锁保护具有单字节写的能力z 高可靠性数据保持100年持久性每个字节100,000次z 兼容于I2C 的两线接口400KHz 的数据传输速率z 频率输出SW 可选关闭1Hz 4096Hz 或32.768KHz z 低功耗CMOS1.25µA 操作电流(典型值)z 小型封装8引脚SOIC 和8引脚TSSOP框图描述X1226是一个带有时钟日历两路报警5128位的EEPROM振荡器补偿和电池切换的实时时钟振荡器用一个外部的低价格的32.768Khz晶体所有补偿和调整元件集成于芯片上这样消除了外部的离散元件和一个调整电容节约印刷版面和元器件的费用实时时钟用分别的时分秒寄存器跟踪时间日历有分别的日期星期月和年寄存器日历可正确通过2099年具有自动闰年修正强大的双报警功能能够被设置到任何时钟日历值上与报警相匹配例如每分钟每个星期二或三月21日上午5:23均可报警能够在状态寄存器被查询或提供一个硬件的中断IRQ管脚这是一个重复模式报警容许产生一个周期性的中断PHZ/IRQ管脚可以被软件选定为1 Hz, 4096 Hz或32,768 Hz中任意一个频率输出该器件提供一个备份电源输入脚VBACK该脚容许器件用电池或大容量电容进行备份供电X1226器件的操作电压范围为2.7 V至5.5V X1226的时钟日历部分的操作可降到1.8V(备用模式) X1226器件可提供4Kbit的EEPROM8块加锁控制可用作用户大量的数据存储的存储器具有安全保密性这个存储器在主电源和备用电源全都失效时不受影响引脚排列图引脚描述串行时钟 (SCL)SCL输入端被用来作为数据输入和输出的时钟同步信号该输入端的输入缓冲器总是激活的串行数据 (SDA)SDA是一个双向引脚用于输入或输出数据它是一个漏极开路输出可以与其它漏极开路或集电极开路输出端线或输入缓冲器总是激活的漏极开路输出需要使用上拉电阻输出电路使用一个斜率控制的下拉来控制输出信号的下降时间电路被设计成400kHz速率的2线接口后备电压VBACK这个输入端为器件提供一个备用电源电压当V CC电源失效时V BACK为器件提供电源或者采用一个大容量电容假如不用时可以接地可编程频率中断输出– PHZ/IRQ这是来自内部振荡器可编程的频率输出脚这是从内部振荡器输出引脚该引脚可以输出频率为32.768kHz 4096Hz 或1Hz 的信号或者无信号当用做中断输出端时该信号通知主机报警已经发生并请求动作它是低输出端激活在时钟控制寄存器图示地址0011h 中这个功能控制位是FO1和FO0参考第6页可编程频率输出位X1, X2图1 推荐晶体连接电源控制操作电源控制电路认同一个VCC 和一个VBACK 输入电源控制电路在VCC< VBACK– 0.2V 时采用VBACK 驱动时钟当VCC 超过VBACK 时切换回VCC 给器件供电图2 电源的控制实时时钟工作实时时钟RTC 使用一个外部的32.768kHz 石英晶体来保持精确的年月日星期时分秒RTC 具有闰年校正和世纪字节时钟对少于31日的月也能校正有一位控制24小时或上午/下午格式当X1226在V CC 和V BACK 都失掉以后再上电时时钟即停止增加直到在时钟寄存器中至少写入一个字节读实时时钟通过一条读命令Read 和在实时时钟的寄存器中规定相应的地址可以读RTC 在序列读方式可以读RTC 寄存器因为时钟是连续运行的而一次读操作需要一定的时间这就有可能在读操作过程中使时间改变本器件中由读命令将时间锁存在分离的锁存器中时钟的下降沿在RTC 数据输出之前的ACK 位保持时钟连续运行以避免当读操作时时间变化当一次读出并不是由读操作引起时将发出报警X1和X2脚分别用作片内振荡器的反相放大器的输入和输出端使要一个外部的32.768kHz 石英晶体为X1226提供一个实时时钟的基准时间建议使用Citizen CFS206-32.768KDZF 型的晶体内部补偿电路被包含到一个完整的振荡电路中关注晶体和电路的布局的位置推荐器件布丰富的地线X1和X2的连线应尽可能的短更多细节看应用章节写实时时钟向RTC寄存器写入可以设置时间和日期为了避免改变当前时间可以进行一次不完全的写操作在RTC数据输入字节之前的ACK位时时钟的下降沿将当前时间的值装载入分别的缓冲器中时钟连续运行新的串行输入数据取代缓冲器中的值这个新的RTC 值由有效写操作序列结束时的停止stop位装载回RTC寄存器一次无效的写操作将中止时间的更新并且缓冲器的内容被丢弃一次有效的写操作之后RTC将反映在停止stop位之后以第一个一秒时钟周期开始的最近装载的数据RTC寄存器写正在进行的同时RTC继续更新时间并且在任何非易失性写操作时RTC继续运行向RTC写入单个字节并不影响其它字节实时时钟的精度实时时钟的精度依赖于石英晶体的频率被用于RTC的基准时间一个晶体引起共鸣的频率依赖于温度RTC的性能也依赖于温度晶体频率的偏差是来自晶体正常频率的温度反转例如大于20ppm频率偏差转变为一个每月大于1分钟的精度这些参数来源于晶体生产厂家可以被利用Xicor公司的RTC系列可提供在芯片上的晶体补偿网络当使用一个12.5 pF的负载晶体时调整负载电容可改变振荡器频率调整的范围是+116ppm 至–37 ppm更多详细信息请看应用章节时钟/控制寄存器CCR时钟/控制寄存器位于由EEPROM阵列分立出来的一个区域它只能跟随在从字节1101111x之后才能访问并且只能在地址[0000h:003Fh]读出或写入定义地址在表1里有描述未定义地址的写和读不推荐访问CCRCCR的内容可以通过向CCR中的任何地址直接以字节写或页面写操作来修改但是在向CCR除了状态寄存器写之前WEL和RWEL位必须用一个两步的序列来设置好见向时钟/控制寄存器写一节CCR被分成5段它们是1Alarm 08字节非易失性2Alarm 18字节非易失性3Control4字节非易失性4Real Time Clock8字节易失性5Status1字节易失性每个寄存器通过缓冲器进行读和写非易失性部分或RTC的计数器部分只有在RWEL 被置位并且当一次有效的写操作和停止位之后才能更新每次只能对CCR的一个段进行序列读或页面写操作对另一段访问需要一次新的操作连续的读或写一旦到达段的末端将返回到段的开始再继续读或页面读可以在CCR的任何地址开始第5段是一个易失性寄存器不需要先设置RWEL位再写状态寄存器第5段只支持单字节的读或写连续读或写该段将停止操作任何时候通过完成一次在CCR中任何地址的随机读可以读出CCR的状态这将返回那个寄存器地址的内容其它的寄存器可通过完成一次序列读来读出读指令将所有的时钟寄存器的内容锁存到一个缓冲器因此时钟的更新不改变被读出的时间对CCR的序列读不会导致从存储器阵列中输出数据在读结束时主机提供一个停止条件以结束操作并释放总线在读CCR之后地址保留在先前的地址+1因而用户可以执行CCR的当前地址读并继续读下一个寄存器表1 时钟/控制存储器图示报警寄存器Alarm0Alarm1有两个报警寄存器它们的内容由RTC寄存器的内容仿制但增加了使能位和24小时时间的选择位使能位规定哪些寄存器可以使用报警寄存器和实时寄存器之间的比较例如结合其它使能位和一个专用报警时间设置使能月位MEOn*用户能够在每一年里的相同时间设立一次触发报警*n=0为报警0n=1为报警1当发生一次匹配时会设置一个报警标志只有通过轮询AL0和AL1位来确定一次报警的发生被使能到IRQ输出用它做为一个硬件的标志报警时使能位被放置在特殊功能寄存器的最高有效位当所有使能位被设置为0时将没有报警用户可以将X1226设置成每星期三的上午8:00报警这可以将EDWn EHRn和EMNn这三个使能位置1并将DW An HRAn和MNAn这三个报警寄存器设置为8:00 AMWednesday每天下午9:30的报警由以下设置EHRn和EMNn使能位置1并将HRAn和MNAn寄存器设置为9:30 PM*n=0为报警0n=1为报警1实时时钟寄存器Real Time Clock时钟/日历寄存器YR MO DT HR MN SC这些寄存器采用BCD码表示时间日期其中SC秒MN分的范围为0至59HR时在带有AM或PM显示H21位时为1至12或者0至23当MIL=1DT日期为1至31MO月为1至12YR年为0至99星期寄存器DW该寄存器提供星期中的日期状态它用三位DY2至DY0来表示星期中的7天该计数值不断地作0-1-2-3-4-5-6-0-1-2的循环数字值分配到星期中的某日是任意的可以由系统软件设计者决定缺省值定义为024小时时间如果HR寄存器中的MIL位为1则RTC使用24小时格式如果MIL位为0则RTC使用12小时格式这时位H21用作AM/PM指示当H21为1显示PM时钟缺省为H21=0的标准时间闰年闰年加一个2月29日它是由年份数能被4除尽决定的年份数能被100除尽不是闰年除非它也能被400除尽这表明2000年是闰年而2100年不是X1228没有校正2100年的闰年状态寄存器SR状态寄存器位于RTC区地址003Fh这是一个易失性寄存器它用来控制写使能锁存位WEL和RWEL两个电源状态和两个报警只读位这个寄存器是独立于存储器阵列和时钟/控制寄存器CCR的表2 状态寄存器SR地址76543210 003Fh BAT AL1AL000RWEL WEL RTCF 缺省00000001 * BAT电池供电易失性这位置1表示器件由电池V BACK供电而不是由V CC这是由硬件置位/复位的只读位* AL1AL0报警位易失性这两位显示报警1或报警2是否与实时时钟匹配如果有某一个匹配了则相应位被置1在状态寄存器SR读操作中最后一个数据位的下降沿复位该标志注意当SR 读时只有被置1的AL0AL1两位会被复位由一次报警发生的报警位置位时正当SR 读操作发生则AL位将保持置位到读操作完成之后* RWEL寄存器写使能锁存易失性该位是一易失性位上电时为低禁止状态在向任何时钟/控制寄存器写入之前RWEL位必须先置1写RWEL位并不引起一次非易失性写周期因此在停止stop 条件之后器件可以立刻准备下一次操作向CCR写入需要RWEL和WEL这两位以一定的步骤都被置位* WEL写使能锁存易失性WEL位控制在一次写操作时对CCR和存储器阵列的访问该位是易失性的上电时处于低禁止状态当WEL位为低时对CCR或任何阵列地址写入都将被忽略在数据字节之后将不发生应答通过对状态寄存器SR的WEL位写1对其它位写0来使WEL位置1一旦被置1WEL保持置1直到被复位为0通过向SR的WEL位写0和其它位也写入0或者直到器件再次上电写WEL位并不引起一次非易失性写周期因此在停止stop条件之后器件可以立刻准备下一次操作* RTCF实时时钟失效位易失性在全部电源失效后该位被置1这是一个由硬件置位的只读位在器件失去全部电源后再上电时该位置位该位的置位与先加VCC 或VBACK无关失去其中一个或另一个电源并不导致RTCF位的置位向RTC的第一次有效写只要写一个字节即可即将RTCF位复位为0* 不用的位位3和位4没有使用但在这些位必须置0当向SR读出数据字节时将包含这二位的0控制寄存器Control* 块保护位BP2BP1BP0非易失性块保护位BP2BP1BP0决定了阵列中的那些块是写保护的对存储器中一个被保护的块写入是被忽略的块保护位可以对阵列的8个段中的某些段提供写保护如表3说明表3 块保护位BP2BP1BP0X1226被保护的地址阵列中被锁部分000无无001180h ~ 1FFh高端1/4 010100h ~ 1FFh高端1/2 011000h ~ 1FFh全阵列100000h ~ 03Fh第1页101000h ~ 07Fh前2页110000h ~ 0FFh前4页111000h ~ 1FFh前8页中断控制和频率输出寄存器INT中断控制和状态位IM AL1E AL0E有二个中断控制位Alarm1中断使能AL1E和Alarm0中断使能AL0E用来分别使能或禁止报警中断信号IRQ的输出当相应的位置1中断即被使能两个易失性位AL1和AL0各自与两个报警有关用来指出某一报警是否已发生这些位在报警条件时置位而与报警中断是否使能无关AL1和AL0位由状态寄存器的第8个时钟的下降沿复位为0脉冲中断模式脉冲中断模式容许重复或复发报警功能因此一个重复或复发报警能够被设置到每一秒或每一分钟或每一小时或每一日或每一星期的同一天脉冲中断模式被作为重复中断模式重复速度被报警时间设定当IM位被设定时脉冲中断模式被使能报警IRQ输出脚将输出一个较短的持续时间(大约1040ms)的单一脉冲假如中断模式位IM位被设置那么这一脉冲将是周期性的IM位中断报警频率0报警单一时间事件的设定1报警重复复发时间事件的设定可编程的频率输出控制位FO1FO0这是两个输出控制位这二位选择内部振荡器的三种输出之一这输出是加在PHZ输出脚上的表4所示是这些输出的选择位当使用PHZ输出功能时报警IRQ输出功能将失效表4 可编程的频率输出位在芯片上振荡器的补偿数字微调寄存器DTR DTR2DTR1和DTR0非易失性数字微调位DTR2DTR1和DTR0调整每秒钟的计数值和平均ppm误差以获取更好的精度DTR2是一个符号位当等于1时为正ppm补偿而等于0时为负ppm补偿DTR1和DTR0是刻度位DTR1给出的是10ppm调整DTR0给出的是20ppm调整通过这三位可以表示30ppm至+30ppm的补偿范围如表5所示表5 数字微调寄存器DTR寄存器调整后的ppmDTR2DTR1DTR00000010100012001130100+0110+10101+20111+30模拟微调寄存器ATR ATR5ATR4和ATR0非易失性从ATR5至ATR0六个模拟微调位用来调整片内负载电容片内负载电容的范围从3.25pf 至18.75pf每一位都有一个不同的电容调节比重使用Citizen CFS-206晶体与不同的ATR 位组合可以对额定频率提供最终的ppm补偿范围从+116ppm至37ppm见表6数字的和模拟的微调结合起来可以给出高达+146ppm的调整芯片电容可以通过下列公式计算出来C A TR = [(ATR value, decimal) x 0.25pF] + 11.0pF范围是从3.25pF到18.75pF每步调节0.25pF这些值是在典型值基础上计算出来的向时钟/控制寄存器写要改变时钟/控制寄存器的任何非易失性位需要以下步骤写02h至状态寄存器将写使能锁存WEL位置1这是一次易失性操作所以在写后没有延迟操作由开始start引导由停止stop结束写06h至状态寄存器将寄存器写使能锁存RWEL和WEL这二位都置1这也是易失性操作在数据字节中的0是必须的操作由开始引导由停止结束向时钟/控制寄存器写1至8个字节写入所需的时钟报警或控制数据这个序列由开始位引导需要一个从地址字节11011110和CCR中的一个地址并由停止位结束要向CCR写改变EEPROM的值就要启动一次非易失性写将化去10ms 才能完成对没有定义的区域写入将不起作用RWEL位在一次非易失性写周期完成时将被复位所以对CCR内容作另一次改变时必须重复以上初始化序列如果由于任何原因而上述序列没有完成例如发送一个不正确的位数或发送开始而未发送停止等则RWEL位未被复位器件保持在激活方式写全0至状态寄存器将WEL和RWEL位都复位在前面的任意操作间发生一次读操作将不影响寄存器的写操作串行通信接口协议器件支持双向总线协议该协议定义向总线发送数据的任何器件为发送器而接收数据的器件为接收器控制发送的器件称为主机而被控制的器件称为从机主机总是启动数据的传送并提供用于发送和接收操作的时钟所以本系列器件在所有的应用中用作从器件时钟和数据在SDA线上的数据只有当SCL为低LOW时才能改变状态当SCL为高HIGH时改变SDA状态被用于表示开始start和停止stop条件见图3图3 在SDA总线上有效的数据变化开始条件所有的命令由开始条件引导它是当SCL为高时SDA由高至低变化器件不断地监视SDA和SCL线上的开始条件并且在该条件被满足以前不响应任何命令见图4停止条件所有的通信必须由停止条件来终止它是当SCL为高时SDA由低至高变化停止条件也用于在一次读序列之后将器件置于电源等待方式在发送器件已经释放总线后才可以发出一个停止条件见图4图4 有效的开始和停止条件应答应答是一个用来表示数据传送成功的软件协议发送器件无论是主机或从机在发送8位后将释放总线在第九个时钟周期中接收器将SDA线拉低作为对接收到8位数据的应答请参见图5图5 接收器发出的应答在器件辨识了开始条件以及如果在从地址字节中包含了正确的器件标识符和选择位后将用一个应答来作为响应如果选择一次写操作在接收了每8位序列以后器件将以一个应答来作为响应器件将会对所有收到的数据和地址字节作出应答除非从地址字节的器件辨识符和/或选择位是不正确的在写保护寄存器中的WEL位为低而要写数据字节时状态寄存器写操作时有第二个数据字节只允许一个数据字节在读方式器件将在发送8位数据后释放SDA线然后监视该线上的应答信号如果检测到一个应答并且主机没有产生停止条件则器件将继续发送数据如果没有检测到应答则器件将终止进一步的数据发送主机这时必须立即发出一个停止条件以便使器件返回等待方式并使器件处于一种已知的状态器件寻址主机在发出开始条件后必须跟着输出一个从地址字节从地址字节的前4位规定了访问EEPROM阵列还是访问CCR1010表示访问EEPROM阵列而1101表示访问CCR该器件出厂时EEPROM阵列未定义客户了解状态后可以进行编程从地址字节的位3至位1规定了器件的选择位它们是111从地址字节的最后一位定义了要完成的操作当R/W位为1时选择了读操作为0时选择写操作见图6从SDA总线输入了整个的从地址字节之后X1228将器件辨识符及器件选择位与1010111或1101111比较如果比较正确器件输出一个应答至SDA线在从地址字节之后跟随一个两字节的字地址这个字地址可以由主机提供也可以从内部计数器获得在上电时内部地址计数器被设置为地址0h因此EEPROM阵列的当前地址读从地址0开始当需要时如同随机读那样主机必须如图6所示提供两字节的字地址在随机读操作时伪写操作中的从地址字节必须与读操作时的从地址字节一致即如果是从阵列中随机读则在两种情况下的从地址字节必须为1010111x同样的如果是对CCR的随机读则两种从地址字节必须为1101111x图6 从地址字地址和数据字节64字节页写操作字节写要进行一次写操作器件需要从地址字节和字地址字节这使得主机可以访问CCR阵列中的任何一个字注意在写CCR之前主机必须先向状态寄存器写02h然后06h以便能写操作见向时钟/控制寄存器写节中的说明收到每个地址字节后X1226响应一个应答在两个地址字节都收到之后X1226等待8位数据在收到8位数据之后X1226再响应一个应答然后主机通过产生一个停止条件来终止传送X1226接着开始一次将数据写入非易失性存储器的内部写周期在内部写周期时器件的输入是被禁止的所以器件将不响应从主机来的任何请求SDA输出端这时处于高阻抗状态见图7图7 字节写序列向存储器的保护块写入是无效的但仍会收到一个应答在写命令结束时X1226将不会启动一次内部写周期和后序的ACK命令页面写X1228具有页面写操作它可以以字节写操作同样的方式启动但是在第一个数据字节传送之后不结束写周期主机可以发送多于63个字节至存储器阵列和多于7个字节至时钟/控制寄存器注意在向CCR写入之前主机必须以两个前导的操作写02h然后06h 至状态寄存器以便使能写操作见向时钟/控制寄存器写节中的说明在收到每个字节后X1226响应一个应答而内部将地址加一当计数器达到该页的末尾时它自动的返回到该页的首地址这意味着主机可从某一页的任何位置开始向存储器阵列写64个字节或向CCR写8个字节如果主机从存储器某页的地址40开始写入30个字节则前23个字节写在地址40至63而后7个字节写在0至6最后地址计数器将指向该写入页的地址7见图8如果主机要写多于1页的最大字节数则前面已写入的数据将被新写入的数据覆盖一次一个字节图8 从地址41开始写30个字节至一个64字节的存储器页主机通过发出停止条件来终止数据字节的传送这引起X1228启动非易失性写周期同字节写操作一样所有的输入都被禁止直到内部写周期完成关于地址应答和数据传送序列请参见图9图9 页面写序列停止和写方式主机至少在送出一个完全的数据字节和收到相关的ACK信号以后才可以送出停止来终止写操作如果在数据字节的中间或在一个完全的字节和ACK之前发生一个停止条件则X1226将自动复位而不完成写操作陈列的内容不受影响应答查询在非易失性写周期时禁止输入通常要用5ms写周期时间一旦发出停止条件表示主机字节写操作结束时X1226即开始内部非易失性写周期应答查询即可立即开始为了做到这点主机发出一个开始条件跟随一个用来写或读操作AEh或AFh的从地址字节如果X1226仍然忙于非易失性写周期则将不返回应答ACK当X1226已经完成写操作将返回一个ACK而主机即可进行读或写操作请参见图10中的流程图图10 应答查询序列有三种基本的读操作当前地址读随机读和序列读当前地址读X1226内部有一个地址计数器它保持的地址是最后一次读出的字节的地址加一所以如果最后一次读的地址是n下一次读操作将访问地地址n+1在上电时16位地址被初始化为0h这样在上电复位之后立即进行的当前地址读可以从第一个地址开始下载存储器的全部内容在收到将R/W位设置为1的从地址字节后X1228发出一个应答然后发送8位数据主机在第九时钟时不响应一个应答而是发出一个停止条件来终止读操作见图11中关于地址应答和数据传送序列图11 当前地址读序列必须注意读操作的第九个时钟周期并不是不必关心的为了终止读操作主机必须在第九周期发出停止条件或者将SDA线拉高然后再发停止条件随机读随机读操作允许主机访问X1226中的任何地址在发出将R/W位置1的从地址字节之前主机必须首先完成一次伪写操作主机发出开始条件和从地址字节收到一个应答然后发出字地址字节在收到每个字地址字节的应答后主机立即发出另一个开始条件和将R/W位置1的从地址字节之后器件发出一个应答接着就是8位数据主机要终止读操作时就不响应一个应答而发一个停止条件关于地址应答和数据传送序列请参见图12图12 随机地址读序列有一种类似的操作称为设置当前地址器件设置地址后在图12中第二个开始条件处主机再发一个停止条件停止条件后X1226即进入等待方式并且直到在检测到一个开始条件前对总线上所有的活动都不理睬这个操作在地址计数器中加载了新的地址下一次当前地址读操作将从新的加载地址读出这种读操作对主机知道它所需读出的下一个地址但数据尚未准备好的情况是有用的。
STM32F4 第19讲 RTC实时时钟程序讲解-M4
✓ RTC原理
RTC闹钟配置一般步骤
① RTC已经初始化好相关参数。 ② 关闭闹钟:RTC_AlarmCmd(RTC_Alarm_A,DISABLE); ③ 配置闹钟参数:RTC_SetAlarm(); ④ 开启闹钟:RTC_AlarmCmd(RTC_Alarm_A,EABLE); ⑤ 开启配置闹钟中断:
RTC_SetWakeUpCounter(); ① 使能WakeUp : RTC_WakeUpCmd( ENABLE); ② 开启配置闹钟中断:
RTC_ITConfig(); EXTI_Init(); NVIC_Init(); ⑤编写中断服务函数: RTC_WKUP_IRQHandler();
✓ RTC原理 讲解RTC实时时钟实验程序。
✓ RTC原理
RTC日历配置一般步骤
① 使能PWR时钟:RCC_APB1PeriphClockCmd(); ② 使能后备寄存器访问: PWR_BackupAccessCmd(); ③ 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig(); RCC_RTCCLKCmd(); 如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);
✓ RTC原理
RTC周期唤醒相关函数
void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock); void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter); uint32_t RTC_GetWakeUpCounter(void); RTC_WakeUpCmd(DISABLE);//关闭WAKE UP
C8051F300和C8051F302芯片的温度补偿实时时钟(TC-RTC)参考设计指南说明书
Rev. 0.1 5/06Copyright © 2006 by Silicon LaboratoriesAN293R EFERENCE D ESIGN P ROGRAMMER 'S G UIDERelevant DevicesThis application note applies to the following devices:C8051F300, C8051F3021. IntroductionReal Time Clocks (RTCs) are used in many applications where it is necessary to keep track of time and date information. The common solution of adding a dedicated RTC device to a board adds to the BOM cost and also increases the board space. A better, cost-effective alternative is to implement the RTC functionality into a microcontroller that performs other useful tasks as well. The Temperature Compensated Real Time Clock (TC-RTC) Reference Design is a complete RTC solution that includes all the firmware and hardware necessary to implement an RTC with full clock and calendar functionality along with temperature compensation. This solution offers significant cost savings compared to solutions involving dedicated RTCs that provide similar functionality.The design uses the Silicon Laboratories C8051F300 Mixed Signal MCU that is available in a 3x3 mm 11-pin QFN package.The TC-RTC RD firmware implements the following functions:⏹Real Time Clock that counts seconds, minutes, hours, date, day of the week, month, and year with leap-year compensation valid up to 2099⏹Automatic time compensation for crystal frequency variations due to temperature ⏹56-Byte NVRAM with the data stored in internal Flash memory⏹SMBus/I 2C Interface or UART Interface, depending on firmware loaded ⏹Square wave output signal at 1/2 Hz rateThis application note describes the design of the TC-RTC hardware and firmware. Refer to the “Temperature Compensated Real Time Clock Reference Design Kit User’s Guide” for step-by-step demonstration instructions.2. Hardware OverviewThe TC-RTC reference design hardware is implemented as an evaluation board that is shown in Figure 1. The Silicon Laboratories C8051F300 MCU uses an external 32kHz crystal tied to a Timer input as the clock source for the RTC. The RTC evaluation board provides two interfaces—UART and SMBus/I 2C.AN293Parallel PortConnector (DB25)Serial PortConnector(DB9)32 kHzCrystalDebugConnector ‘F300MCUPowerConnectorFigure1.TC-RTC C8051F300 Evaluation BoardThe Silicon Laboratories C8051F300 MCU is a small form-factor mixed-signal MCU with a rich feature set. The features of the MCU that are used in this reference design are listed below:⏹High-speed 8051 core that delivers up to 25 MIPS throughput with 25 MHz clock⏹8 kB Flash memory (in-system programmable) and 256 bytes internal data RAM⏹25 MHz internal oscillator and external crystal/oscillator inputs⏹8-bit 500 ksps ADC⏹On-chip temperature sensor⏹Hardware enhanced UART and SMBus serial ports⏹Three general-purpose 16-bit counter/timers⏹Real time clock mode using timer and external clock sourceMore detailed information about this MCU can be found in the C8051F300 data sheet that is available here: /public/documents/tpub_doc/dsheet/Microcontrollers/Small_Form_Factor/en/C8051F30x.pdfThe pin connections of the C8051F300 MCU as used in this design are shown in Figure2. The board schematic and bill of materials are included in the “Temperature Compensated Real Time Clock Reference Design Kit User’s Guide.”AN2933. Compensating for Temperature VariationsThis section describes the theory of operation behind the temperature compensation feature of the TC-RTC RD.3.1. Need for CompensationThe primary parameters that cause frequency deviation in a quartz crystal are as follows:⏹Ambient temperature⏹Age of the crystal⏹Power supply voltageAmong these, the dominant factor that affects the crystal frequency is ambient temperature. Figure3 shows a plot of the variation of crystal frequency versus temperature. From the parabolic curve, it can be seen that the RTC will lose time if the temperature is increased or decreased from the room temperature value (25 C). Note that the RTC will never have a positive error caused by temperature variations (i.e., gain time) because the maximum frequency is at room temperature.AN293Figure3.Parabolic Temperature CurveThe maximum frequency variation is approximately –0.04ppm/ºC2. So, the frequency deviation can be expressed as the following:∆f/f = 0.04 ppm x (∆T)2where,∆T = Ambient Temperature – 25ºC3.2. Calculating Time CompensationThe TC-RTC Reference Design firmware repeats the following steps once per minute to calculate and accumulate lost time.1.The ADC is used to measure the die temperature from the on-chip temperature sensor. “3.3. CalculatingAmbient Temperature” describes the calculation involved.2.The value measured by the ADC is then used to calculate the deviation in ppm, and the result is stored inmemory. This indicates the number of microseconds that need to be compensated.At the end of a 24-hour period, the total accumulated error is added to the RTC time to complete the compensation process. The temperature is assumed to not vary widely within a one-minute period. Refer to the functions in the module “F30x_TCRTC_Temperature.c” for more details.AN2933.3. Calculating Ambient TemperatureThe on-chip temperature sensor produces a voltage output that is proportional to the absolute temperature of the ‘F300 die as shown in Figure 4. The typical relationship between this voltage and the die temperature is shownbelow:where,V TEMP is the temperature sensor voltage output (mV)TEMP C is the die temperature (ºC)"4.2. ADC Configuration" on page 7 describes how the ADC is configured to read the temperature sensor value.More information about the temperature sensor and the ADC can be found in Chapter 5 of the C8051F30x device data sheet.Figure 4.Typical Temperature Sensor Transfer FunctionmVTEMP C mV V C TEMP 89735.3+⨯⎪⎭⎫ ⎝⎛=AN2934. Firmware ImplementationThe following sections describe the register memory map and the primary components that constitute the TC-RTC firmware.4.1. RTC Registers and Non-volatile User RAMFigure 5 shows the addresses of the RTC registers and the NVRAM. The RTC registers store the current time and date information. These registers are maintained in the ‘F300 device internal volatile RAM. " Appendix A—TC-RTC: Supported Commands" on page 9 describes the UART commands used to read and write these registers.The SMBus/I 2C access sequence is described in Section 4.4.The TC-RTC also provides a 56-byte User NVRAM that is stored in the ‘F300 device internal Flash memory. This can be used as a general-purpose non-volatile storage area. The current values of the Flash NVRAM are always mirrored in a 56-byte array in RAM. This is because the ‘F300 Flash memory can be erased only in 512-byte pages. So, writing one or more bytes to the NVRAM is a three-step process—the bytes are first written to the RAM array, the Flash page is erased, and the 56-byte array is copied from RAM to Flash memory.One useful application of this NVRAM is to store the time and date information just before a power failure. The stored information can later be used for debugging or some other purpose. To do this, the power supply line should be monitored and as soon as a dip is detected, the time and date information should be read from the RTC registers and written to the NVRAM. This should be managed by an external device and is not automatically done by the TC-RTC firmware.Figure 5.RTC and NVRAM RegistersSeconds Minutes HoursDay of WeekDate Month YearControl (Reserved)NVRAM 56 x 800H 01H 02H 03H 04H 05H 06H 07H 08H3FHAddress RegisterAN2934.2. ADC ConfigurationThe ADC is configured to use the temperature sensor as the positive input and ground as the negative input. V DD is used as the voltage reference, and the SAR conversion clock is set to 5MHz. The Programmable Gain Amplifier (PGA) is set to a gain of 2. Oversampling is performed to improve the accuracy of the measurements by collecting and averaging 65536 (64k) samples of the temperature sensor output.The first time the TC-RTC board is powered-on after loading the firmware, a 1-point offset calibration is performed as follows:1.Wait for 15 seconds (soak time). This allows the die to heat up to normal operating temperature.2.Measure temperature sensor output using the above ADC settings.Note: The calibration measurement assumes a die temperature of 28 ºC.3.Store the measured value in non-volatile Flash memory.4.3. Timers ConfigurationThe ‘F300 MCU has three general-purpose timers. All these three timers are used by the TC-RTC firmware. The timers are configured and used for the following purposes:⏹Timer0—This is used to provide the SMBus SCL Low Timeout.⏹Timer1—This is either used as a UART baud rate generator, or for SMBus Free Timeout (SCL High) detection.⏹Timer2—This uses the external oscillator as its clock source, and is used for RTC time measurement.4.4. UART InterfaceThe UART interface provided by the TC-RTC is a simple 2-wire interface that uses only the TXD and RXD lines. It supports three commands, which are described in detail with examples in " Appendix A—TC-RTC: Supported Commands" on page 9. Refer to the “Temperature Compensated Real Time Clock Reference Design Kit User’s Guide” for step-by-step demonstration instructions to use this interface.4.5. SMBus InterfaceTwo types of data transfers are possible: data transfers from a master transmitter to an addressed slave receiver (WRITE), and data transfers from an addressed slave transmitter to a master receiver (READ). The master device initiates both types of data transfers and provides the serial clock pulses on SCL. The SMBus interface may operate as a master or a slave, and multiple master devices on the same bus are supported. If two or more masters attempt to initiate a data transfer simultaneously, an arbitration scheme is employed with a single master always winning the arbitration.A typical SMBus transaction consists of a START condition followed by an address byte (Bits7–1: 7-bit slave address; Bit0: R/W direction bit), one or more bytes of data, and a STOP condition. Each byte that is received (by a master or slave) must be acknowledged (ACK) with a low SDA during a high SCL (see Figure6). If the receiving device does not ACK, the transmitting device will read a NACK (not acknowledge), which is a high SDA during a high SCL. See the SMBus chapter in the C8051F30x device data sheet for more information on arbitration and other SMBus details.Figure6.Typical SMBus TransactionThe TC-RTC firmware uses the SMBus interface as a Slave, with a Slave Address of 0xD0. This can be changed by modifying the SLA_ADD macro definition in “F30x_TCRTC_Interface.h”. The Slave TC-RTC can be in one of two modes, which are described in the following sections.AN2934.5.1. Slave Receiver ModeIf the Master transmits a START condition, followed by the correct slave address and the direction bit set to “0”(write), the slave enters this mode and sends an ACK. The first received byte sets the register address pointer in the TC-RTC firmware. Subsequent received bytes are considered data and are written to the register pointed to by the register address pointer, while incrementing the pointer after every write. The Slave sends an ACK after each byte is received. The RTC exits this mode when the Master sends a STOP condition. Figure7 shows a Typical Slave Receiver Sequence.Figure7.Typical Slave Receiver Sequence4.5.2. Slave Transmitter ModeIf the Master transmits a START condition, followed by the correct slave address and the direction bit set to “1”(read), the slave receiver enters this mode and sends an ACK. Then, the RTC starts sending the byte pointed to by the register address pointer set by the previous write operation, while incrementing the pointer after sending each byte. It waits for an ACK from the Master after sending every byte. The RTC exits this mode when the Master sends a NACK. Figure8 shows a Typical Slave Transmitter Sequence.The register address pointer wraps around to address 0x00 when incremented from address 0x3F. Refer to the SMBus ISR in the module “F30x_TCRTC_Main.c” for more details about the implementation of the SMBus state machine.To easily evaluate the SMBus interface provided with the TC-RTC board, a test software utility is provided in AN293.zip. This Windows software uses the PC parallel port to emulate a SMBus Master and communicates with the TC-RTC via its SMBus interface. This is provided only to demonstrate the SMBus interface and is not meant as a real-world application of this design.AN293A PPENDIX A—TC-RTC: S UPPORTED C OMMANDSTC-RTC Firmware with UART InterfaceThe TC-RTC firmware with UART interface supports a set of commands to read/write date and time. The supported commands along with explanations are listed below:⏹s – Toggles auto-display mode that displays time once every second.⏹r xx yy – Read yy bytes starting at address xx.⏹w xx yy data – Write yy bytes starting at address xx.Notes:1.The commands are case-sensitive. Only lower-case letters are accepted.2. The addresses should be in decimal format (e.g., address 0x1F is entered as 31).3. See “ Appendix B—TC-RTC: Implementation Details” for information on how the RTC register data is formatted.Write Command Examples⏹Date/Time: 11:05:39 AM, Saturday, December, 08, 1979→39 05 51 06 08 12 79w000739055106081279⏹Time: 21: 48: 22→22 48 21w0003224821⏹Day: Tuesday →02w030102⏹NVRAM data write: 01 02 03 starting at address 0x1F (31)→31 01 02 03w3103010203Read Command Examples⏹Date/Time: r0007⏹NVRAM (all 56 bytes): r0856⏹NVRAM (4 bytes starting at address 26): r2604AN293A PPENDIX B—TC-RTC: I MPLEMENTATION D ETAILSUART Communication Parameters⏹Baud rate: 9600 bps⏹Data format: 8 data bits, 1 stop bit, no parity⏹Flow control: NoneRTC and NVRAM Registers—Data FormatFigure 9. RTC and NVRAM Registers—Data FormatNotes:1.The contents of the time and calendar registers are in binary coded decimal (BCD) format.2. The Clock Halt (CH) bit, when set to zero, will disable the RTC.3. The 12/24 bit selects 12-hour mode if set to one.4. In 12-hour mode, the AM/PM bit selects “PM” if set to one. In 24-hour mode, this bit is the second 10-hour bit (20-23hours). Silicon Laboratories Inc.400 West Cesar ChavezAustin, TX 78701USASimplicity StudioOne-click access to MCU andwireless tools, documentation,software, source code libraries &more. Available for Windows,Mac and Linux!IoT Portfolio/IoT SW/HW /simplicity Quality /quality Support and CommunityDisclaimerSilicon Labs intends to provide customers with the latest, accurate, and in-depth documentation of all peripherals and modules available for system and software implementers using or intending to use the Silicon Labs products. Characterization data, available modules and peripherals, memory sizes and memory addresses refer to each specific device, and "Typical" parameters provided can and do vary in different applications. Application examples described herein are for illustrative purposes only. Silicon Labs reserves the right to make changes without further notice and limitation to product information, specifications, and descriptions herein, and does not give warranties as to the accuracy or completeness of the included information. Silicon Labs shall have no liability for the consequences of use of the information supplied herein. This document does not imply or express copyright licenses granted hereunder to design or fabricate any integrated circuits. The products are not designed or authorized to be used within any Life Support System without the specific written consent of Silicon Labs. A "Life Support System" is any product or system intended to support or sustain life and/or health, which, if it fails, can be reasonably expected to result in significant personal injury or death. Silicon Labs products are not designed or authorized for military applications. Silicon Labs products shall under no circumstances be used in weapons of mass destruction including (but not limited to) nuclear, biological or chemical weapons, or missiles capable of delivering such weapons.Trademark InformationSilicon Laboratories Inc.® , Silicon Laboratories®, Silicon Labs®, SiLabs® and the Silicon Labs logo®, Bluegiga®, Bluegiga Logo®, Clockbuilder®, CMEMS®, DSPLL®, EFM®, EFM32®, EFR, Ember®, Energy Micro, Energy Micro logo and combinations thereof, "the world’s most energy friendly microcontrollers", Ember®, EZLink®, EZRadio®, EZRadioPRO®, Gecko®, ISOmodem®, Precision32®, ProSLIC®, Simplicity Studio®, SiPHY®, Telegesis, the Telegesis Logo®, USBXpress® and others are trademarks or registered trademarks of Silicon Labs. ARM, CORTEX, Cortex-M3 and THUMB are trademarks or registered trademarks of ARM Holdings. Keil is a registered trademark of ARM Limited. All other products or brand names mentioned herein are trademarks of their respective holders.。
实时时钟DS12C887_C实例程序
DS12C887实例程序#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar nian,yue,ri,day,shi,fen,miao,ashi,afen,sshi,sfen;uchar s1num,flag,flag1,flag2,flag3,flag4,settime,setalarm;/********************************************************************引脚配置定义 GND VCC VL RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK*********************************************************************/#define LCDIO P1sbit LCD1602_RS=P3^5;sbit LCD1602_RW=P3^4;sbit LCD1602_EN=P3^3;sbit s1=P2^1;sbit s2=P2^2;sbit s3=P2^0;sbit s4=P2^3;/********************************************************************/ void LCD_delay(void);void delay_ms(unsigned int n);uchar change_bcd(uchar a);void LCD_en_command(unsigned char command);void LCD_en_dat(unsigned char temp);void LCD_set_xy( unsigned char x, unsigned char y );void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); void LCD_init(void);void write_sfm(uchar,uchar);void setup_time();void setup_alarm();/******************** LCD PART *************************************/void LCD_delay(void){_nop_();_nop_();_nop_();}void delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/********************************* *********************************/ uchar change_bcd(uchar a) //D0~D7转换程序{char temp,i;for(i=0;i<8;i++){temp<<=1;temp|=(a&0x01);a>>=1;}return(temp);}/********************************* *********************************/ void LCD_en_command(unsigned char command){command=change_bcd(command);command=_crol_(command,4);LCD1602_RS=0;LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(command & 0xf0);LCD1602_EN=1;LCD_delay();LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(command << 4) & 0xf0;LCD1602_EN=1;LCD_delay();LCD1602_EN=0;delay_ms(1);}void LCD_en_dat(unsigned char dat){dat=change_bcd(dat);dat=_crol_(dat,4);LCD1602_RS=1;LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(dat & 0xf0);LCD1602_EN=1;LCD_delay();LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(dat << 4) & 0xf0;LCD1602_EN=1;LCD_delay();LCD1602_EN=0;delay_ms(1);}/********************************************************************/ void LCD_set_xy( unsigned char x, unsigned char y ){unsigned char address;if (y ==0)address = 0x80 + x;elseaddress = 0xC0 + x;LCD_en_command(address);}/********************************************************************/ void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {LCD_set_xy( X, Y ); //set addresswhile (*s) // write character{LCD_en_dat(*s);s ++;}}/********************************************************************/ void LCD_init(void){LCD1602_RW=0;LCD_en_command(0x01);delay_ms(5);LCD_en_command(0x01);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x0C);delay_ms(5);LCD_en_command(0x80);delay_ms(5);LCD_en_command(0x01);delay_ms(5);}/********************************************************************/void write_sfm(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;LCD_en_command(add);LCD_en_dat(shi+'0');LCD_en_dat(ge+'0');}/*****************************SET DAY & TIME***************************************/ void setup_time(){if(s1==0){delay_ms(5);if(s1==0){s1num++;TR0=0; //关定时器flag=1;flag1=1;flag3=1;flag4=1; //停止扫描DS12C887_read_time,setup_alarmwhile(!s1);if(s1num==1){LCD_en_command(0x82);LCD_en_command(0x0f);}}if(s1num==2){LCD_en_command(0x85);}if(s1num==3){LCD_en_command(0x88);}if(s1num==4){LCD_en_command(0x8b);}if(s1num==5){LCD_en_command(0xc0);}if(s1num==6){LCD_en_command(0xc3);}if(s1num==7){LCD_en_command(0xc6);}if(s1num==8){s1num=0;TR0=1; //开定时器flag1=0;flag3=0;flag4=0; //执行扫描setup_alarmsettime=1; //执行settimeLCD_en_command(0x0c);}}if(s1num!=0){/********************************************************************/ if(s2==0){delay_ms(2);if(s2==0){while(!s2);if(s1num==1){nian++;if(nian==100)miao=0;write_sfm(0x82,nian);LCD_en_command(0x82);}if(s1num==2){yue++;if(yue==13)yue=0;write_sfm(0x85,yue);LCD_en_command(0x85);}if(s1num==3){ri++;if(ri==32)ri=0;write_sfm(0x88,ri);LCD_en_command(0x88);}if(s1num==4){day++;if(day==8)day=1;write_sfm(0x8b,day);LCD_en_command(0x8b);}if(s1num==5){shi++;if(shi==24)shi=0;write_sfm(0xc0,shi);LCD_en_command(0xc0);}if(s1num==6){fen++;if(fen==60)fen=0;write_sfm(0xc3,fen);LCD_en_command(0xc3);}if(s1num==7){miao++;if(miao==60)miao=0;write_sfm(0xc6,miao);LCD_en_command(0xc6);}}}/********************************************************************/ if(s3==0){delay_ms(2);if(s3==0){while(!s3);if(s1num==1){nian--;if(nian==-1)nian=99;write_sfm(0x82,nian);LCD_en_command(0x82);}if(s1num==2){yue--;if(yue==0)yue=12;write_sfm(0x85,yue);LCD_en_command(0x85);}if(s1num==3){ri--;if(ri==0)ri=31;write_sfm(0x88,ri);LCD_en_command(0x88);}if(s1num==4){day--;if(day==0)day=7;write_sfm(0x8b,day);LCD_en_command(0x8b);}if(s1num==5){shi--;if(shi==-1)shi=23;write_sfm(0xc0,shi);LCD_en_command(0xc0);}if(s1num==6){fen--;if(fen==-1)fen=59;write_sfm(0xc3,fen);LCD_en_command(0xc3);}if(s1num==7){miao--;if(miao==-1)miao=59;write_sfm(0xc6,miao);LCD_en_command(0xc6);}}}/********************************************************************/ }}/********************************************************************//********************************************************************/void setup_alarm(){if(s4==0){delay_ms(5);if(s4==0){s1num++;TR0=0; //关定时器flag=1;flag2=1;flag3=1;flag4=1; //停止扫描DS12C887_read_time,setup_timewhile(!s4);if(s1num==1){LCD_en_command(0x01);LCD_write_string(0,0,"Start alarm at");write_sfm(0xcb,ashi);write_sfm(0xce,afen);LCD_write_string(0x0d,1,":");LCD_en_command(0xcb);LCD_en_command(0x0f);}}if(s1num==2){LCD_en_command(0xce);}if(s1num==3){LCD_en_command(0x01);LCD_write_string(0,0,"Stop alarm at");write_sfm(0xcb,sshi);write_sfm(0xce,sfen);LCD_write_string(0x0d,1,":");LCD_en_command(0xcb);LCD_en_command(0x0f);}if(s1num==4){LCD_en_command(0xce);}if(s1num==5){s1num=0;TR0=1; //开定时器flag2=0;flag3=0;flag4=0; //执行扫描setup_timesetalarm=1; //执行setalarmLCD_en_command(0x01); //清LCD屏幕LCD_write_string(0,0,"20 - -");LCD_write_string(2,1,": :");LCD_en_command(0x0c);}}if(s1num!=0){/********************************************************************/ if(s2==0){delay_ms(5);if(s2==0){while(!s2);if(s1num==1){ashi++;if(ashi==24)ashi=0;write_sfm(0xcb,ashi);LCD_en_command(0xcb);}if(s1num==2){afen++;if(afen==60)afen=0;write_sfm(0xce,afen);LCD_en_command(0xce);}if(s1num==3){sshi++;if(sshi==24)sshi=0;write_sfm(0xcb,sshi);LCD_en_command(0xcb);}if(s1num==4){sfen++;if(sfen==60)sfen=0;write_sfm(0xce,sfen);LCD_en_command(0xce);}}}/********************************************************************/ if(s3==0){delay_ms(5);if(s3==0){while(!s3);if(s1num==1){ashi--;if(ashi==-1)ashi=23;write_sfm(0xcb,ashi);LCD_en_command(0xcb);}if(s1num==2){afen--;if(afen==-1)afen=59;write_sfm(0xce,afen);LCD_en_command(0xce);}if(s1num==3){sshi--;if(sshi==-1)sshi=23;write_sfm(0xcb,sshi);LCD_en_command(0xcb);}if(s1num==4){sfen--;if(sfen==-1)sfen=59;write_sfm(0xce,sfen);LCD_en_command(0xce);}}}/********************************************************************/ }}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.6 实时时钟实验5.6.1 实验目的1. 了解实时时钟在嵌入式系统中的作用;2. 掌握实时时钟的使用。
5.6.2 实验内容1. 编程实现实时时钟功能,每秒显示实时时钟;2. 编程实现实时时钟告警功能。
5.6.3 预备知识1. 了解ADT集成开发环境的基本功能;2. 学习S3C24X0的实时时钟模块的使用。
5.6.4 实验设备1. 硬件:JXARM9-2440教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE开发环境。
5.6.5 基础知识1. 实时时钟在嵌入式系统中的作用在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。
2. S3C24X0的实时时钟单元下图为S3C24X0的实时时钟框图。
它具有以下特点:图5-12 S3C24X0的实时时钟框图1)时钟数据采用BCD编码;2)能够对闰年的年月日进行自动处理;3)具有告警功能,当系统处于关机状态时,能产生告警中断;4)具有独立的电源输入;5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。
3. S3C24X0的实时时钟寄存器1) 控制寄存器表5-16 控制寄存器2) 告警控制寄存器3) 实时时钟计数器表5-18 实时时钟计数器4) 告警时间寄存器包括年、月、日、时、分、秒。
它们都以BCD的格式表示,地址见下表:表5-19 告警时间寄存器5) 实时时钟寄存器包括年、月、日、时、分、秒。
它们都以BCD的格式表示,地址见下表:注意事项:1. 以上各寄存器都只能以字节模式进行读写操作;2. 当系统使用BIG-ENDIAN模式时,各寄存器对应的地址为会有所改变,具体值请参考S3C44B0X的数据手册。
4. 实验参考代码及说明:/* 包含文件 */#include "2410addr.h"#include "2410lib.h"#include "2410RTC.h"#include "interrupt.h"/* 表示日期、时间的数据结构 */typedef struct ST_DATE{short year; // 年char mon; // 月char day; // 日char week_day; // 星期char hour; // 时char min; // 分char sec; // 秒} st_date;/* 全局变量 */int led_index = 0;int ext0_count = 0;/* functions */void rtc_tick_isr(void);void rtc_int_isr(void);/***************************************************************************** // Function name : rtc_set_date// Description : 修改实时时钟当前时间、日期// Return type : void// Argument : p_date, 待设置的日期*****************************************************************************/ void rtc_set_date(st_date* p_date){rRTCCON = 0x01;rBCDYEAR = p_date->year;rBCDMON = p_date->mon;rBCDDAY = p_date->day;rBCDDATE = p_date->week_day;rBCDHOUR = p_date->hour;rBCDMIN = p_date->min;rBCDSEC = p_date->sec;rRTCCON = 0x00;}/***************************************************************************** // Function name : rtc_get_date// Description : 获取实时时钟当前时间、日期// Return type : void// Argument : p_date, 返回日期的指针*****************************************************************************/ void rtc_get_date(st_date* p_date){rRTCCON = 0x01;p_date->year = rBCDYEAR ;p_date->mon = rBCDMON ;p_date->day = rBCDDAY ;p_date->week_day= rBCDDATE ;p_date->hour = rBCDHOUR ;p_date->min = rBCDMIN ;p_date->sec = rBCDSEC ;rRTCCON = 0x00;}/*****************************************************************************// Function name : rtc_tick_init// Description : 初始化S3C2410的TICK定时器// Return type : void// Argument : tick, 设置的TICK频率(时钟滴答的周期为 (1+tick)/128秒)*****************************************************************************/void rtc_tick_init( char tick ){Irq_Request(IRQ_TICK, rtc_tick_isr);rRTCCON = 0x0; //No reset[3], Merge BCD counters[2], BCD clock select XTAL[1], RTC Control disable[0]rTICNT = (tick&0x7f)|0x80; /*TICK 中断使能,周期为(1+tick)/128秒*/Irq_Enable(IRQ_TICK);}/*****************************************************************************// Function name : rtc_alarm_set// Description : 设置S3C2410的告警时间以及方式// Return type : void// Argument : p_date, 告警的时间// mode, 告警模式*****************************************************************************/void rtc_alarm_set(st_date* p_date, unsigned char mode){Irq_Request(IRQ_RTC, rtc_int_isr);rRTCCON = 0x01;rALMYEAR = p_date->year;rALMMON = p_date->mon;rALMDATE = p_date->day;rALMHOUR = p_date->hour;rALMMIN = p_date->min;rALMSEC = p_date->sec;rRTCALM = mode;rRTCCON = 0x00;Irq_Enable(IRQ_RTC);}/***************************************************************************** // Function name : Main// Description : JXARM9-2440 实时时钟实验主程序// 完成功能:// 时钟滴答:每秒钟刷新数码管显示// 设置当前日期、时间// 动态刷新当前日期、时间,通过串口打印出来// 时间告警功能:每分钟的第5秒告警,并进行跑马灯显示// Return type : void// Argument : void*****************************************************************************/ void Main(void){int old_index ;st_date m_date;/* 配置系统时钟 */ChangeClockDivider(2,1);U32 mpll_val = 0 ;mpll_val = (92<<12)|(1<<4)|(1);ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);/* 中断初始化 */Isr_Init();/* 初始化串口 */Uart_Init(0,115200);Uart_Select(0);/* 打印提示信息 */Uart_Printf("\n---实时时钟测试程序---\n");Uart_Printf("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200, 8, N, 1)\n");Uart_Printf("\n实时时钟测试开始\n");/* 采用BCD编码,如2004年需要设置的值为0x2004 */m_date.year = 0x2000+0x04 ;m_date.mon = 0x03 ;m_date.day = 0x02 ;m_date.week_day = 0x02 ;m_date.hour = 0x15 ;m_date.min = 0x40 ;m_date.sec = 0x00 ;/* 修改当前日期和时间 */rtc_set_date(&m_date);m_date.sec = 0x05 ;/* 设置告警的时间及方式,0x41表示使能RTC告警,以及使能秒时钟告警 */rtc_alarm_set(&m_date, 0x41);rtc_tick_init(127);old_index = led_index;Uart_Printf("\r\n\r\n");while(1){if(old_index != led_index) /* 每隔一秒更新一次数据*/{rtc_get_date(&m_date);old_index = led_index;Uart_Printf( /* 时钟数据为BCD码格式,以16进制显示 */"\b\b\b\b\b\b\b\b%02x:%02x:%02x", m_date.hour, m_date.min,m_date.sec);}};}/***************************************************************************** // Function name : rtc_tick_isr// Description : TICK中断处理程序,程序中设置每秒钟引发一次中断// Return type : int// Argument : void*****************************************************************************/ void rtc_tick_isr(void){Irq_Clear(IRQ_TICK); /* 清除TICK中断 */led_index++;}/***************************************************************************** // Function name : rtc_int_isr// Description : rtc中断处理程序,程序中设置每分钟的第5秒引发该中断// Return type : int// Argument : void*****************************************************************************/ void rtc_int_isr(void){Irq_Clear(IRQ_RTC); /*清除RTC中断*/ext0_count++;Uart_Printf("\r\nAlarm\r\n ");}本实验测试S3C24X0的实时时钟功能,包括:1) 时钟滴答功能测试,通过LED显示TIME TICK;2) 时间告警功能测试。