单片机C编程中的return?

237 2024-10-31 23:10

一、单片机C编程中的return?

一个函数可以定义为无返回值的,例如void ds1820_reset(void);在函数之前加入void,那么就不会有return,但是有的时候函数是需要计算出一个结果的,在调用这个函数后要用到这个结果去进行下一步的计算,当然你也可以把函数定义为void形式,加入一个全局变量来存储这个结果,但这样很浪费你的RAM空间,一般常用的方法就是带有返回值的函数,例如你调用了一个函数进行一系列计算,根据计算结果的不同需要不同的操作,那么这时你定义一个unsigned char ds1820_reset(void)的函数,根据计算结果的不同可以这样来写:

if(ds1820_reset()==1){...

}else if(ds1820_reset()==0){...

}在上述语句中ds1820_reset()函数其实最终的结果就是return返回的数值,如果return返回的是0x00,那么ds1820_reset()调用后就等于0x00所谓return返回的就是你要得到的结果,只是一个数值而已。

这个数值是你调用了这个函数后所关心的一个变量结果,而这个结果则是影响你程序继续执行的关键变量

二、单片机的编程?

单片机c语言编程是基于C语言的单片机编程。单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。

三、单片机编程中rc代表什么?

一、 英文remote control的缩写,意味远程控制,即遥控,也指遥控模型。

二、 英文resistance and capacitance circuit的缩写 是指电阻电容串并联组成的电路,像微分电路、积分电路的一种,RC电路可改变信号的相位;在RC电路中,て=RC是电路的时间常数,它由电路的本身参数R和C决定的,反映电路本身固有的性质。

四、在单片机编程中,这个是干嘛的/*********************************************************/?

/* 这个代表注释的开始,后面的任何字符都作为注释,直到遇到 */ 结束

五、单片机编程软件有什么?

比较有名的keil,一般你买的单片机都会有配套的开发环境,这个不用担心,

编程语言c居多,不过你要是想用汇编,也是可以的,汇编可以熟悉学习下底层原理,实际的开发一般还是用c的

六、单片机编程人工智能?

摘要:不知道大家有没有这样一种感觉,就是感觉自己玩单片机还可以,各个功能模块也都会驱动,但是如果让你完整的写一套代码,却无逻辑与框架可言,上来就是开始写!东抄抄写抄抄。说明编程还处于比较低的水平,那么如何才能提高自己的编程水平呢?学会一种好的编程框架或者一种编程思想,可能会受用终生!比如模块化编程,框架式编程,状态机编程等等,都是一种好的框架。

今天说的就是状态机编程,由于篇幅较长,大家慢慢欣赏。那么状态机是一个这样的东东?状态机(state machine)有5个要素,分别是状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。

什么是状态机?

状态机是一个这样的东东:状态机(state machine)有 5 个要素,分别是状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。

状态:一个系统在某一时刻所存在的稳定的工作情况,系统在整个工作周期中可能有多个状态。例如一部电动机共有正转、反转、停转这 3 种状态。

一个状态机需要在状态集合中选取一个状态作为初始状态。

迁移:系统从一个状态转移到另一个状态的过程称作迁移,迁移不是自动发生的,需要外界对系统施加影响。停转的电动机自己不会转起来,让它转起来必须上电。

事件:某一时刻发生的对系统有意义的事情,状态机之所以发生状态迁移,就是因为出现了事件。对电动机来讲,加正电压、加负电压、断电就是事件

动作:在状态机的迁移过程中,状态机会做出一些其它的行为,这些行为就是动作,动作是状态机对事件的响应。给停转的电动机加正电压,电动机由停转状态迁移到正转状态,同时会启动电机,这个启动过程可以看做是动作,也就是对上电事件的响应。

条件:状态机对事件并不是有求必应的,有了事件,状态机还要满足一定的条件才能发生状态迁移。还是以停转状态的电动机为例,虽然合闸上电了,但是如果供电线路有问题的话,电动机还是不能转起来。

只谈概念太空洞了,上一个小例子:一单片机、一按键、俩 LED 灯(记为L1和L2)、一人, 足矣!

【学习交流群】不知道怎么学?遇到问题没人问?到处找资料?邀请你加入我的嵌入式物联网单片机学习交流群,群内气氛活跃,大咖小白、在职、学生都有,还有群友整理收集的100G教程资料,点击下方进群占位。(点击跳转到群二维码,请放心点击!)

知乎-嵌入式物联网单片机学习交流群

规则描述:

1、L1L2状态转换顺序OFF/OFF--->ON/OFF--->ON/ON--->OFF/ON--->OFF/OFF

2、通过按键控制L1L2的状态,每次状态转换需连续按键5

3、L1L2的初始状态OFF/OFF

下面这段程序是根据功能要求写成的代码。

程序清单List1:

void main(void)
{
 sys_init();
 led_off(LED1);
 led_off(LED2);
 g_stFSM.u8LedStat = LS_OFFOFF;
 g_stFSM.u8KeyCnt = 0;
 while(1)
 {
  if(test_key()==TRUE)
  {
   fsm_active();
  }
  else
  {
   ; /*idle code*/
  }
 }
}
void fsm_active(void)
{
 if(g_stFSM.u8KeyCnt > 3) /*击键是否满 5 次*/
 {
  switch(g_stFSM.u8LedStat)
  {
   case LS_OFFOFF:
    led_on(LED1); /*输出动作*/
    g_stFSM.u8KeyCnt = 0;
    g_stFSM.u8LedStat = LS_ONOFF; /*状态迁移*/
    break;
   case LS_ONOFF:
    led_on(LED2); /*输出动作*/
    g_stFSM.u8KeyCnt = 0;
    g_stFSM.u8LedStat = LS_ONON; /*状态迁移*/
    break;
   case LS_ONON:
    led_off(LED1); /*输出动作*/
    g_stFSM.u8KeyCnt = 0;
    g_stFSM.u8LedStat = LS_OFFON; /*状态迁移*/
    break;
   case LS_OFFON:
    led_off(LED2); /*输出动作*/
    g_stFSM.u8KeyCnt = 0;
    g_stFSM.u8LedStat = LS_OFFOFF; /*状态迁移*/
    break;
   default: /*非法状态*/
    led_off(LED1);
    led_off(LED2);
    g_stFSM.u8KeyCnt = 0;
    g_stFSM.u8LedStat = LS_OFFOFF; /*恢复初始状态*/
    break;
  }
 }
 else
 {
  g_stFSM.u8KeyCnt++; /*状态不迁移,仅记录击键次数*/
 }
}

实际上在状态机编程中,正确的顺序应该是先有状态转换图,后有程序,程序应该是根据设计好的状态图写出来的。不过考虑到有些童鞋会觉得代码要比转换图来得亲切,我就先把程序放在前头了。

这张状态转换图是用UML(统一建模语言)的语法元素画出来的,语法不是很标准,但拿来解释问题足够了。

圆角矩形代表状态机的各个状态,里面标注着状态的名称。

带箭头的直线或弧线代表状态迁移,起于初态,止于次态。

图中的文字内容是对迁移的说明,格式是:事件[条件]/动作列表(后两项可选)。

“事件[条件]/动作列表”要说明的意思是:如果在某个状态下发生了“事件”,并且状态机

满足“[条件]”,那么就要执行此次状态转移,同时要产生一系列“动作”,以响应事件。在这个例子里,我用“KEY”表示击键事件。

图中有一个黑色实心圆点,表示状态机在工作之前所处的一种不可知的状态,在运行之前状态机必须强制地由这个状态迁移到初始状态,这个迁移可以有动作列表(如图1所示),但不需要事件触发。

图中还有一个包含黑色实心圆点的圆圈,表示状态机生命周期的结束,这个例子中的状态机生生不息,所以没有状态指向该圆圈。

关于这个状态转换图就不多说了,相信大家结合着上面的代码能很容易看明白。现在我们再聊一聊程序清单List1。

先看一下fsm_active()这个函数,g_stFSM.u8KeyCnt = 0;这个语句在switch—case里共出现了 5 次,前 4 次是作为各个状态迁移的动作出现的。从代码简化提高效率的角度来看,我们完全可以把这 5 次合并为 1 次放在 switch—case 语句之前,两者的效果是完全一样的,代码里之所以这样啰嗦,是为了清晰地表明每次状态迁移中所有的动作细节,这种方式和图2的状态转换图所要表达的意图是完全一致的。

再看一下g_stFSM这个状态机结构体变量,它有两个成员:u8LedStatu8KeyCnt。用这个结构体来做状态机好像有点儿啰嗦,我们能不能只用一个像 u8LedStat 这样的整型变量来做状态机呢?

当然可以!我们把图 2中的这 4 个状态各自拆分成 5 个小状态,这样用 20 个状态同样能实现这个状态机,而且只需要一个 unsigned char 型的变量就足够了,每次击键都会引发状态迁移, 每迁移 5 次就能改变一次 LED 灯的状态,从外面看两种方法的效果完全一样。

假设我把功能要求改一下,把连续击键5次改变L1L2的状态改为连续击键100次才能改变L1L2的状态。这样的话第二种方法需要4X100=400个状态!而且函数fsm_active()中的switch—case语句里要有400个case,这样的程序还有法儿写么?!

同样的功能改动,如果用g_stFSM这个结构体来实现状态机的话,函数fsm_active()只需要将if(g_stFSM.u8KeyCnt>3)改为if(g_stFSM.u8KeyCnt > 98)就可以了!

g_stFSM结构体的两个成员中,u8LedStat可以看作是质变因子,相当于主变量;u8KeyCnt可以看作是量变因子,相当于辅助变量。量变因子的逐步积累会引发质变因子的变化。

g_stFSM这样的状态机被称作Extended State Machine,我不知道业内正规的中文术语怎么讲,只好把英文词组搬过来了。

2、状态机编程的优点

说了这么多,大家大概明白状态机到底是个什么东西了,也知道状态机化的程序大体怎么写了,那么单片机的程序用状态机的方法来写有什么好处呢?

(1)提高CPU使用效率

话说我只要见到满篇都是delay_ms()的程序就会蛋疼,动辄十几个ms几十个ms的软件延时是对CPU资源的巨大浪费,宝贵的CPU机时都浪费在了NOP指令上。那种为了等待一个管脚电平跳变或者一个串口数据而岿然不动的程序也让我非常纠结,如果事件一直不发生,你要等到世界末日么?

把程序状态机化,这种情况就会明显改观,程序只需要用全局变量记录下工作状态,就可以转头去干别的工作了,当然忙完那些活儿之后要再看看工作状态有没有变化。只要目标事件(定时未到、电平没跳变、串口数据没收完)还没发生,工作状态就不会改变,程序就一直重复着“查询—干别的—查询—干别的”这样的循环,这样CPU就闲不下来了。在程序清单 List3 中,if{}else{}语句里else下的内容(代码中没有添加,只是加了一条/*idle code*/的注释示意)就是上文所说的“别的工作” 。

这种处理方法的实质就是在程序等待事件的过程中间隔性地插入一些有意义的工作,好让CPU不是一直无谓地等待。

(2) 逻辑完备性

我觉得逻辑完备性是状态机编程最大的优点

不知道大家有没有用C语言写过计算器的小程序,我很早以前写过,写出来一测试,那个惨不忍睹啊!当我规规矩矩的输入算式的时候,程序可以得到正确的计算结果,但要是故意输入数字和运算符号的随意组合,程序总是得出莫名其妙的结果。

后来我试着思维模拟一下程序的工作过程,正确的算式思路清晰,流程顺畅,可要碰上了不规矩的式子,走着走着我就晕菜了,那么多的标志位,那么多的变量,变来变去,最后直接分析不下去了。

很久之后我认识了状态机,才恍然明白,当时的程序是有逻辑漏洞的。如果把这个计算器程序当做是一个反应式系统,那么一个数字或者运算符就可以看做一个事件,一个算式就是一组事件组合。对于一个逻辑完备的反应式系统,不管什么样的事件组合,系统都能正确处理事件,而且系统自身的工作状态也一直处在可知可控的状态中。反过来,如果一个系统的逻辑功能不完备,在某些特定事件组合的驱动下,系统就会进入一个不可知不可控的状态,与设计者的意图相悖。

状态机就能解决逻辑完备性的问题。

状态机是一种以系统状态为中心,以事件为变量的设计方法,它专注于各个状态的特点以及状态之间相互转换的关系。状态的转换恰恰是事件引起的,那么在研究某个具体状态的时候,我们自然而然地会考虑任何一个事件对这个状态有什么样的影响。这样,每一个状态中发生的每一个事件都会在我们的考虑之中,也就不会留下逻辑漏洞。

这样说也许大家会觉得太空洞,实践出真知,某天如果你真的要设计一个逻辑复杂的程序,

我保证你会说:哇!状态机真的很好用哎!

(3)程序结构清晰

用状态机写出来的程序的结构是非常清晰的。

程序员最痛苦的事儿莫过于读别人写的代码。如果代码不是很规范,而且手里还没有流程图,读代码会让人晕了又晕,只有顺着程序一遍又一遍的看,很多遍之后才能隐约地明白程序大体的工作过程。有流程图会好一点,但是如果程序比较大,流程图也不会画得多详细,很多细节上的过程还是要从代码中理解

相比之下,用状态机写的程序要好很多,拿一张标准的UML状态转换图,再配上一些简明的文字说明,程序中的各个要素一览无余。程序中有哪些状态,会发生哪些事件,状态机如何响应,响应之后跳转到哪个状态,这些都十分明朗,甚至许多动作细节都能从状态转换图中找到。可以毫不夸张的说,有了UML状态转换图,程序流程图写都不用写。

七、pic单片机编程中OPTION怎么使用?

OPTION 是一个寄存器 里面有配置定时器的标志位TMR1IE 为定时器1使能

八、51单片机编程中break是什么?

在 51 单片机编程中,break 通常是指跳出循环语句(如 for、while 等)或 switch 语句,执行下一条语句的关键字。

当执行 break 语句时,程序将会跳出当前的循环或 switch 语句,并开始执行紧随其后的下一条指令。这样就可以有效地终止循环或 switch 语句的执行,从而使程序的执行流程更为灵活。

需要注意的是,在使用 break 时,如果不小心在循环外使用该命令,会导致编译错误或者不可预测的程序行为,处理语句范围一定要慎重。

九、单片机编程的视频

单片机编程的视频是学习和掌握单片机技术的一个重要途径。随着科技的发展,单片机已经变得越来越普遍,广泛应用于各种电子设备和系统中。对于想要进一步了解和应用单片机的人来说,学习单片机编程的视频课程不仅能够提供全面的知识和技能,还能够通过实例和实验帮助学习者更好地理解和应用。

为什么选择单片机编程视频

在学习单片机编程过程中,通过视频课程可以获得以下几个优势:

  • 直观性:视觉是人类最主要的感知方式之一,通过观看视频可以更加直观地理解单片机的工作原理和编程技巧。视频中通常会通过图像、动画和实例演示等方式来展示单片机编程的具体过程和实验效果,帮助学习者更好地理解和掌握。
  • 实践性:单片机编程往往需要通过实践来巩固和应用所学的知识。视频课程一般会附带相关的实验演示,学习者可以通过跟随视频中的指导,进行实际的编程实验和调试,加深对于单片机编程的理解和应用。
  • 自学性:通过单片机编程的视频课程,学习者可以自主决定学习的节奏和时间安排。视频课程可以随时随地进行观看和学习,便于自主掌握和安排学习进程。对于那些没有固定时间和地点参加培训课程的学习者来说,视频课程是一种理想的学习选择。
  • 全面性:一套好的单片机编程视频课程应该具备全面的内容覆盖,涵盖基本的单片机知识、常用编程语言和工具以及各种实际应用案例。学习者可以通过视频课程全面系统地学习和掌握单片机编程相关的知识和技能,提高自己在这一领域的竞争力。

如何选择适合的单片机编程视频课程

选择适合自己的单片机编程视频课程需要考虑以下几个方面:

  1. 内容丰富度:课程内容应该全面、丰富,涵盖从基础到实战的各个方面。好的视频课程应该包含单片机的基本原理和结构、常用编程语言和工具的使用、各种实际应用案例的讲解等。学习者可以通过查看课程大纲和简介,以及其他学员的评价,来判断课程的内容是否丰富。
  2. 教学方式:不同的学习者有不同的学习方式和习惯。一些人喜欢系统详细地讲解,而另一些人则更喜欢通过实例和案例来学习。选择适合自己的教学方式,可以提高学习效果。在选择视频课程时,可以通过观看一些示例视频或者试听课程来了解教学方式。
  3. 师资力量:视频课程的质量很大程度上取决于讲师的素质和教学经验。选择那些有丰富经验、深入了解单片机编程并且教学风格符合自己需求的讲师的课程,可以提高学习效果。可以通过查看讲师的资历和教学经验,以及其他学员的评价来评估讲师的师资力量。
  4. 实验和互动:单片机编程需要通过实践来巩固所学的知识。优质的视频课程应该提供相关的实验演示和互动环节,使学习者能够在实践中巩固和应用所学。可以通过查看课程简介和评价来了解课程是否有相应的实验和互动内容。
  5. 学习支持和资源:选择视频课程时,还要考虑课程提供的学习支持和学习资源。优秀的课程应该提供有问答交流平台、学习资料和实验代码等支持和资源,帮助学习者更好地学习和理解单片机编程。可以通过查看课程介绍和其他学员的评价来了解课程的学习支持和资源。

参考单片机编程视频课程

以下是一些优秀的单片机编程视频课程推荐:

  • 《单片机基础入门与实战》:这门课程由资深的单片机工程师讲授,课程内容全面,适合零基础学习者。视频讲解详细,有大量的实例和案例演示,让学习者能够深入理解单片机编程的各个方面。
  • 《嵌入式系统设计与单片机编程》:这门课程涵盖了从嵌入式系统设计基础到单片机编程的全过程。课程内容系统、完整,通过大量的实验演示和案例讲解,帮助学习者全面掌握嵌入式系统设计与单片机编程。
  • 《ARM单片机编程与应用》:这门课程介绍了ARM单片机的基本原理、编程语言和应用案例。讲师具有丰富的教学经验,课程内容深入浅出,通过实例和实验帮助学习者更好地理解和应用ARM单片机编程。
  • 《单片机C语言编程实践》:这门课程专注于单片机C语言编程的实践应用。讲师通过详细的讲解和实例演示,帮助学习者掌握单片机C语言编程的基本原理和常用技巧,提高单片机编程的实践能力。

选择适合自己的单片机编程视频课程,可以帮助学习者更好地掌握和应用单片机编程的知识和技能。通过直观的视频讲解和实践演示,学习者可以全面系统地学习和理解单片机编程,提高自己在这一领域的竞争力。

十、单片机编程器如何选择?

最开始学建议你规规矩矩用keil4 MDK,用熟了再用vscode,非常强大的代码编辑器。

如果你要玩Arduino的话,建议你直接在vscode中使用platformIO,非常非常好用,而且vscode本身对代码编辑支持也非常好。

最后GL&HF

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
点击我更换图片