这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 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

#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<

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 跳转至

回复

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