<DAY3>时钟和倒数计数器设计
实验要求:
1. 利用定时器TIM2定时1s,实现数字时钟功能,初始时间为23:59:50,并在LCD液晶上实时显示时钟信息;
2. 利用定时器TIM3定时5s,实现倒计数器功能,初始值为99,每隔5s自动减1,当减到0时,恢复为初值。并在液晶上实时显示计数值。
(本实验所用开发板为STM32F10X系列普中的PZ6806L,采用库函数编程方法)
//主函数代码
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "tftlcd.h"
#include "picture.h"
#include "time.h"
u8 hour=23;
u8 min=59;
u8 sec=50;
u8 num=99;
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int main()
{
u8 i=0;
u16 color=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
USART1_Init(9600);
TFTLCD_Init(); //LCD初始化
//TIM2_Init(1000,36000-1); //定时500ms
TIM2_Init(2000,36000-1); //定时1s
TIM3_Init(10000,36000-1); //定时5s
while(1)
{
LCD_ShowNum(0,0,hour,2,24);
LCD_ShowString(30,0,tftlcd_data.width,tftlcd_data.height,24,(u8*)":");
LCD_ShowNum(40,0,min,2,24);
LCD_ShowString(70,0,tftlcd_data.width,tftlcd_data.height,24,(u8*)":");
LCD_ShowNum(80,0,sec,2,24);
LCD_ShowNum(0,30,num,2,24);
}
}
//time.c代码
#include "time.h"
#include "led.h"
extern u8 hour,min,sec,num;
/*******************************************************************************
* 函 数 名 : TIM4_Init
* 函数功能 : TIM4初始化函数
* 输 入 : per:重装载值
psc:分频系数
* 输 出 : 无
*******************************************************************************/
void TIM2_Init(u16 per,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM4时钟
TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //开启定时器中断
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,ENABLE); //使能定时器
}
void TIM3_Init(u16 per1,u16 psc1)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM4时钟
TIM_TimeBaseInitStructure.TIM_Period=per1; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc1; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //开启定时器中断
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//定时器中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,ENABLE); //使能定时器
}
/*******************************************************************************
* 函 数 名 : TIM4_IRQHandler
* 函数功能 : TIM4中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
sec++;
if(sec==60)
{
sec=1;min++;
}
if(min==60)
{
min=0;hour++;
}
if(hour==24)
{
hour=0;
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update))
{
num--;
if(num==255)num=99;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
//time.h代码
#ifndef _time_H
#define _time_H
#include "system.h"
void TIM2_Init(u16 per,u16 psc);
void TIM3_Init(u16 per1,u16 psc1);
#endif
有什么问题欢迎在评论区留言或者私信我,大家共同学习,一起进步!