工程代码: 14_时钟制作.rar
实验目的:学习了一段时间,需要整理下,简单 实现了 时钟的这个功能。
1.使用内部RTC产生时间,显示在LCD上
2.USART1 串口设置时间
3. 定时功能,通过usart设置定时时间
4. TIM3定时30s 查看 定时时间到没, 时间到,定时时间变为0
(其实可以 LED闪烁)
5. flash 保存时间设置,复位按照新设置的时间启动
6. 注意: 写flash,需要整页擦除,注意 每页大小1K
这里的 flash 写函数没有修改
- /*
-
* Author : 余威先
-
* Date: 2011.6.19
-
* 开发板上:PD2 ~ LED2
-
* PA8 ~ LED0
-
* PA15 ~ KEY1
-
* PA13 ~ KEY2
-
* 修改Date: 2011.6.30 19:20
-
* rcc时钟配置: SYSCLK = 16MHZ
-
* AHB = 16MHZ
-
* APB1 = 8 MHZ // TIM2 TIM3 TIM4
-
* APB2 = 16 MHZ //GPIO A B C D
-
* 修改Date:2011.7.1 18:30
-
简单描述:
-
1.使用内部RTC产生时间,显示在LCD上
-
2.USART1 串口设置时间
-
3. 定时功能,通过usart设置定时时间
-
4. TIM3定时30s 查看 定时时间到没, 时间到,定时时间变为0
-
(其实可以 LED闪烁)
-
5. flash 保存时间设置,复位按照新设置的时间启动
-
6. 注意: 写flash,需要整页擦除,注意 每页大小1K
-
这里的 flash 写函数没有修改
-
目的:
-
*/
-
#include "stm32f10x.h"
-
#include "rcc.h"
-
#include "systick.h"
-
#include "led.h"
-
#include "delay.h"
-
//#include "key.h"
-
#include "tim3.h"
-
#include "usart1.h"
-
//#include "spi.h"
-
#include "lcd.h"
-
#include "rtc.h"
-
#include "flash.h"
-
-
volatile u8 sec = 0; // 全局变量 秒 时 小时
-
volatile u8 min = 0;
-
volatile u8 hour = 0;
-
volatile u8 set_min = 0; //全局变量 定时时间
-
volatile u8 set_hour = 0;
-
-
u16 flash_dat = 0;
-
-
int main(void)
-
{
-
RCC_Configuration(); //系统时钟配置
-
delay_init(); // 延时 初始化
-
-
RTC_Configuration(); //RTC系统 配置
-
RTC_NVIC_Configuration(); //RTC中断配置
-
RTC_Init();// RTC 时钟初始化
-
-
USART1_GPIO_Configuration();//USART1 初始化
-
USART1_Configuration();
-
USART1_NVIC_Configuration();
-
-
TIM3_Configuration();//定时器3 配置初始化
-
TIM3_NVIC_Configuration();
-
-
-
LCD_Init(); //LCD 彩屏初始化
-
-
write_cmd(0x2C); //LCD 写数据命令
-
DrawFull_single_colour(0xff, 0xff); //显示 纯白色
-
-
LCD_PutString(0,16,"Time:");//设置时钟显示
-
LCD_PutString(56,16,":");
-
LCD_PutString(80,16,":");
-
-
set_hour = (u8)GetPara(ADDR_BASE);//读取flash中数据
-
set_min = (u8)GetPara(ADDR_BASE+4);
-
hour = (u8)GetPara(ADDR_BASE+8);
-
min = (u8)GetPara(ADDR_BASE+12);
-
sec = (u8)GetPara(ADDR_BASE+16);
-
while(1) //无限循环, 中断中 显示 秒时钟
-
{
-
LCD_show_number_2(40,16,hour);
-
LCD_show_number_2(64,16,min);
-
LCD_show_number_2(88,16,sec);
-
LCD_show_number_2(8,32,set_hour);
-
LCD_show_number_2(32,32,set_min);
-
}
-
return 0;
-
}
-
-
void RTC_IRQHandler(void) //中断函数
-
{
-
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
-
{
-
RTC_ClearITPendingBit(RTC_IT_SEC);//清除 RTC秒中断标志
-
sec ++;// 定义的全局变量
-
if(sec ==60)
-
{
-
sec = 0;
-
min ++;
-
if(min == 60)
-
{
-
min = 0;
-
hour++;
-
if(hour==12)
-
hour = 0;
-
}
-
}
-
RTC_WaitForLastTask();//等待就绪
-
}
-
}
-
-
-
void USART1_IRQHandler(void) //USART1 接收中断
-
{
-
u8 flag_usart1 = 0; //数据接收完成标志
-
static u8 i_rev = 0; //循环接收 次数
-
static u8 dat_rev[7];//接收存储数组空间
-
//假如传输的位数<7 ,需要填充其他字符
-
-
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断
-
{
-
dat_rev[i_rev] = USART_ReceiveData(USART1);
-
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清标记
-
-
i_rev++;
-
if(i_rev == 7) //循环接收 10 个字符
-
{
-
i_rev = 0;
-
flag_usart1 = 1;
-
}
-
}
-
-
if(flag_usart1 ==1)
-
{
-
flag_usart1 = 0;
-
-
/*串口传输123456其实,传输的是asiic码 0x49 0x50
-
为了得到真正的值,-48 */
-
if(dat_rev[0] == 's') //设置定时时间
-
{
-
set_hour = (dat_rev[1] - 48)*10 + dat_rev[2] -48;
-
set_min = (dat_rev[3] - 48)*10 + dat_rev[4] -48;
-
// SavePara(ADDR_BASE,set_hour);
-
// SavePara(ADDR_BASE+4,set_min);
-
}
-
else if(dat_rev[0] == '#')//设置时钟时间
-
{
-
hour = (dat_rev[1] - 48)*10 + dat_rev[2] -48;
-
min = (dat_rev[3] - 48)*10 + dat_rev[4] -48;
-
sec = (dat_rev[5] - 48)*10 + dat_rev[6] -48;
-
-
//只能 写整张页面
-
FLASH_Unlock(); //每次擦除Flash中数据时得先解锁
-
FLASH_ErasePage(ADDR_BASE); //擦除页
-
-
FLASH_ProgramWord(ADDR_BASE+8,hour);//写32位字
-
FLASH_ProgramWord(ADDR_BASE+12,min);
-
FLASH_ProgramWord(ADDR_BASE+16,sec);
-
FLASH_Lock();
-
// SavePara(ADDR_BASE+8,hour);
-
// SavePara(ADDR_BASE+12,min);
-
// SavePara(ADDR_BASE+16,sec);
-
}
-
}
-
}
-
-
void TIM3_IRQHandler(void)//30秒 中断
-
{
-
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//判断是否为定时器3溢出中断
-
{
-
if(set_hour == hour)
-
{
-
if(set_min == min) //定时时间到, 执行一些事件
-
{
-
set_min = 0;
-
set_hour = 0;
-
}
-
}
-
}
-
// TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清中断标记
-
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
-
}
阅读(1304) | 评论(0) | 转发(0) |