⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testrtc.c

📁 基于ARM7(LPC2132)的实事时钟测试程序
💻 C
字号:
//------------------功能说明----------------//
//--实时时钟,并定时到闹铃响,n s后自动关闭--//
//------------------------------------------//

#include "2440lib.h"
#include "2440addr.h"
//--------------声明-----------------//
void SetRTCtime( U8 RTCyear, U8 RTCmon, U8 RTCdate, U8 RTCweek, U8 RTChour, U8 RTCmin, U8 RTCsec);//设置时间
void SetRTCalm(U8 AlmYear, U8 AlmMon, U8 AlmDate, U8 AlmHour, U8 AlmMin, U8 AlmSec);//设置闹铃
void OpenRTC(void);//开始RTC
void CloseRTC(void);//关闭RTC
void OpenAlarm(void);//打开闹铃
void CloseAlarm(void);//关闭闹铃
void GetTime(void);//读取时间
void __irq TickIsr(void);//秒中断
void __irq AlarmIsr(void);//闹铃中断
//--------------定义----------------//
#define FREQ 5000	//freq = 5000
char *week[8] = { "","SUN","MON", "TUES", "WED", "THURS","FRI", "SAT" } ;//指针数组//don't set to "unsigned char"
static U16 year;
static U8 month,date,weekday,hour,min,sec;

void xmain(void)
{
	ChangeClockDivider(3,1);
	ChangeMPllValue(127,2,1);		//405MHZ
	
	Isr_Init();
	Uart_Init(0, 115200);
	Uart_Select(0);
	Uart_Printf("the main is running\n");		
	
	//-------------设定时间,闹铃--------------//
	SetRTCtime(8,10,30,04,11,55,0x30);//年、月、日、星期、时、分、秒
	SetRTCalm(8,10,30,11,55,0x35);//年、月、日、时、分、秒
	//--------------打开------------//	
	OpenRTC();//
	OpenAlarm();//开闹铃	   
	while(1);			   	
}

//设定时间
void SetRTCtime( U8 RTCyear, U8 RTCmon, U8 RTCdate, U8 RTCday, U8 RTChour, U8 RTCmin, U8 RTCsec)
{
	rRTCCON = 0x01;//RTC control enable
	
	rBCDYEAR = RTCyear;//年
	rBCDMON = RTCmon;//月
	rBCDDATE = RTCdate;//日
	rBCDDAY = RTCday;//星期
	rBCDHOUR = RTChour;//时
	rBCDMIN = RTCmin;//分
	rBCDSEC = RTCsec;//秒
	
	rRTCCON = 0x00;//RTC control disable
}

//设定闹铃,年,月,日,时,分,秒
void SetRTCalm(U8 AlmYear, U8 AlmMon, U8 AlmDate, U8 AlmHour, U8 AlmMin, U8 AlmSec)
{
	rRTCCON = 0x01;//RTC control enable(read/write)
	
	rALMYEAR = AlmYear;//年
	rALMMON = AlmMon;//月
	rALMDATE = AlmDate;//日
	rALMHOUR = AlmHour;//时
	rALMMIN = AlmMin;//分
	rALMSEC = AlmSec;//秒
	
	rRTCCON = 0x00;//RTC control disable		
}

//打开时钟
//即设置Tick时钟计数寄存器
void OpenRTC(void)
{
	//设置Tick时钟计数寄存器
	rTICNT |= 	(1<<7)//Tick interrput enanle
		  	   |127;//Tick time count value = 127

	//设置中断,用来输出时间信息
	pISR_TICK = (unsigned)TickIsr;//向量地址//don't to "U8",I don't kown.
	EnableIrq(BIT_TICK);//使能中断
}

//关闭时钟
void CloseRTC(void)
{
	rTICNT &= ~(1<<7);//Tick interupt disable
	
	DisableIrq(BIT_TICK);//disable
}

//打开闹铃
//即设置RTC定时控制寄存器
void OpenAlarm(void)
{
	//设置RTC定时控制寄存器
	rRTCALM = 0x7f;//all of enable
	
	//设置中断,闹铃到鸣蜂鸣器
	ClearPending(BIT_RTC);
	pISR_RTC = (unsigned)AlarmIsr;//(U8)AlarmIsr();//向量地址
	EnableIrq(BIT_RTC);//enable RTC interrupt
	
}

//关闭闹铃
void CloseAlarm(void)
{
	rRTCALM = 0;//disable all of alarm
	
	DisableIrq(BIT_RTC);//disable 
}

//得到时间
void GetTime(void)
{
	rRTCCON = 0x01;//enable read 
	
	year = rBCDYEAR;//年
	month = rBCDMON;//月
	date = rBCDDATE;//日
	weekday = rBCDDAY;//星期
	hour = rBCDHOUR;//时
	min = rBCDMIN;//分
	sec = rBCDSEC;//秒
	
	rRTCCON = 0x00;//disable read
}

//Tick ISR
void __irq TickIsr(void)
{
	ClearPending(BIT_TICK);//Clear
	
	GetTime();//get time
	Uart_Printf("RTC TIME : %4d-%02d-%02d - %s - %02d:%02d:%02x\n",year,month,date,week[weekday],hour,min,sec);//显示格式?
}

//Buzzer run
void BuzzerRun(void)
{
	//---------------set PWM-----------------//
	rGPBCON = ( rGPBCON | (3<<2) ) & ( ~(1<<2) );//GPB1 -> PWM
	rTCFG0 = 0x0f;//Prescaler 0 
	rTCFG1 |= (1<<5);//MUX 1 (0010 = 1/8)
	rTCNTB1 = (PCLK>>7)/FREQ;//周期
	rTCMPB1 = rTCNTB1>>1;	// 占空比50% 
	//set Timer control register
	rTCON |=  (1<<11)//auto reload
	    	 |(0<<10)//inverter off
	    	 |(1<<9)//Updata TCNTB1 & TCMPB1
	    	 |(1<<8);//start for Timer1
	    	 
	rTCON &= ~(1<<9);//clear manual update bit
}

//Buzzer stop 
void BuzzerStop(void)
{	//set GPB1 as output,and stop for Timer1
	rGPBCON = ( rGPBCON | (3<<2) ) & ( ~(2<<2) );//GPB1 -> output
	rGPBDAT &= ~(1<<1);//output '0'
	rTCON &= ~(1<<8);//stop for Timer1
}

//alarm ISR
void __irq AlarmIsr(void)
{
	static U8 FalgBuzzerStop;
	
	ClearPending(BIT_RTC);
		
	if(!FalgBuzzerStop)//as '0',Run Buzzer and reset alarm
	{
		BuzzerRun();//run
		//reset alarm
		SetRTCalm(8,10,30,11,55,0x40);//年、月、日、时、分、秒
		
		FalgBuzzerStop = 1;//
		Uart_Printf("Run alarm\n");
	}
    else//as '1',stop Buzzer ,close alarm
    {
    	BuzzerStop();//stop buzzer
    	CloseAlarm();//close alarm
    	
    	Uart_Printf("Stop alarm\n");
    }             
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -