一.具体功能
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;
}
}
}
三.作品展示