STM32 NUCLEO-F410RB 学习笔记(二)按键切换系统工作状态

  以前数电实验中有状态机控制系统工作状态变化的部分。虽然实验是基于FPGA,使用 Verilog 实现的,但是这可以为我使用C语言在NUCLEO单片机上实现状态机功能提供思路。其实开发语言并不重要,重要的是先做好状态机的设计,思考清楚状态数和状态转移条件。我使用两位的bool型数组status[2]记录系统状态。我设计的程序中单片机有四种工作状态,对应的二进制状态标号如下:

序号系统状态二进制状态编号
1快速呼吸灯00b
2慢速呼吸灯01b
30.5Hz LED闪烁10b
42.5Hz LED闪烁11b

  按键的下降沿触发状态转移函数(程序中的pressed)的执行,status[2]的值变化。由于主函数根据status[2]的值执行不同的程序,故系统的状态随之改变。这样实现了按下按键系统状态变化的功能。系统状态转移规律是:00->01->10->11->00.
状态转移图:

00
01
10
11

  呼吸灯闪烁快慢可以通过改变占空比语句之间的延时语句的参数(延时时间)实现。可以结合条件状态判断改变延时时间,这样实现00和01对应的呼吸灯速度不同。
  同理灯的闪烁是PWM占空比在1.0和0.0之间二值变化。通过判断状态改变延时时间可以改变灯的闪烁频率。
源代码:

#include "mbed.h"

InterruptIn my_button(USER_BUTTON);
DigitalOut  my_led(LED1);
PwmOut      my_pwm(PA_7);

bool status[2]={0,0};   //记录系统状态

void pressed(void)		//state machine
{
	bool jinwei = false;
	if(status[0]==0) status[0]=1,jinwei=false;
	else {
		status[0]=0,jinwei=true;
	}
	if(jinwei == true) {
		if(status[1]==1)
			status[1]=0;
		else status[1]=1;
	}
}

int main()
{
	my_button.fall(&pressed);   //下降沿触发状态变化
	float i = 0.5;		//dc
	bool flag = true;
	float dc = 1.0;
	int t=10;					//change freq of breathing lamp
	int delay = 200;//change freq of LED blinking
    // Set PWM
    my_pwm.period_ms(10);
    
    while (1) {
			my_led.write(PA_7);
			  if(status[1]==0) {	
				my_pwm.write(i);
			if(flag){
				i+=0.01;
				if(i>=1.0) flag=false;
			}
			else {
				i=i-0.01;
				if(i<=0) flag=true;
			}
			if(status[0]==0) t=10; else t=20;	//根据状态改变t,改变呼吸速度
			wait_ms(t);
		}
				else {
					my_pwm.write(dc);
					if(dc == 1.0) dc=0.0;
					else dc=1.0;
					if(status[0]==0) delay=1000;  //根据状态改变delay,改变灯的闪烁频率
					else delay=200;
					wait_ms(delay);
				}
			}

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值