找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2672|回复: 1
收起左侧

STM32 RTC时钟秒表程序

[复制链接]
ID:526050 发表于 2019-5-2 17:47 | 显示全部楼层 |阅读模式
参考制作的秒表时钟

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "exti.h"
  5. #include "sys.h"
  6. #include "usart.h"
  7. #include "lcd.h"
  8. #include "usmart.h"
  9. #include "rtc.h"
  10. #include "timer.h"
  11. #include "touch.h"
  12. #include "myiic.h"
  13. #include "24cxx.h"
  14. #include "tsensor.h"
  15. #include "adc.h"
  16. u16 jia;
  17. u16 jian;
  18. u32 tiao=0;
  19. u16 min;
  20. u16 sec;
  21. u16 msec;
  22. u32 jishu;

  23. u8 flag=1;
  24. u32 dao;
  25. u32 dao1;
  26. u32 dao2;
  27. u8 daoshi;
  28. u16 daofen;
  29. u16 daomiao;
  30. u8 daoshi1;
  31. u16 daofen1;
  32. u16 daomiao1;

  33.        


  34.        
  35. int main(void)
  36. {
  37.         u8 t;
  38.           u16 adcx;
  39.         float temp;//温度
  40.         float temperate;
  41.   NVIC_Configuration();         
  42.         delay_init();                     //延时函数初始化          
  43.         uart_init(9600);                 //串口初始化为9600
  44.         LED_Init();                                //初始化与LED连接的硬件接口
  45.         LCD_Init();                                //初始化LCD
  46.   KEY_Init();
  47.         EXTIX_Init();
  48.                  Adc_Init();       
  49.   T_Adc_Init();
  50.          tp_dev.init();       
  51.           
  52.         TIM3_Int_Init(100,7199);//10Khz的计数频率,计数到5000为500ms
  53.         usmart_dev.init(72);        //初始化USMART                                        
  54.         POINT_COLOR=RED;//设置字体为红色
  55.         while(RTC_Init())                //RTC初始化        ,一定要初始化成功
  56.         {
  57.                 LCD_ShowString(60,130,200,16,16,"RTC ERROR!   ");       
  58.                 delay_ms(800);
  59.                 LCD_ShowString(60,130,200,16,16,"RTC Trying...");       
  60.         }                                                                   
  61.         //显示时间
  62.         POINT_COLOR=BLUE;//设置字体为蓝色                                         
  63.         LCD_ShowString(60,130,200,16,16,"    -  -     ");          
  64.         LCD_ShowString(60,162,200,16,16,"  :  :  ");       
  65.         LCD_ShowNum(84,162,calendar.min,2,16);       
  66.                 LCD_ShowString(60,216,200,16,16,"change");
  67.                 LCD_ShowString(60,260,200,16,16,"start");
  68.                 LCD_ShowString(160,260,200,16,16,"end");
  69.           LCD_DrawRectangle(55,216,115,242);
  70.                 LCD_DrawRectangle(55,260,105,276);
  71.                 LCD_DrawRectangle(150,260,195,276);
  72.                 LCD_ShowString(60,30,200,16,16,"TEMP_VAL:");             
  73.         LCD_ShowString(60,50,200,16,16,"TEMP_VOL:0.000V");             
  74.         LCD_ShowString(60,70,200,16,16,"TEMPERATE:00.00C");
  75.         dao1=dao;
  76.        
  77.         while(1)
  78.         {                               
  79.                 u32 now;
  80.                 static u8 k=0;                       
  81.                 static u8 c;       
  82.                
  83.                 extern u32 temp2;//时间
  84.                
  85.                
  86.                 //温度显示
  87.                 adcx=T_Get_Adc_Average(ADC_CH_TEMP,10);
  88.                 LCD_ShowxNum(132,30,adcx,4,16,0);//显示ADC的值
  89.                 temp=(float)adcx*(3.3/4096);
  90.                 temperate=temp;//保存温度传感器的电压值
  91.                 adcx=temp;
  92.                 LCD_ShowxNum(132,50,adcx,1,16,0);                     //显示电压值整数部分
  93.                 temp-=(u8)temp;                                                            //减掉整数部分                  
  94.                 LCD_ShowxNum(148,50,temp*1000,3,16,0X80);        //显示电压小数部分
  95.                 temperate=(1.43-temperate)/0.0043+25;                //计算出当前温度值         
  96.                 LCD_ShowxNum(140,70,(u8)temperate,2,16,0); //显示温度整数部分
  97.                 temperate-=(u8)temperate;          
  98.                 LCD_ShowxNum(164,70,temperate*100,2,16,0X80);//显示温度小数部分



  99.                 //日期显示
  100.                 if(t!=calendar.sec)
  101.                 {
  102.                         t=calendar.sec;
  103.                         LCD_ShowNum(60,130,calendar.w_year,4,16);                                                                          
  104.                         LCD_ShowNum(100,130,calendar.w_month,2,16);                                                                          
  105.                         LCD_ShowNum(124,130,calendar.w_date,2,16);         
  106.                         switch(calendar.week)
  107.                         {
  108.                                 case 0:
  109.                                         LCD_ShowString(60,148,200,16,16,"Sunday   ");
  110.                                         break;
  111.                                 case 1:
  112.                                         LCD_ShowString(60,148,200,16,16,"Monday   ");
  113.                                         break;
  114.                                 case 2:
  115.                                         LCD_ShowString(60,148,200,16,16,"Tuesday  ");
  116.                                         break;
  117.                                 case 3:
  118.                                         LCD_ShowString(60,148,200,16,16,"Wednesday");
  119.                                         break;
  120.                                 case 4:
  121.                                         LCD_ShowString(60,148,200,16,16,"Thursday ");
  122.                                         break;
  123.                                 case 5:
  124.                                         LCD_ShowString(60,148,200,16,16,"Friday   ");
  125.                                         break;
  126.                                 case 6:
  127.                                         LCD_ShowString(60,148,200,16,16,"Saturday ");
  128.                                         break;  
  129.                         }
  130.                 }
  131.                
  132.                 //秒表显示
  133.                 if (c==3)
  134.                 {
  135.                         LCD_ShowNum(60,162,min,2,16);                                                                          
  136.                         LCD_ShowNum(84,162,sec,2,16);                                                                          
  137.                         LCD_ShowNum(108,162,msec,2,16);
  138.                 }               
  139.                
  140.                
  141.                 //倒计时显示
  142.                 if (c==4)
  143.                 {
  144.                         LCD_ShowNum(60,162,daoshi,2,16);                                                                          
  145.                         LCD_ShowNum(84,162,daofen,2,16);                                                                          
  146.                         LCD_ShowNum(108,162,daomiao,2,16);
  147.                         daoshi=dao/3600;
  148.                         daofen=dao/60%60;
  149.                         daomiao=dao%60;
  150.                         if (now>0)
  151.                         {
  152.                                 dao2=(temp-now);
  153.                                 dao=dao1-dao2;
  154.                                 if (dao==0)
  155.                                 {
  156.                                         c=0;
  157.                                         LED0=!LED0;
  158.                                         LED1=!LED1;
  159.                                 }
  160.                         }
  161.                 }               
  162.                 if (c!=3&&c!=4)
  163.                 {
  164.                         LCD_ShowNum(60,162,calendar.hour,2,16);                                                                          
  165.                         LCD_ShowNum(84,162,calendar.min,2,16);                                                                          
  166.                         LCD_ShowNum(108,162,calendar.sec,2,16);
  167.                         if (calendar.min==0&&calendar.sec==0)
  168.                         {
  169.                                 LED0=!LED0;
  170.                                 LED1=!LED1;
  171.                         }
  172.                 }
  173.                 delay_ms(10);       

  174.                        
  175.                        
  176.                        
  177.                 tp_dev.scan(0);
  178.                 if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  179.                 {       
  180.                         if((115>tp_dev.x[0]&&tp_dev.x[0]>55)&&(242>tp_dev.y[0]&&tp_dev.y[0]>216))
  181.                         {
  182.                                 k=1+k;
  183.                                 LED0=!LED0;
  184.                                
  185.                                 if (k==5)
  186.                                 {
  187.                                         k=0;
  188.                                 }
  189.                                 switch(k )
  190.                                 {  
  191.                                         case 0:
  192.                                                 LCD_ShowString(60,188,260,16,16,"time      ");
  193.                                                 jia = 0;
  194.                                                 jian = 0;
  195.                                                 c=0;
  196.                                                 break;
  197.                                         case 1:
  198.                                                 LCD_ShowString(60,188,260,16,16,"min       ");
  199.                                                 jia = 60;
  200.                                                 jian = 60;
  201.                                                 break;
  202.                                         case 2:
  203.                                                 LCD_ShowString(60,188,260,16,16,"hour      ");
  204.                                                 jia = 3600;
  205.                                                 jian = 3600;
  206.                                                 break;
  207.                                         case 3:
  208.                                                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE); //时钟失能
  209.                                                 LCD_ShowString(60,188,260,16,16,"count     ");
  210.                                                 jishu=0;
  211.                                                 min=0;
  212.                                                 sec=0;
  213.                                                 msec=0;
  214.                                                 jia = 0;
  215.                                                 jian = 0;
  216.                                                 c=3;
  217.                                                 break;
  218.                                         case 4:
  219.                                                 LCD_ShowString(60,188,260,16,16,"count down");       
  220.                                                 dao=0;
  221.                                                 daoshi=0;
  222.                                                 daofen=0;
  223.                                                 daomiao=0;
  224.                                                 c=4;
  225.                                                 break;
  226.                                         }
  227.                                 }
  228.                
  229.                
  230.                         if(c==3&&(105>tp_dev.x[0]&&tp_dev.x[0]>55)&&(286>tp_dev.y[0]&&tp_dev.y[0]>260))
  231.                         {
  232.                                 flag+=1;
  233.                                 LED0=!LED0;
  234.                                  
  235.                         }
  236.                         if (flag>1)
  237.                         {
  238.                                 flag=0;
  239.                         }
  240.                         if (flag==1)
  241.                         {
  242.                        
  243.                                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE); //时钟失能
  244.                         }
  245.                         if (flag==0)
  246.                         {
  247.                                
  248.                                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  249.                         }       
  250.                
  251.                         if (c==4&&(105>tp_dev.x[0]&&tp_dev.x[0]>55)&&(286>tp_dev.y[0]&&tp_dev.y[0]>260)&&(dao!=0))
  252.                         {
  253.                                 LED0=!LED0;
  254.                                 now=temp2;
  255.                         }
  256.                         if(c!=3&&c!=4&&(105>tp_dev.x[0]&&tp_dev.x[0]>55)&&(286>tp_dev.y[0]&&tp_dev.y[0]>260))
  257.                         {
  258.                                 LED0=!LED0;
  259.                                 tiao+=jia;
  260.                         }               
  261.                         if(c==3&&(195>tp_dev.x[0]&&tp_dev.x[0]>150)&&(286>tp_dev.y[0]&&tp_dev.y[0]>260))
  262.                         {
  263.                                 LED0=!LED0;
  264.                                 jishu=0;
  265.                                 min=0;
  266.                                 sec=0;
  267.                                 msec=0;
  268.                                 flag=1;
  269.                                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE); //时钟失能
  270.                         }
  271.                         if (c==4&&(195>tp_dev.x[0]&&tp_dev.x[0]>150)&&(286>tp_dev.y[0]&&tp_dev.y[0]>260))
  272.                         {  
  273.                                 LED0=!LED0;
  274.                                 dao=60+dao1;
  275.                                 dao1=dao;
  276.                         }
  277.                         if (c!=3&&c!=4&&(195>tp_dev.x[0]&&tp_dev.x[0]>150)&&(286>tp_dev.y[0]&&tp_dev.y[0]>260))
  278.                         {
  279.                                 LED0=!LED0;
  280.                                 tiao-=jian;  
  281.                         }       
  282.                         delay_ms(100);                                                                   
  283.                 }                       
  284.         }
  285. }
复制代码

所有资料51hei提供下载:
RTC时钟秒表.7z (280.75 KB, 下载次数: 37)
回复

使用道具 举报

ID:669679 发表于 2020-5-15 17:56 | 显示全部楼层
这个没有电路图吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表