给单片机开发的萌新送个礼

在这里插入图片描述
很多新人都在群里问,如何才能让一个CPU同时处理很多问题?
现在的单片机学习环境好多了,打开教程或者开发平台,无数的例程等你选用,试来试去学会了各种部件的控制方法,那么是不是可以做产品了呢?结果一遇到实际问题都蒙了。好吧,看好了下面的例子,让你从萌新立马进阶!
看如下例子:
让一个LED亮一秒灭一秒!

loop(){
	digitalWrite(13,HIGH);
	delay(1000);
	digitalWrite(13,LOW);
	delay(1000);
}

这样似乎就可以了?
但是这样在程序里使用delay在实践中是不被允许的!!!在各种例程里,充满了delay函数用来延时,但是在实际应用,不允许任何地方出现delay函数!不允许!
为什么?请看如下问题:让LED1亮一秒停一秒,LED2亮0.3秒灭0.6秒,让LED3亮0.5秒灭0.8秒!三个LED各不干涉!怎么实现?难不成用三个单片机来实现?更别说让三个舵机分别做不同的动作了。
其实,只要把各个任务做成分时的就可以了。看如下解决方案:

loop(){
	if(millis() % 2000<1000){
		digitalWrite(13,HIGH);
	}else digitalWrite(13,LOW);
	//在此处让CPU做任何事情。
}

再例如解决上面问题:

loop(){
	if(millis() % 900<300){
		digitalWrite(LED1,HIGH);	//点亮或熄灭LED1
	}else digitalWrite(LED1,LOW);
	if(millis() %1300<500){		//点亮或熄灭LED2
		digitalWrite(LED2,HIGH);
	}else digitalWrite(LED2,LOW);
	........
}

再举例:每秒钟执行一次子程序prstr():
注意这个方法,程序中用得特别多。

unsigned long time0=0;
loop(){
	if(time0!=millis()/1000){		//每秒钟进入下面程序一次
		time0=millis()/1000;
		prstr();		//此处执行一次
	}
	//此处处理其他的进程
}

上面程序看懂了,你就可以处理其他任何事情了。
你可以试试用这种方法重写所有你学过的例程,你就可以把很多例程写在同一个程序里,同时采集同时控制。

高级一点,根据事情的状态来决定程序的走向。
例如写一个呼叫、发送、接收、挂断的过程

byte key=0;
void loop(){
	if(key==0){
		//发出呼叫指令
		key=1;
	}
	if(key==1){
		if(){		//如果得到应答,并且在指定时间内
			发送数据
			key=2;
		}
		if();如果超时的处理
	}
	if(key==2){
		等待接收并检查超时
		如果收到则key=3
		做好超时处理
	}
	if(key==3){
		数据已经接收,挂断通讯,处理数据
		key=0
	}
}

这就是一个处理通信全过程的例子,很多过程处理都是同样的原理,总之一句话,不能随意无效占用CPU,不能使用delay(),你做任何事情,都不能影响CPU去做其他的事情。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值