基于STM32的多功能数字钟(中文版)

发布者:雅致书香最新更新时间:2016-09-23 来源: eefocus关键字:STM32  数字钟  中文版 手机看文章 扫描二维码
随时随地手机看文章
/**************************************************************************************
程序功能:基于STM32的多功能数字钟(中文版)
**************************************************************************************
  1、时钟的基准用STM32F103RCT6自带的RTC实现。
  2、这三个按键的功能分别为:"设置"、"加"、"减"。(WAKEUP KEY0 KEY1)
    三个按键作为这三个功能:
    键盘上的WAKEUP用作"设置",KEY0用作"加",KEY1用作"减"。
    设定时间、日期、星期时,按下设定键,
    相应的参数会闪动,即一亮一灭,提示正的修改的数据,每按一下设置键,
    设定的项目就会变化,顺序为:
    秒--分--时--星期--日--月--年--闹铃分--闹铃时。
    顺序设定完后,再按一下设定键,就退出设定状态,回到正显示状态。
  3、用DS18B20显示温度。精确到小数点后一位。如:33.5℃。
  4、增加用红外遥控器的CH CH+ CH- 三个按键进行时间设置,
      功能等同于键盘上的(WAKEUP KEY0 KEY1)"设置"、"加"、"减"。
  5、通过串行口设置时间日期。
  如串行口发送t12:30:00 设置时间;
  如串行口发送d2016-08-12 设置日期;
  6、通过触摸屏进行时间日期设置
    在触摸屏上有 "设置"、"加"、"减"三个标志,当用触笔去按时,就会产生同开发板上的
    按键一样的效果。
     触摸按下去和弹起来时,按键的颜色会发生变化。
  7、闹铃时间到,蜂鸣器发生“嘀嘀”声
  8、超温报警
   TFT屏界面如下:
     -----------------------------------------  
|      --多功能数字钟--                          |
|      作者:王庐山 16/08/18               |
|      日期:2016年08月18日              |
|      时间:17时12分                           |
|      星期:四                                        |
|      温度:34.5℃                                |
|          ___  __    __                              |
|       |设置|  |加 |  |减 |                            |
|        ----     ---     ---                               |  
    ------------------------------------------       
9、需要完速程序的朋友请QQ我。                                      
**************************************************************************************     
硬件:LED0----GPIOA.8     (LED运行灯) 
      KEY0----GPIOC.5   (对时间日期进行设置)    
      KEY1----GPIOA.15
      KEY_WAKEUP----GPIOA.0
      TIMER2定时器定时功能。(用于LED运行灯)
      TIMER5定时器的定时和捕获功能(红外解析)
      TFT液晶屏2。8寸屏带触摸功能。(显示界面与触摸功能)
      TOUCH触摸屏。   (触摸按键)
      DS18B20---PC4;   (环境温度)
      HS138红外遥控---PA1;(实现红外调时)
      串行口USART1;  (实现串口调时调时)
      RTC实时时钟    (时间基准)
      SD卡           (存放字库,文件系统使用)
      EEPROM 24C02    (存放触摸屏的相关信息)
      FLASH W25Q64      (存放字库的相关信息及文件系统使用)
软件:FATFS(文件系统)
      MALLOC(存储管理)
      汉字字库
      SPI总线协议
      IIC总线协议
      
开发板:正点原子MINI开发板
**************************************************************************************
编程目的:让大赛学生尽快学会STM32的综合编程。
           本程序用到了STM32众多的硬件资源,还用到了存储管理和FATFS,
           只要学会了该程序的编程,可以这样说,你的STM32已经入门了。
**************************************************************************************      
编程软件:KEIL5
**************************************************************************************
常用的算法:
按键采用状态机实现按键扫描。在定时器中对按键进行处理。
红外部分采用定时器捕获功能实现。
时间用STM32自带的RTC实现;
**************************************************************************************
时间:2016.8.18
作者:王庐山
工作室:湖北工业职业技术学院电子创新中心
***************************************************************************************/
 
#include "stm32f10x_conf.h"
#include "delay.h"
#include "sys.h"
#include "LED.h"
#include "key.h"
#include "timer2.h"
#include "24cxx.h" 
#include "lcd.h"
#include "touch.h" 
#include "usart.h"
#include "rtc.h" 
#include "ds18b20.h"
#include "remote.h"
#include "malloc.h"
#include "flash.h" 
#include "spi.h"
#include "mmc_sd.h"
#include "exfuns.h"
#include "fattester.h"
#include "ff.h"   
#include "fontupd.h"
#include "diskio.h"
#include "text.h"
 
 
 
 
//时间结构体
typedef struct 
{
vu8 s_hour;
vu8 s_min;
vu8 s_sec;
//公历日月年周
vu16 s_year;
vu8  s_month;
vu8  s_date;
vu8  s_week;
    vu8 s_al_min;
vu8 s_al_sec;     
}Timer;
 
Timer S_timer;
unsigned char flag_20ms=0x0,flag_500ms=0,flag_250ms=0,flag_1s=0;//定时标志
unsigned char  flag_key0=0,flag_key1=0,flag_key2=0,flag_tiao=0,key_remot=0;
 
void Disp_Tiao_Shan(void);
void Load_Drow_Dialog(void);
 
 
int main(void)
 {
   unsigned char temp[12],sec_back=0xff,t=0,len=0;
   short temp5;
   delay_init();
   NVIC_Configuration();
   uart_init(9600);
   Led_Init();
   key_init();
   Timer2_config(71,2000);  //定时两毫秒 
     
   mem_init();
   SPI_Flash_Init();
   SD_Initialize();
   exfuns_init();
 
     
   DS18B20_Init();
   Remote_Init();
   AT24CXX_Init(); 
   RTC_Init();     
   LCD_Init();
   LCD_Clear(BLUE);  
   TP_Init();    
   POINT_COLOR=RED;
   BACK_COLOR=BLUE;
   if(!font_init())   
        printf("字库OK!、\r\n");
   else
       {
       if(!update_font(10,30,16))
         printf("字库更新完毕!、\r\n");
       }
   
   Show_Str(10,30,220,24,"--多功能数字钟--",24,0);
   Show_Str(30,70,230,24,"作者:王庐山 16/08/18",16,0); 
   Show_Str(10,100,220,24,"日期:    年  月  日",24,0);
   Show_Str(10,140,220,24,"时间:  时  分  秒   ",24,0);
   Show_Str(55,260,150,24,"设置  加  减",24,0);
       
   calendar.al_hour=AT24CXX_ReadOneByte(0x0000);//从24C02中读出闹铃时间
   calendar.al_min=AT24CXX_ReadOneByte(0x0001);
   
  // POINT_COLOR=YELLOW ;  
   LCD_DrawRectangle(50,250,100,290);
   LCD_DrawRectangle(110,250,160,290);
   LCD_DrawRectangle(170,250,220,290);
   f_mount(fs[0],"0:",1);
   f_mount(fs[1],"1:",1);
   
   
while(1)
    { 
        if(tp_dev.sta&TP_PRES_DOWN)//有触摸按下状态。
        {//按下时,方框的颜色要发生变化,这样看效果才明显示,
        //手松开后,又要恢复原画的颜色。
            if((tp_dev.x[0]>50)&&(tp_dev.x[0]<100)&&(tp_dev.y[0]>250)&&(tp_dev.y[0]<290))
                {LCD_Fill(51,251,99,289,YELLOW);Show_Str(55,260,48,24,"设置",24,0);}
            else if((tp_dev.x[0]>110)&&(tp_dev.x[0]<160)&&(tp_dev.y[0]>250)&&(tp_dev.y[0]<290))
                {LCD_Fill(111,251,159,289,YELLOW);Show_Str(120,260,48,24,"加",24,0);}
            else if((tp_dev.x[0]>170)&&(tp_dev.x[0]<220)&&(tp_dev.y[0]>250)&&(tp_dev.y[0]<290))
                {LCD_Fill(171,251,219,289,YELLOW);Show_Str(180,260,48,24,"减",24,0);}        
        }       
        
     if((USART_RX_STA&0x8000))//收到了一帧串行口数据,进行解析。
     { 
       switch(USART_RX_BUF[0])
             {
             case 't':{//time是调时间
            S_timer.s_hour=(USART_RX_BUF[1]-'0')*10+(USART_RX_BUF[2]-'0');
            S_timer.s_min=(USART_RX_BUF[3]-'0')*10+(USART_RX_BUF[4]-'0');
            S_timer.s_sec=(USART_RX_BUF[5]-'0')*10+(USART_RX_BUF[6]-'0');
            USART_RX_STA=0;     
            printf("set time:%s",USART_RX_BUF);
           calendar.sec=S_timer.s_sec;
           calendar.hour=S_timer.s_hour;
           calendar.min=S_timer.s_min;
           calendar.w_date=S_timer.s_date;
           calendar.w_month=S_timer.s_month;
           calendar.w_year=S_timer.s_year; 
           calendar.week=S_timer.s_week; 
           RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);                       
             break;             
                    }
           case 'd':{//date是调日期
            S_timer.s_year =(USART_RX_BUF[1]-'0')*1000+(USART_RX_BUF[2]-'0')*100+(USART_RX_BUF[3]-'0')*10+(USART_RX_BUF[4]-'0');
            S_timer.s_month=(USART_RX_BUF[5]-'0')*10+(USART_RX_BUF[6]-'0');
            S_timer.s_date=(USART_RX_BUF[7]-'0')*10+(USART_RX_BUF[8]-'0');
            USART_RX_STA=0; 
            printf("set date:%s",USART_RX_BUF);   
           calendar.sec=S_timer.s_sec;
           calendar.hour=S_timer.s_hour;
           calendar.min=S_timer.s_min;
           calendar.w_date=S_timer.s_date;
           calendar.w_month=S_timer.s_month;
           calendar.w_year=S_timer.s_year; 
           calendar.week=S_timer.s_week; 
           RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);                       
                break;             
               }  
           default :break;
             }    
     }     
     
   if(flag_tiao!=0)//用于调节时闪烁显示
     {
        switch(flag_tiao)
            {
          case 1: {
                      if(flag_250ms==1)
                      {
                      LCD_ShowString(10+12*14,140,24,24,24,"  ");
                          break;          
                      } 
                     else goto kk2; 
                    }
          case 2: {
                    if(flag_250ms==1)
                      {
                      LCD_ShowString(10+12*10,140,24,24,24,"  ");
                          break;                     
                      } 
                     else goto kk2;       
                           
                    }
          case 3: {
                    if(flag_250ms==1)
                      {
                      LCD_ShowString(10+12*6,140,24,24,24,"  ");
                          break;                      
                      } 
                     else goto kk2;        
                    
                    }
          case 4: {
                   if(flag_250ms==1)
                      {
                      LCD_ShowString(10+12*6,180,24,24,24," ");
                          break;                     
                      } 
                     else goto kk2;
                   }
          case 5: {
                    if(flag_250ms==1)
                      {
                      LCD_ShowString(10+12*16,100,24,24,24,"  ");
                          break;                     
                      } 
                     else goto kk2;       
                    
                    }
          case 6: {
                    if(flag_250ms==1)
                      {                       
                      LCD_ShowString(10+12*12,100,24,24,24,"  ");
                          break;                    
                      } 
                     else goto kk2; 
                    }
          case 7: {
                    if(flag_250ms==1)
                      {
                      LCD_ShowString(10+12*6,100,48,24,24,"    ");
                          break;                   
                      } 
                     else goto kk2; 
                    } 
           case 8: {
                    if(flag_250ms==1)
                      {
                      LCD_ShowString(30+12*8,180,24,24,24,"  ");
                          break;                     
                      } 
                     else goto kk2;       
                           
                            }
          case 9: {
                    if(flag_250ms==1)
                      {
                      LCD_ShowString(30+12*4,180,24,24,24,"  ");
                          break;                      
                      } 
                     else goto kk2;        
                    
                    }
          kk2:
                { 
               sprintf(temp,"日期:%04d年%02d月%02d日",calendar.w_year,calendar.w_month,calendar.w_date);     
               Show_Str(10,100,220,24,temp,24,0);    
               sprintf(temp,"时间:%02d时%02d分%02d秒 ",calendar.hour,calendar.min,calendar.sec);     
               Show_Str(10,140,220,24,temp,24,0); 
               if(flag_tiao<=7)
                   {sprintf(temp,"星期:%01d",calendar.week);
                   Show_Str(10,180,100,24,temp,24,0); }
               else
                   {
                   sprintf(temp,"闹铃:%02d时%02d分 ",calendar.al_hour,calendar.al_min);     
                   Show_Str(10,180,220,24,temp,24,0); }
               
                    break;
                 } 
          default :break ;          
        
               }     
     
     } 
     else//正常显示
       {
        if(sec_back!=calendar.sec)
           {       
               sprintf(temp,"日期:%04d年%02d月%02d日",calendar.w_year,calendar.w_month,calendar.w_date);     
               Show_Str(10,100,220,24,temp,24,0);    
               sprintf(temp,"时间:%02d时%02d分%02d秒 ",calendar.hour,calendar.min,calendar.sec);     
               Show_Str(10,140,220,24,temp,24,0); 
               sprintf(temp,"星期:%01d         ",calendar.week);
               Show_Str(10,180,220,24,temp,24,0); 
               
           }
       }   
      keyfunction();//按键扫描和功能解析(包括了开发板上的按键、红外遥控按键、触摸按键)
       if(flag_1s ==1)//每秒读取一次温度
       {
           flag_1s =0; 
           //LCD_ShowString(30+5*12,180,210,24,24,"      "); 
           temp5=DS18B20_Get_Temp();
           sprintf(temp,"温度:%02d.%01d℃",temp5/10,temp5%10);     
           Show_Str(10,220,210,24,temp,24,0);            
          
       } 
    }
 }
 
/*
 函数功能:显示画图框
 
 */
 void Load_Drow_Dialog(void)
{
LCD_Clear(RED);//清屏   
  POINT_COLOR=BLUE;//设置字体为蓝色 
LCD_ShowString(lcddev.width-30,0,200,24,24,"RST");//显示清屏区域  
}
关键字:STM32  数字钟  中文版 引用地址:基于STM32的多功能数字钟(中文版)

上一篇:基于STM32的多功能数字钟
下一篇:选择ARM处理器的ARM7还是Cortex-M3

推荐阅读最新更新时间:2024-03-16 15:11

怎么使用ST的库开发STM32
我使用的芯片是 STM32F103VET 和编译器是 IAR ARM V5.5,调试器用 JLINK V8 1,下载ST的库,现在的版本是 STM32F10x_StdPeriph_Lib_V3.3.0,解压缩,然后将 Libraries整个拷贝到你的工作目录,Project 目录是很多演示代码,可以参考怎么怎么编程,很容易的,readme里面都有说明。 2,建立一个 IAR 的project 选择 C 的空项目,为了方便管理我分了多个文件夹,分别是 建立一个 CMSIS目录 放内核启动代码添加两个系统启动文件,分别是在 STM32F10x_StdPeriph_Lib_V3.3.0\Libraries\CMSIS\CM3\Devi
[单片机]
基于STM32的传感器接口模块的设计
摘要:基于STM32实现了电流型、电压型以及数字IO型传感器接口模块;进行了接口模块的软件设计,说明了详细的固件代码设计。除传统串口外,提供以太网接口,嵌入UDP协议,提供后期开发的便利接口。 关键词:信号接口;传感器接口模块;UDP协议 0 引言 物联网将会是未来很长一段时间内IT产业的发展趋势,一个完整的物联网系统的构成或产业链的划分,目前业界比较统一的观点基本都认为应该包括三个层面:末端设备或子系统、通信连接系统、以及管理和应用系统。即Device-设备、Connect-连接和Manage-管理。由于数字整合的需求日益增长,对作为感知层核心组成元素的传感器数据融合提出了更高要求。如何将传感器连入网络成为一个尤其重要的问题
[工业控制]
基于<font color='red'>STM32</font>的传感器接口模块的设计
STM32 Nucleo Shield显示板卡,简化超低功耗设备GUI设计
意法半导体新推出的STM32 * Nucleo Shield显示板卡开创物联网产品人机界面之先河。新SPI Shield显示板卡X-NUCLEO- GFX01M1利用STM32G0微控制器(MCU)的经济性,支持引入低成本非内存映射SPI闪存IC支持等新功能的最新版TouchGFX软件(4.15.0版)。 如果采用STM32G0和TouchGFX开发项目,开发人员可用仅5美元的物料清单成本,给任何项目添加一个小图形界面屏幕,这样,定时器、控制器、家用电器等简单设备也能为用户带来类似智能手机的使用体验。 新的X-Nucleo-GFX01M1 Shield显示板卡支持新的X-cube-display软件包,该软件包提供了
[单片机]
<font color='red'>STM32</font> Nucleo Shield显示板卡,简化超低功耗设备GUI设计
STM32的嵌套中断系统NVIC和RCC详细整理
STM32的嵌套中断系统NVIC和RCC详细整理 用的是stm32f103的最新3.5的库。 一、综述: 1、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有
[单片机]
STM32-一文读懂EXTI外部中断/事件系统
STM32的外部中断/事件系统简介 注意这里的外部中断指的是EXTI,是芯片的外部中断,主要是由芯片外部事件触发的中断,不是内核的外部中断!在《STM32-异常与中断》中提到的外部中断均是相对于内核而言的,比如串口中断、定时器中断等等都是(内核的)外部中断。 大部分的STM32外部中断/事件控制器由19个产生事件/中断请求的边沿检测器组成,支持 19 个外部中断/事件请求,这19 个外部分别中断为: (互联型 )产品有20个) 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 每个中断设有状态位,每个中断/事件都有独
[单片机]
STM32-一文读懂EXTI外部中断/事件系统
stm32 起步 gpio操作
在工程中增加gpio lib.h和stm32头文件,如下: #include “stm32f10x.h” // Device header #include “stm32f10x_gpio.h” 调用lib配置gpio工作方式,先开启时钟,选GPIO,设置GPIO mode,gpio speed,主要看GPIO_InitTypeDef 结构体,芯片不同结构体不同,开始不清楚具体使用可以参考系统自带的example code,my setting如下: void GPIO_Initmain(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure all
[单片机]
Ubuntu下安装Stm32的Eclipse的开发环境(1)
在最起初的时候,我刚刚接触linux上单片机的开发,最喜欢的就是 eclipse + arm-plug-in + arm-none-eabi 的开发环境,因为这是在Linux上最接近于windows下keil、IAR等IDE的开发方式,然而那是由于对eclipse亦或是makefile等编译过程中的工具的不甚了解,很多时候会遇到一些莫名的错误,也导致了那是觉得这样的环境很鬼畜,现在看来多是一些很浅显的问题,直到最近我再一次的尝试了eclipse开发环境的搭建和使用,我才很顺利的完成了程序的配置。现在也把这个方法推荐给大家,不过在使用这个方式前,还是建议大家先把之前的文章内容看懂了,否则很多时候遇到问题都会不知道怎么解决。 安装
[单片机]
STM32】条件编译不起作用是什么原因
在工程中定义了几个条件编译,用来适应不同的硬件设备,但是好像不起作用似的。这种情况可能是在多个文件中使用了条件编译,但是编译工程的时候又只是编译了部分文件,即使有部分使用了条件编译的文件没有被重新编译。 解决办法: 1.把所有使用了条件编译的文档全部编译一遍;2.把工程全部编译一遍。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved