Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4463998
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-07-01 18:33:44

工程代码: 14_时钟制作.rar   

实验目的:
学习了一段时间,需要整理下,简单 实现了 时钟的这个功能。
            
               1.使用内部RTC产生时间,显示在LCD上
               2.USART1 串口设置时间
               3. 定时功能,通过usart设置定时时间
               4. TIM3定时30s 查看 定时时间到没, 时间到,定时时间变为0
                  (其实可以 LED闪烁)
               5. flash 保存时间设置,复位按照新设置的时间启动
               6. 注意: 写flash,需要整页擦除,注意 每页大小1K
                          这里的 flash 写函数没有修改


  1. /*
  2. *    Author :     余威先
  3. *    Date:         2011.6.19    
  4. * 开发板上:PD2 ~ LED2
  5. * PA8 ~ LED0
  6. * PA15 ~ KEY1
  7. * PA13 ~ KEY2
  8. * 修改Date: 2011.6.30 19:20
  9. * rcc时钟配置: SYSCLK = 16MHZ
  10. * AHB = 16MHZ
  11. *              APB1 = 8 MHZ // TIM2 TIM3 TIM4
  12. *                 APB2 = 16 MHZ //GPIO A B C D
  13. * 修改Date:2011.7.1 18:30
  14.     简单描述:
  15.      1.使用内部RTC产生时间,显示在LCD上
  16.              2.USART1 串口设置时间
  17.              3. 定时功能,通过usart设置定时时间
  18.              4. TIM3定时30s 查看 定时时间到没, 时间到,定时时间变为0
  19.              (其实可以 LED闪烁)
  20.              5. flash 保存时间设置,复位按照新设置的时间启动
  21.              6. 注意: 写flash,需要整页擦除,注意 每页大小1K
  22.              这里的 flash 写函数没有修改
  23.     目的:
  24. */
  25. #include "stm32f10x.h"
  26. #include "rcc.h"
  27. #include "systick.h"
  28. #include "led.h"
  29. #include "delay.h"
  30. //#include "key.h"
  31. #include "tim3.h"
  32. #include "usart1.h"
  33. //#include "spi.h"
  34. #include "lcd.h"
  35. #include "rtc.h"
  36. #include "flash.h"

  37. volatile u8 sec = 0; // 全局变量 秒 时 小时
  38. volatile u8 min = 0;
  39. volatile u8 hour = 0;
  40. volatile u8 set_min = 0; //全局变量 定时时间
  41. volatile u8 set_hour = 0;

  42. u16 flash_dat = 0;

  43. int main(void)
  44. {    
  45.     RCC_Configuration(); //系统时钟配置
  46.     delay_init();     // 延时 初始化

  47.     RTC_Configuration(); //RTC系统 配置
  48.     RTC_NVIC_Configuration(); //RTC中断配置
  49.     RTC_Init();// RTC 时钟初始化

  50.     USART1_GPIO_Configuration();//USART1 初始化
  51.     USART1_Configuration();
  52.     USART1_NVIC_Configuration();

  53.     TIM3_Configuration();//定时器3 配置初始化
  54.     TIM3_NVIC_Configuration();


  55.     LCD_Init();         //LCD 彩屏初始化

  56.     write_cmd(0x2C); //LCD 写数据命令
  57.     DrawFull_single_colour(0xff, 0xff);    //显示 纯白色
  58.     
  59.     LCD_PutString(0,16,"Time:");//设置时钟显示
  60.     LCD_PutString(56,16,":");
  61.     LCD_PutString(80,16,":");

  62.     set_hour = (u8)GetPara(ADDR_BASE);//读取flash中数据
  63.     set_min = (u8)GetPara(ADDR_BASE+4);
  64.     hour = (u8)GetPara(ADDR_BASE+8);
  65.     min = (u8)GetPara(ADDR_BASE+12);
  66.     sec = (u8)GetPara(ADDR_BASE+16);
  67.     while(1) //无限循环, 中断中 显示 秒时钟
  68.     {
  69.         LCD_show_number_2(40,16,hour);
  70.         LCD_show_number_2(64,16,min);
  71.         LCD_show_number_2(88,16,sec);
  72.         LCD_show_number_2(8,32,set_hour);
  73.         LCD_show_number_2(32,32,set_min);    
  74.     }
  75.     return 0;
  76. }

  77. void RTC_IRQHandler(void) //中断函数
  78. {
  79.     if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  80.     {
  81.         RTC_ClearITPendingBit(RTC_IT_SEC);//清除 RTC秒中断标志
  82.         sec ++;// 定义的全局变量
  83.         if(sec ==60)
  84.         {
  85.             sec = 0;
  86.             min ++;
  87.             if(min == 60)
  88.             {
  89.                 min = 0;
  90.                 hour++;
  91.                 if(hour==12)
  92.                     hour = 0;
  93.             }
  94.         }    
  95.         RTC_WaitForLastTask();//等待就绪
  96.     }    
  97. }


  98. void USART1_IRQHandler(void) //USART1 接收中断
  99. {
  100.     u8 flag_usart1 = 0; //数据接收完成标志
  101.     static u8 i_rev = 0; //循环接收 次数
  102.     static u8 dat_rev[7];//接收存储数组空间
  103.     //假如传输的位数<7 ,需要填充其他字符

  104.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断
  105.     {
  106.         dat_rev[i_rev] = USART_ReceiveData(USART1);    
  107.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);     //清标记

  108.         i_rev++;
  109.         if(i_rev == 7)    //循环接收 10 个字符
  110.         {    
  111.             i_rev = 0;
  112.             flag_usart1 = 1;
  113.         }
  114.     }

  115.     if(flag_usart1 ==1)
  116.     {
  117.         flag_usart1 = 0;

  118.         /*串口传输123456其实,传输的是asiic码 0x49 0x50
  119.          为了得到真正的值,-48 */
  120.         if(dat_rev[0] == 's') //设置定时时间
  121.         {
  122.             set_hour = (dat_rev[1] - 48)*10 + dat_rev[2] -48;
  123.             set_min = (dat_rev[3] - 48)*10 + dat_rev[4] -48;
  124. //            SavePara(ADDR_BASE,set_hour);
  125. //            SavePara(ADDR_BASE+4,set_min);    
  126.         }
  127.         else if(dat_rev[0] == '#')//设置时钟时间
  128.         {
  129.             hour = (dat_rev[1] - 48)*10 + dat_rev[2] -48;
  130.             min = (dat_rev[3] - 48)*10 + dat_rev[4] -48;
  131.             sec = (dat_rev[5] - 48)*10 + dat_rev[6] -48;

  132.             //只能 写整张页面
  133.             FLASH_Unlock();             //每次擦除Flash中数据时得先解锁
  134.              FLASH_ErasePage(ADDR_BASE); //擦除页

  135.               FLASH_ProgramWord(ADDR_BASE+8,hour);//写32位字
  136.             FLASH_ProgramWord(ADDR_BASE+12,min);
  137.             FLASH_ProgramWord(ADDR_BASE+16,sec);
  138.               FLASH_Lock();
  139. //            SavePara(ADDR_BASE+8,hour);
  140. //            SavePara(ADDR_BASE+12,min);
  141. //            SavePara(ADDR_BASE+16,sec);
  142.         }
  143.     }
  144. }

  145. void TIM3_IRQHandler(void)//30秒 中断
  146. {
  147.     if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//判断是否为定时器3溢出中断
  148.     {
  149.         if(set_hour == hour)
  150.         {
  151.             if(set_min == min) //定时时间到, 执行一些事件
  152.             {
  153.                 set_min = 0;
  154.                 set_hour = 0;
  155.             }
  156.         }
  157.     }    
  158. //    TIM_ClearFlag(TIM3, TIM_FLAG_Update);     //清中断标记
  159.     TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  160. }

阅读(1304) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~