很多新人都在群里问,如何才能让一个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去做其他的事情。