找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 83|回复: 0
打印 上一主题 下一主题
收起左侧

py32f030k28单片机开发板交替显示RTC_NTC

[复制链接]
跳转到指定楼层
楼主
ID:14088 发表于 2024-10-10 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此Demo用于演示每隔10秒钟交替显示RTC时钟和NTC温度数值。
/**
******************************************************************************
* 文件名程: main.c
* 作    者: 东莞邓凯哥
* 功    能: 主函数
* 硬    件: PY32F030K28-StartKit-V0.1
* 说明:数码管交替显示RTC时钟和NTC温度 DEMO
* 软件版本 V0.0.1(2024/4/16 16:02
******************************************************************************
**/
#include "main.h"
#include "rtc.h"
#include "rcc.h"
#include "led.h"
#include "usart.h"
#include "timepare.h"
#include "adc.h"
/* Private variables ---------------------------------------------------------*/

#define LED_DISP_c              0x61        //温度符号小c

const uint8_t dispArr[] = {LL_LED_DISP_0, LL_LED_DISP_1, LL_LED_DISP_2, LL_LED_DISP_3, LL_LED_DISP_4, \
                           LL_LED_DISP_5, LL_LED_DISP_6, LL_LED_DISP_7, LL_LED_DISP_8, LL_LED_DISP_9
                          };


static uint8_t dotdis = 0 ;
static uint8_t dis_switch,dis_count ;
/******************************************************************************
**函数信息 :System_Tick(uint32_t Ticks)           
**功能描述 :系统嘀嗒时钟配置
**输入参数 :Ticks 频率
**输出参数 :无
**说    明 :
******************************************************************************/                                                  
void System_Tick(uint32_t Ticks)
{
  SysTick->LOAD  = (uint32_t)((SystemCoreClock / Ticks) - 1UL);          /* set reload register */
  SysTick->VAL   = 0UL;                                                       /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                                   /* Enable the Systick Timer */
}

/******************************************************************************
**函数信息 :main()           
**功能描述 :主函数
**输入参数 :无
**输出参数 :无
**说    明 :
******************************************************************************/               
int main(void)
{
        /* 配置系统时钟 */
        APP_RCC_Config();
        
        /* ADC初始化 */
        APP_ADC_Init();
        
        /* 配置USART1相关参数 */
        APP_USART1_Config();
        
        /* 配置LED相关参数 */
        APP_LED_Config();

        /* 配置RTC相关参数 */
        APP_RTC_Config();
        
        /* 设置RTC时间 */
        SET_RTC_Time(8,14,23);
        
        /* 开启系统嘀嗒定时器 */
        System_Tick(1000);
        while (1)
        {
        
                if( TimePare.Tim1ms_flag == 1 )                //1ms任务
                {
                        TimePare.Tim1ms_flag = 0;
                        if( ++TimePare.Tim10ms_count >= 10 )
                        {
                                TimePare.Tim10ms_count = 0;
                                TimePare.Tim10ms_flag = 1;
                        }
                        
                        if( ++TimePare.Tim50ms_count >= 50 )
                        {
                                TimePare.Tim50ms_count = 0;
                                TimePare.Tim50ms_flag = 1;
                        }
                }
               
               
               
                if( TimePare.Tim10ms_flag == 1 )        //10ms 任务
                {               
                        
                        TimePare.Tim10ms_flag = 0;
                        if( ++TimePare.Tim100ms_count >= 10 )
                        {
                                TimePare.Tim100ms_count = 0;
                                TimePare.Tim100ms_flag = 1;
                        }
                        
                        if( ++TimePare.Tim200ms_count >= 20 )
                        {
                                TimePare.Tim200ms_count = 0;
                                TimePare.Tim200ms_flag = 1;
                        }
                }
               
               
                if( TimePare.Tim50ms_flag == 1 )        //50ms 任务
                {
                        
                        TimePare.Tim50ms_flag = 0;
                }
               
                if( TimePare.Tim100ms_flag == 1 )        //100ms 任务
                {
                        
                        TimePare.Tim100ms_flag = 0;
                        if( ++TimePare.Tim500ms_count >= 5 )
                        {
                                TimePare.Tim500ms_count = 0;
                                TimePare.Tim500ms_flag = 1;
                        }
                }
               
                if( TimePare.Tim200ms_flag == 1 )        //200ms 任务
                {
                        TimePare.Tim200ms_flag = 0;
                }
               
                if( TimePare.Tim500ms_flag == 1 )        //500ms 任务
                {
                        switch ( dis_switch )
                        {
                                case 0:
                                        dotdis ++;
                                        APP_UpadateRtcTimeStruct();
                                        //显示RTC时钟
                                        LL_LED_SetDisplayValue(LED, LL_LED_COM0, dispArr[ RTC_TimeStruct.hour /10]);
                //                        if( dotdis / 2 )                //常规的方法,用除法
                                        if( dotdis >> 1 )                //更高效的方法,用移位
                                        {
                                                dotdis = 0;
                                                LL_LED_SetDisplayValue(LED, LL_LED_COM1, dispArr[ RTC_TimeStruct.hour %10] | LL_LED_DISP_DOT );                //时钟点闪烁
                                        }else{
                                                LL_LED_SetDisplayValue(LED, LL_LED_COM1, dispArr[ RTC_TimeStruct.hour %10]  );
                                        }
                                        LL_LED_SetDisplayValue(LED, LL_LED_COM2, dispArr[ RTC_TimeStruct.min /10]);
                                        LL_LED_SetDisplayValue(LED, LL_LED_COM3, dispArr[ RTC_TimeStruct.min %10]);
                                       
                                        printf("Hours = %02d,   Min = %02d,   Sec = %02d\r\n",\
                                                RTC_TimeStruct.hour, RTC_TimeStruct.min, RTC_TimeStruct.sec);          //串口打印 时,分,秒
                                        break;
                                case 1:
                                        ///显示NTC温度
                                        LL_LED_SetDisplayValue(LED, LL_LED_COM0, LL_LED_DISP_NONE);                //第1位不显示
                                        LL_LED_SetDisplayValue(LED, LL_LED_COM1, dispArr[(tempval) %100/10]);
                                        LL_LED_SetDisplayValue(LED, LL_LED_COM2, dispArr[(tempval) %100%10]);
                                        LL_LED_SetDisplayValue(LED, LL_LED_COM3, LED_DISP_c);
                                       
                                        printf("ADC_VALUE = %d,   NTC_VALUE = %d\r\n",mean_value, tempval);          //串口打印ADC数值和NTC温度值
                                        break;
                                default :
                                        break;
                        }
                        TimePare.Tim500ms_flag = 0;
                        if( ++TimePare.Tim1s_count >= 2 )
                        {
                                TimePare.Tim1s_count = 0;
                                TimePare.Tim1s_flag = 1;
                        }
                }
               
                if( TimePare.Tim1s_flag == 1 )                //1000ms 任务
                {
                        dis_count ++;
                        if( dis_count >= 10)
                        {
                                dis_count = 0;
                                dis_switch ++;
                                if( dis_switch == 2 )
                                {
                                        dis_switch = 0;
                                }
                        }
               
                        TimePare.Tim1s_flag = 0;
                }

        }
}





/**
  * @brief  错误执行函数
  * @param  无
  * @retval 无
  */
void APP_ErrorHandler(void)
{
  /* 无限循环 */
  while (1)
  {
  }
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  输出产生断言错误的源文件名及行号
  * @param  file:源文件名指针
  * @param  line:发生断言错误的行号
  * @retval 无
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* 用户可以根据需要添加自己的打印信息,
     例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* 无限循环 */
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */


视频链接:
https://www.bilibili.com/video/B ... c4d0fe4a9622a76421b

程序.7z

1.87 MB, 下载次数: 2, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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