//进入Standby模式
void Sys_Enter_Standby(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
RCC_APB2PeriphResetCmd(0X01FC,DISABLE);
PWR_EnterSTANDBYMode();
}
//RTC中断服务程序
void RTC_IRQHandler(void)
{
LED_Init();
if(RTC_GetITStatus(RTC_IT_ALR)!=RESET)
{
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
EXTI_ClearITPendingBit(EXTI_Line17);
LED0=0;
delay_ms(200);
RTC_SetAlarm(4+RTC_GetCounter());
RTC_WaitForLastTask();
}
}
//RTC参数初始化
void RTC_Init(void)
{
NVIC_InitTypeDef NVIC_InitSrtucture;
EXTI_InitTypeDef EXTI_InitStructure;
if(BKP_ReadBackupRegister(BKP_DR1)!=0x1016)
{
RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR |
RCC_APB1Periph_BKP,ENABLE );
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit ();
RCC_LSEConfig (RCC_LSE_ON);
while(!RCC_GetFlagStatus (RCC_FLAG_HSERDY)) {}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetPrescaler(32767);
RTC_WaitForLastTask();
RTC_SetCounter(0);
RTC_WaitForLastTask();
RTC_SetAlarm(4);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR,ENABLE);
RTC_WaitForLastTask();
}
else
{
RTC_WaitForSynchro();//??RTC???????
RTC_ITConfig(RTC_IT_ALR, ENABLE);//??RTC???
RTC_WaitForLastTask();
}
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitSrtucture.NVIC_IRQChannel=RTC_IRQn;
NVIC_InitSrtucture.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitSrtucture.NVIC_IRQChannelSubPriority=1;
NVIC_InitSrtucture.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitSrtucture);
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
//主程序
int main(void)
{
short temperature;
u8 t0,t1,t2;
u8 t4;
delay_init();
LED_Init();
LED1=0;
uart_init(115200);//初始化Uart,设置波特率115200
while(DS18B20_Init()) {}//初始化DS818B20
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
temperature=-temperature; //变正数
t4=49; //符号位为1
}
else
{
t4=48;//符号位为0
}
t0=temperature%10+48;//小数位
temperature=temperature/10;
t1=temperature%10+48;//个位
temperature=temperature/10;
t2=temperature%10+48;//十位
//传输温度
delay_ms(1);
USART_SendData(USART1,t4);
delay_ms(1);
USART_SendData(USART1,t2);
delay_ms(1);
USART_SendData(USART1,t1);
delay_ms(1);
USART_SendData(USART1,t0);
delay_ms(1);
USART_SendData(USART1,0x0d);
delay_ms(1);
USART_SendData(USART1,0x0a);
delay_ms(1);
RTC_Init();//开始计时,定时唤醒
Sys_Enter_Standby();
}