这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 怎么用stm32和状态机做一个简单的秒表?

共4条 1/1 1 跳转至

怎么用stm32和状态机做一个简单的秒表?

工程师
2020-08-31 21:54:18     打赏

怎么用状态机做一个简单的秒表(实现按键按下启动在按下就暂停,还有长按清零),芯片是stm32, 我的主要程序和思路如下:




关键词: stm32     状态机     秒表    

工程师
2020-08-31 22:02:18     打赏
2楼

用定时器来计时呗!


工程师
2020-08-31 22:07:41     打赏
3楼

可以参考一下我的:



#include <reg51.h>

#define uint unsigned int

#define uchar unsigned char

//端口定义

sbit key=P2^7;                                                //按键

//全局变量定义

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0~f段码

                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar data dis_buf[6];                        //显示缓存

uchar Cnt250us=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//计时变量

bit  stop=0;                                                //停止标志


/***********按键扫描程序****************/

void keyscan()        

{

        static uint count1=0;                //计数变量                        

        static bit key_sign=0;                //按键自锁标志

        if(!key)                                                        //检测按键为0

        {

                count1++;                                        //计数延时消抖

                if(count1>40 && key_sign==0)//消抖                

                        key_sign=1;                                //按键自锁标志置1,防止重复响应

                if(count1==2000)                        //长按0.5秒

                {

                        count1=2001;

                        Cnt250us=0;

                        Cnt10ms=0;

                        Cnt1s=0;

                        Cnt1min=0;

                        stop=0;

                }                

        }

        else 

        {

                if(count1<2000&&key_sign==1)//短按

                {

                        stop=~stop;

                }

                count1=0;                                        //计数变量清0

                key_sign=0;                                        //按键自锁标志清0

        }

}

/***********定时器初始化程序****************/

void Timer0Init()                //250微秒@12.000MHz

{

        TMOD |= 0x02;                //设置定时器模式

        TL0 = 0x06;                        //设置定时初值

        TH0 = 0x06;                        //设置定时重载值

        TF0 = 0;                                //清除TF0标志

        TR0 = 1;                                //定时器0开始计时

}

/***********共阴数码管显示程序****************/

void display()

{

        static uchar i=0;        //计数变量

        P0=0x00;//消隐

        P2&=0xc0;//清低6位

        P2|=~(0x01<<i);//送位码

        P0=dis_buf[i];//送段码

        i++;

        i%=6;

}

/***************主程序****************/

void main()

{

        Timer0Init();                                        //定时器初始化

        while(1)

        {

                if(TF0)

                {

                        TF0=0;                                        //清除TF0标志

                        Cnt250us++;                                //中断变量Cntus自+1

                        if(Cnt250us>=40)                //10ms

                        {

                                Cnt250us=0;                        //清0

                                if(stop==1)                        //启动

                                        Cnt10ms++;                //10毫秒计数

                                if(Cnt10ms>=100)

                                {

                                        Cnt10ms=0;

                                        Cnt1s++;                        //秒计数

                                }

                                if(Cnt1s>=60)

                                {

                                        Cnt1s=0;

                                        Cnt1min++;                //分计数

                                        if(Cnt1min>=100)

                                                Cnt1min=0;

                                }

                        }

                        keyscan();                                //按键扫描


                        //数据分解放入显示缓存

                        dis_buf[0]=table[Cnt1min/10];

                        dis_buf[1]=table[Cnt1min%10]|0x80;//加点

                        dis_buf[2]=table[Cnt1s/10];

                        dis_buf[3]=table[Cnt1s%10]|0x80;//加点

                        dis_buf[4]=table[Cnt10ms/10];

                        dis_buf[5]=table[Cnt10ms%10];


                        display();                                //显示程序

                }

        }

}



工程师
2020-08-31 22:10:34     打赏
4楼
秒表实际使用时,按下开始键应该立即启动计时,这样才能保证计时的准确(按下时最好不消抖,抬起时消抖),所以这个按键不可以响应长按的动作。设置两个控制按键比较合适:一个开始/停止,一个归零。



共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]