站内搜索
发作品签到
专业版

泡面计时器

工程标签

2.1k
0
0
2

简介

基于STC8系列单片机制作的泡面计时器

简介:基于STC8系列单片机制作的泡面计时器
STC单片机创意设计大赛

开源协议

GPL 3.0

创建时间:2024-07-07 01:34:27更新时间:2024-07-15 10:16:17

描述

实际上就是一个计时器加上泡面盖,所以叫做泡面计时器(自我吐槽)

设备功能

设备能够提供倒计时功能,当到达时间后蜂鸣器发声提醒,设备具有锂电池,具有便携性。

设备实物图

硬件设计

设备具有一块120毫安时的锂电池,通过TypeC口可以进行充电,请注意CC1 CC2引脚需要外部下拉,设备使用TP4054芯片为锂电池提供充放保护功能。

 

设备使用四位数码管+TM1637驱动芯片作为显示模块。

设备具有三个按键,分别实现了“数值加/减”和 “开始/停止计时”功能,按键位于数码管右侧,竖向排列。

设备具有两个状态指示灯,第一个是外部电源输入指示灯,当TypeC口有外部电源输入时该灯亮,能够表示电池正在充电。

另一个是VOUT输出指示灯,VOUT由外部开关控制,当开关闭合时,设备开始工作,否则设备不启动,启动时VOUT状态灯亮。

 

接口说明:设备PCB共有三组接口,位于数码管上方横向排列,下图是PCB正反示意图。

最左侧的是电池接口,将锂电池接入该接口,为设备提供电源。

紧挨着的是外部开关接口,开关连接该接口,实现供电开/关。

最右侧是烧录接口,用于芯片烧录,本设备使用的芯片是STC8G1K08A,请使用适配的串口烧录器进行烧录。

程序设计

使用stc-isp + keil5 + vscode进行开发,附件中提供hex文件。

tm1637.c / tm1637.h 为设备提供数码管显示控制功能。

main.c 是主要程序文件。

ST8HGH 是头文件。

 

#include "STC8G.H"
#include "INTRINS.H"
#include "tm1637.h"

/**
 * 引脚定义
 */
sbit Buzz_IO = P5^4; // 蜂鸣器

/**
 * 变量定义
 */
unsigned char mode_flag = 0; // 默认为参数设置模式
unsigned char data_min = 3; // 定时值
unsigned int back_time_s = 0; // 倒计时值
unsigned char isok = 0; // 倒计时结束标志位

/******************系统初始化**************** */
void System_Init(){
    P5M0 |= 0x10; P5M1 &= ~0x10; // Buzz_IO 设置为推挽输出
    Buzz_IO = 0;
    P3M0 &= ~0x0c; P3M1 &= ~0x0c;
    P3M0 &= ~0x03; P3M1 &= ~0x03;
    P5M0 &= ~0x20; P5M1 &= ~0x20;
}
/******************系统初始化**************** */

/******************按键监测**************** */
#define Button1 0
#define Button2 1
#define Button3 2
void ButtonClick(unsigned char button){
    switch (button)
    {
    case Button1: // 增加
        if (mode_flag == 0)
        {
            data_min += 1;
            if(data_min > 99){
                data_min = 99;
            }
        }
        break;
    case Button2:
        if (mode_flag == 0)
        {
            mode_flag = 1; // 进入倒计时模式
            back_time_s = data_min * 60;
        }else{
            mode_flag = 0; // 参数模式
            back_time_s = 0;
        }
        break;
    case Button3: // 减少
        if (mode_flag == 0)
        {
            data_min -= 1;
            if(data_min < 1){
                data_min = 1;
            }
        }
        break;
    default:
        break;
    }
}
void keyCheckLoop(){
    P55 = P30 = P31 = 1; //拉高按键
    if(P55 == 0){
        ButtonClick(Button3);
        while(P55 == 0);
    }
    if(P30 == 0){
        ButtonClick(Button1);
        while(P30 == 0);
    }
    if(P31 == 0){
        ButtonClick(Button2);
        while(P31 == 0);
    }
}
/******************按键监测**************** */

/******************倒计时模块**************** */
void Delay300ms(void)   //@11.0592MHz
{
    unsigned char data i, j, k;

    _nop_();
    _nop_();
    i = 13;
    j = 156;
    k = 83;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}
void stopCheck(){
    unsigned char number = 0;
    if (isok == 1) // 计时结束
    {
        for (number = 0; number < 3; number++)
        {
            Buzz_IO = 1;
            Delay300ms();
            Delay300ms();
            Buzz_IO = 0;
            Delay300ms();
            Delay300ms();
            Buzz_IO = 1;
            Delay300ms();
            Delay300ms();
            Buzz_IO = 0;
            Delay300ms();
            Delay300ms();
            Buzz_IO = 1;
            Delay300ms();
            Buzz_IO = 0;
            Delay300ms();
            Delay300ms();
            Delay300ms();
            Delay300ms();
        }
        mode_flag = 0;
        isok = 0;
    }  
}
int timer1_number = 0;
void Timer0_Isr(void) interrupt 1
{
    timer1_number++;
    if (timer1_number >= 20) // 每秒触发一次
    {
        timer1_number = 0;
        if (mode_flag == 1)
        {
            back_time_s -= 1;
            if(back_time_s == 0){
                isok = 1;
            }
        }
    }
}
void Timer0_Init(void)      //50毫秒@12.000MHz
{
    AUXR &= 0x7F;           //定时器时钟12T模式
    TMOD &= 0xF0;           //设置定时器模式
    TL0 = 0xB0;             //设置定时初始值
    TH0 = 0x3C;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
    EA = 1;                 //使能总中断
}
/******************倒计时模块**************** */

/******************数码管显示**************** */
void SHUMA_DISPLAY(){ // 调用该方法更新显示界面
    switch (mode_flag)
    {
    case 0: //参数设置界面
        if (data_min < 10)
        {
            TM1637_Display(19,21,21,data_min);
        }else{
            TM1637_Display(19,21,data_min/10,data_min%10);
        }
        break;
    case 1: //倒计时运行界面
        TM1637_DisplayInt(back_time_s);
        break;
    default:
        break;
    }
}
/******************数码管显示**************** */
void main(){
    System_Init();
    Timer0_Init();
    while(1){
        SHUMA_DISPLAY(); //界面显示
        keyCheckLoop(); // 按键检测
        stopCheck(); //结束监测
    }
}

如何烧录

你需要具有一些STC基础,烧录不是问题。

CH_TX / CH_RX 代表串口烧录器的 TX / RX 引脚。

 

3D外壳注意事项

外壳在打印时请扩到101%或者102%。

 

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
工程-基于STC8的泡面计时器.zip
103
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航