STC32G&RTC时钟

这篇博客介绍了如何在C文件中初始化RTC实时时钟,包括选择内外部32K时钟源,并设置了时间设置函数和中断设置函数。通过RTC_Set函数可以设置年、月、日、小时、分钟、秒和1/128秒,而RTCI_Set函数则用于开启或关闭不同级别的中断。RTC_Isr函数处理了不同类型的中断事件。在主函数中,RTC被初始化并设置了一个示例时间。
摘要由CSDN通过智能技术生成

基本应用

.C文件中编写好

/**
  *设置时:INIYEAR(INI+xxxx)(参考下方)
  *读取时:YEAR年 MONTH月 DAY日 HOUR时 MIN分 SEC秒 SSEC(1/128秒)
 */

//RTC实时时钟初始化
//参数mod:	作用: 0.內部32K   1.外部32K
void RTC_Init(bit mod)
{
	if(mod)
	{
		//选择外部32K
		X32KCR = 0xc0;				//启动外部32K晶振
		while (!(X32KCR&0x01));		//等待时钟稳定
		RTCCFG &=~0x02;				//选择外部32K作为RTC时钟源
	}
	else
	{
		//选择內部32K
		IRC32KCR=0x80;				//启动内部32K晶振
		while(!(IRC32KCR&0x01));	//等待时钟稳定
		RTCCFG|=0x02;				//选择内部32K作为RTC时钟源
	}
	RTCIF=0x00;		//清中断标志
	RTCCR=0x01;		//RTC使能
}

//RTC实时时钟时间设置
/*参数
 Year(年):	范围:0~未知(20+值)
 Month(月):	范围:1~12
 Day(日):	范围:1~31
 Hour(小时):	范围:00~23
 Min(分钟):	范围:00~59
 Sec(秒):	范围:00~59
 Ssec(1/128秒): 范围:00~127
*/


void RTC_Set(u8 Year,u8 Month,u8 Day,u8 Hour,u8 Min,u8 Sec,u8 Ssec)
{
	INIYEAR = Year;
	INIMONTH = Month;
	INIDAY = Day;
	INIHOUR = Hour;
	INIMIN = Min;
	INISEC = Sec;
	INISSEC=Ssec;
	RTCCFG|=0x01;		//触发RCT寄存器初始化
	while(RTCCFG&0x01);	//等待
}

//RTC实时时钟中断设置
/*参数
Ifen:总中断			范围:0(关闭)/1(开启)
Numsen:目标中断		范围:0(关闭)/1(开启)
mod:目标				范围:0(1/32秒)1(1/8秒)2(1/2秒)3(1秒)4(1分钟)5(1小时)6(1日(24小时))
*/
void RTCI_Set(bit Ifen,bit Numsen,u8 mod)
{
	if(Ifen){RTCIEN|=0x80;}else{RTCIEN&=(~0x80);}
	if(Numsen){RTCIEN|=(0x01<<mod);}else{RTCIEN&=~(0x01<<mod);}
}

//RTC实时时钟中断事件
void RTC_Isr()	interrupt 13
{
	//RTC实时时钟中断
	if(RTCIF&0x80)				//闹钟中断
	{
		
		RTCIF&=~0x80;
	}
	else if(RTCIF&(0x80>>1))	//1日中断
	{
		
		RTCIF&=(0x80>>1);
	}
	else if(RTCIF&(0x80>>2))	//1小时中断
	{
		
		RTCIF&=(0x80>>2);
	}
	else if(RTCIF&(0x80>>3))	//1分钟中断
	{
		
		RTCIF&=(0x80>>3);
	}
	else if(RTCIF&(0x80>>4))	//1秒中断
	{
		
		RTCIF&=(0x80>>4);
	}
	else if(RTCIF&(0x80>>5))	//1/2秒中断
	{
		
		RTCIF&=(0x80>>5);
	}
	else if(RTCIF&(0x80>>6))	//1/8秒中断
	{
		
		RTCIF&=(0x80>>6);
	}
	else if(RTCIF&(0x80>>7))	//1/32秒中断
	{
		
		RTCIF&=(0x80>>7);
	}
	
}

.H文件声明好上面编写好的函数

void RTC_Init(bit mod);		//RTC实时时钟初始化
void RTC_Set(u8 Year,u8 Month,u8 Day,u8 Hour,u8 Min,u8 Sec,u8 Ssec);//RTC实时时钟时间设置
void RTCI_Set(bit Ifen,bit Numsen,u8 mod);		//RTC实时时钟中断设置

主函数中

设置完后,比如想读取当前秒的值直接调用SEC就行了

void main()
{
	EAXFR=1;		//使能扩展区
	WTST=0x00;		//CPU运行速度最快
	RTC_Init(0);	//RTC实时时钟初始化
	RTC_Set(1,1,1,1,1,1,1);    //设置时间
	while(1)
	{
		//读取时:YEAR年 MONTH月 DAY日 HOUR时 MIN分 SEC秒 SSEC(1/128秒)
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值