基于stm32的多功能厨房定时器

本文介绍了基于STM32的嵌入式系统设计,实现了倒计时功能,可通过按键设置和显示,并配备闹铃和温度监测,还支持UART通信实时数据输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.具体功能

1) 格式:倒计时显示格式“分:秒”,初始状态显示 00:00,表示 0 分 0 秒

2) 按键:使用 3 个按键设置倒计时时间。K1 键为启动/清零(任何时候按 一次启动倒计时,再按一次清零并回到初始状态);K2、K3 键调加/减, 可只调整分钟字段,调整范围 01-60(分钟),“秒”字段可不调整,开始 倒计时时,每秒“秒”字段减 1

3) 闹铃:倒计时到 00:00,蜂鸣器发出提醒音(持续 10 秒),在此之前如果 按 K1 键,立即停止蜂鸣

4) 重复:按 K1 清零或倒计时结束后,可再次用 K2、K3 设置新的倒计时时 间,进入下一轮工作状态

5) 显示:“分:秒”可显示在 4 位数码管上,也可显示在液晶屏上

6) 测温:实时测量环境温度并显示(摄氏度),温度超限(可程序中预先设 置某固定温度值)进行声光报警,蜂鸣器的音调或 LED 灯的亮度(数量) 随着温度变化而变化

7) UART 接口:支持每秒 UART 打印输出实时温度(摄氏度)和倒计时时间 (分:秒)信息

二.代码实现

//========================================
//
//冬令营综合设计
//              ------Derek 
// 
// 
// 
//========================================
#include "stm32f10x.h"
#include "delay.h"
#include "QDTFT_demo.h"
#include "Lcd_Driver.h"
#include "GUI.h"
#include <stm32f10x_gpio.h>
#include "TM1637.h"
#include "LED.h"
#include "timer.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_adc.h"
#include "misc.h"
#include "key.h"
#include "adc.h"
#include "sys.h"
#include "pwm.h"
//#include "Key_Matrix_Scan.h"
//#include "Key_Single_Scan.h"  

void Init(void)
{
	KEY_Init();//按键初始化 
	GPIO_Config();//数码管初始化 
    SystemInit();	//System init.
    delay_init(72);//Delay init.
    Lcd_Init();//液晶显示屏初始化 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	TIM3_Int_Init(9999,7199); //定时中断初始化  
	uart_init(9600);//串口通信初始化  
	Adc_Init();//adc初始化  
	LED_Init();//led初始化 
	TIM1_PWM_Init(899,0);//pwm初始化 
	//GPIO_SetBits(GPIOA,GPIO_Pin_8);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
float temp;
char a[20],c[20];
u16 adcx,f,m,f1,m1,n=60000,s=0,j=0,pwm=0;
u8 k=0,t=0,b=0,d=1;
int main()
{
	f1=100;
	m1=1;
	Init();
	LCD_LED_SET;
	Lcd_Clear(GRAY0);
	Gui_DrawFont_GBK24(15,5,RED,GRAY0,"分");
	Gui_DrawFont_GBK24(85,5,RED,GRAY0,"秒");
	Gui_DrawFont_GBK24(5,70,BLUE,GRAY0,"温度:");
	DisplayButtonDown(58,30,68,60);
	Gui_Circle(64,40,2,RED);
	Gui_Circle(64,50,2,RED);
	while(1)
	{
		adcx=Get_Adc_Average(ADC_Channel_10,10);
		temp=(float)adcx*(5/40.96);
		if(m==10)j=1;
		if(m1==0)
		{
			m1=60;
			f1--;
		}
		KEY_Scan2();         //启动清零按键 
		t=KEY_Scan(1);		//分钟加减键 
		switch(t)
		{				 
			case KEY0_PRES:if(f1!=100)f1--;break;
			case KEY1_PRES:f1++;break;
		} 
		if(n==656)         //蜂鸣器10s计时器(因为没有设置好外部中断) 
		{
			s=0;
			b=0;
		}
		f=f1-100;
		m=m1-1;
		if(f==0&&m==0&&s==0&&j==1)  //倒计时结束,蜂鸣器响起 
		{
			b=1;
			k=0;
			n=666;
			s=1;
			j=0;
		}
		if(f!=0||m!=0) b=0;
		Gui_DrawFont_Num32(0,30,RED,GRAY0,f/10);         //lcd显示 
		Gui_DrawFont_Num32(25,30,RED,GRAY0,f%10);
		Gui_DrawFont_Num32(70,30,RED,GRAY0,m/10);
		Gui_DrawFont_Num32(95,30,RED,GRAY0,m%10);
		Gui_DrawFont_Num32(60,70,BLUE,GRAY0,(u16)temp/10);
		Gui_DrawFont_Num32(90,70,BLUE,GRAY0,(u16)temp%10);
		TM1637_display(f/10,f%10,m/10,m%10,d);                    //数码管显示 
		if(b)GPIO_SetBits(GPIOD,GPIO_Pin_2);                      //蜂鸣器 
		else GPIO_ResetBits(GPIOD,GPIO_Pin_2);
		
		sprintf(a,"实时温度:%.2f'C",temp);                      //串口打印 
		sprintf(c,"还有%d分:%d秒",f,m);
		if((u16)temp>20)LED1=!LED1;                            //温度报警 
		pwm=((u16)temp-15)*20;                                    
		if(pwm>=0&&pwm<600)TIM_SetCompare1(TIM1,pwm);
		else TIM_SetCompare1(TIM1,0);                           //温度控制pwm控制LED1亮度 
	}	
  	
}

void TIM3_IRQHandler(void)                                      //定时中断 每秒秒数减一 打印串口通信内容 蜂鸣器10s计时器 
{
    //检查指定的TIM中断发生与否: TIM 中断源 
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 
    {
        //清除TIMx的中断待处理位: TIM 中断源 
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
        if(k)m1--;
			n--;
			switch(d)
			{
				case 0: d=1;break;
				case 1: d=0;break;
			}
			printf(a);
			printf(c);
    }
}

void KEY_Scan2(void)                                      //启动清零按键 
{
   u8 qwe=1;	
	if(WK_UP==1)
	{
		delay_ms(10);//去抖动 
		if(WK_UP==1)
		{
			if(k==1&&(m1!=1||f1!=100))
			{
				f1=100;
				m1=1;
				k=0;
				j=0;
				qwe=0;
			}
			if(b==0)
			switch(k)
			{
				case 1:k=0;break;
				case 0:if(m1==1&&qwe)k=1;break;
			}
			if(b==1)b=0;
			if(f==0&&m==0)k=0;
		}
	}
}

三.作品展示


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值