单片机编程思想 (单片机编程思路)
本文目录导航:
单片机编程思想——状态机
单片机编程思想——状态机状态机(state machine)有5个要素:状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。
状态:一个系统在某一时刻所存在的稳定的工作情况。
迁移:系统从一个状态转移到另一个状态的过程称作迁移,迁移不是自动发生的,需要外界对系统施加影响。
事件:某一时刻发生的对系统有意义的事情。
动作:在状态机的迁移过程中,状态机会做出一些其它的行为,这些行为就是动作,动作是状态机对事件的响应。
条件:状态机对事件并不是有求必应的,有了事件,状态机还要满足一定的条件才能发生状态迁移。
状态机编程中,正确的顺序应该是先有状态转换图,后有程序,程序应该是根据设计好的状态图写出来的。
以按键控制流水灯状态转换图为例,用UML(统一建模语言)的语法元素画出,说明事件、条件和动作。
程序代码实现按键控制流水灯的状态转换,包含初始化、检测按键、状态机主循环和状态迁移逻辑。
状态机结构体变量包含u8LedStat和u8KeyCnt两个成员,u8LedStat表示状态,u8KeyCnt记录按键次数。
状态机可以用结构体变量实现,u8LedStat作为主变量,u8KeyCnt作为辅助变量,辅助变量的积累引发主变量的变化。
采用结构体变量的状态机被称为Extended State Machine。
通过状态机编程,可以清晰地定义系统的行为逻辑,简化程序代码,提高程序的可读性和可维护性。
在单片机编程中,状态机是一种有效且实用的编程思想。

电子工程师的八大技能
电子工程师必备的八大技能
每一个工程师应该终身学习,不断提高,向高手学习工作经验,勤奋练习,掌握技能,提升经验。
下面来了解下电子工程师必备的八大技能吧。
一、抄板技能
1级:能够画出电源电路等电路图。
2级:能看懂电路图,快速理解其设计意图。
3级:能从中学习电路设计的智慧,评价其设计方案的好坏。
4级:基本不用一点点的抄就能知道电路原理图,能吸取高深的走线设计技巧。
二、焊板技能
此技能是电子工程师的看家本领,必备武器,且技能等级要训练到最高级。
1级:明白焊接原理,能应付简单的焊接,且懂基础理论知识。
2级:能熟练的焊接贴片元件,非常熟练的焊接插件元件,且能保证质量。
能够独立完成贴片的MCU焊接。
3级:焊接技术更上一层,焊点美观达标。
无连焊虚焊,不能有拉尖、白锡等不合格焊点。
对器件的弯曲能够细心把握,对线头的焊接处理合适。
4级:焊接技术纯熟,基本一次搞定,不能用蛮劲、硬杵的现象,温度把握精准,元件分布合理美观。
布线能够借助画图工具初步设计后再进行焊接。
基本掌握一个成熟的设计流程,设计阶段要细心,有大局观。
为后续的工作带来很大方便。
三、PCB画板技能
PCB画板软件首选Protel99se,Altiun designer9等,电子工程师的必备技能。
1级:知道PCB设计的基本流程,掌握创建库文件、封装库等一整套步骤,能够画好单片机最小系统板。
2级:建立好自己常用的封装库文件,这是一个成熟电子工程师的积累。
3级:能迅速画好多层板,布线要合理。
4级:对高频信号等其他高级理论充分理解,并且善于实践于设计PCB之中。
四、电子电路仿真技能
为你成为电子工程师必须掌握的软件工具,不得不学。
熟练掌握后可以用一台电脑当做一个虚拟实验室,性价比也不错。
1级:会使用常见的EDA软件,PSPICE,PROTEUS,MATLAB,MLUTISIM等,我们推荐PROTEUS7.8和MLUTISIM11这2款电子电路仿真软件,重要要明白这些仿真软件的各个侧重点。
2级:能结合实例,运用软件工具对其分析,寻求最优的参数,确定最终方案。
3级:软件不在是主流,只是辅助,已经有了丰富的电子电路调试经验,因为有时软件也不准确,当不能因为这个原因否定软件仿真的价值。
五、编程技能
要想成为电子工程师中的高手,编程是不得不跨越的龙门。
编程技巧很多,但是编程思想更重要。
1级:C语言要熟练,能编写实现基本功能的项目。
编译工具要上手快,熟悉具体的编译环境,当然环境只是个工具,C才是内功,自己没事多看看C,会收获更多。
2级:流程图不能不画,这是打开思维的钥匙。
是把思路理清的工具。
各种流程图灵活运用,能把复杂的程序分的有模有样。
要具备分时操作的思想。
状态机的思想是渗入到程序的每个毛孔的.。
这是一种牺牲灵活,获得清晰的一种方法,推荐一款流程图绘制软件:Inspiration v8.0,非常好用。
3级:传说中的大神。
基本能够处理常见事务,like 键盘、显示、LCD、 测频、数据传输、PWM、超级定时、稳压、AD采样、数字滤波等等,都已经烂熟于心。
该阶段提升是在程序独立性和模块化上做文章了。
每一个模块虽然有现成的实例,但是要想好好的理解,非要自己去做一遍才行,值得深入研究。
其实做的多了,就感觉单片机只是个工具,要想升级自己,还要多多观察编程思路,数学模型一类的东西,那些才是干货。
这其实就是从经验知识到专业理论知识的转化,再有专业理论知识向基本理论的质变。
一些工具可以用上,如matlab…等。
4级:更高的层次,多总结,多思考,能成为行业内的标杆。
六、调试技能
硬件调试和软件调试。
都是分块化思想,按部就班有条有理的进行。
只有这样才能排查出bug来。
硬件上,熟练使用仪器,其实没什么,最重要的就是万用表和示波器。
两大神器!软件就是下载器和开发板,无尽的尝试换来丰收的硕果。
但是尝试切不可盲目乱撞,否则只会越挫越没士气。
别小看调试,对于一个初级硬件工程师,没有这个基础什么工作也做不下去。
电子行业的基础是测量,好好研究吧。
七、创意
不要以为创意就是发明创造,其实创意只是在前人的肩上更高了一步,哪怕是一小步也是有价值的。
所以想要创意之前,我们要学会模仿,模仿是创意的前期学习过程,这样一个过程有很快的提高,因为方向明确。
八、坚持
坚持就是胜利,每条道路上都有胜利果实。
要坚持,坚持不断积累,就会有收获。
千里之行,始于足下。
奋斗才刚刚开始,困难刚刚来临,让困难来的更猛烈些吧,这样我才能长出健壮的翅膀。
单片机师傅清指教
状态机的概念状态机是软件编程中的一个重要概念。
比这个概念更重要的是对它的灵活应用。
在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。
比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。
这就是最简单的按键状态机例子。
实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。
进一步看,击键动作本身也可以看做一个状态机。
一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。
同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。
显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。
当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。
有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。
这样一来状态机便有了更实际的功用。
程序其实就是状态机。
也许你还不理解上面这句话。
请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么?状态机的要素状态机可归纳为4个要素,即现态、条件、动作、次态。
这样的归纳,主要是出于对状态机的内在因果关系的考虑。
“现态”和“条件”是因,“动作”和“次态”是果。
详解如下:①现态:是指当前所处的状态。
②条件:又称为“事件”。
当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
③动作:条件满足后执行的动作。
动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。
动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④次态:条件满足后要迁往的新状态。
“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。
状态机的表示方法有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。
纯粹用文字描述是很低效的,所以就不介绍了。
接下来先介绍图形的方式。
状态迁移图(STD)状态迁移图(STD),是一种描述系统的状态、以及相互转化关系的图形方式。
状态迁移图的画法有许多种,不过一般都大同小异。
我们结合一个例子来说明一下它的画法,如图1所示。
图1 状态迁移图①状态框:用方框表示状态,包括所谓的“现态”和“次态”。
②条件及迁移箭头:用箭头表示状态迁移的方向,并在该箭头上标注触发条件。
③节点圆圈:当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总。
④动作框:用椭圆框表示。
⑤附加条件判断框:用六角菱形框表示。
状态迁移图和我们常见的流程图相比有着本质的区别,具体体现为:在流程图中,箭头代表了程序PC指针的跳转;而在状态迁移图中,箭头代表的是状态的改变。
我们会发现,这种状态迁移图比普通程序流程图更简练、直观、易懂。
这正是我们需要达到的目的。
状态迁移表除了状态迁移图,我们还可以用表格的形式来表示状态之间的关系。
这种表一般称为状态迁移表。
表1就是前面介绍的那张状态迁移图的另一种描述形式。
表1 状态迁移表①采用表格方式来描述状态机,优点是可容纳更多的文字信息。
例如,我们不但可以在状态迁移表中描述状态的迁移关系,还可以把每个状态的特征描述也包含在内。
②如果表格内容较多,过于臃肿不利于阅读,我们也可以将状态迁移表进行拆分。
经过拆分后的表格根据其具体内容,表格名称也有所变化。
③比如,我们可以把状态特征和迁移关系分开列表。
被单独拆分出来的描述状态特征的表格,也可以称为“状态真值表”。
这其中比较常见的就是把每个状态的显示内容单独列表。
这种描述每个状态显示内容的表称之为“显示真值表”。
同样,我们把单独表述基于按键的状态迁移表称为“按键功能真值表”。
另外,如果每一个状态包含的信息量过多,我们也可以把每个状态单独列表。
④由此可见,状态迁移表作为状态迁移图的有益补充,它的表现形式是灵活的。
⑤状态迁移表优点是信息涵盖面大,缺点是视觉上不够直观,因此它并不能取代状态迁移图。
比较理想的是将图形和表格结合应用。
用图形展现宏观,用表格说明细节。
二者互为参照,相得益彰。
用状态机思路实现一个时钟程序接下来,我将就状态机的应用,结合流程图、状态迁移图和状态迁移,举一个实际例子。
下面这张图是一个时钟程序的状态迁移图,如图2所示。
图2 时钟程序状态迁移图把这张图稍做归纳,就可以得到它的另一种表现形式——状态迁移表,如表2所示。
表2 时钟程序状态迁移表状态机应用的注意事项 基于状态机的程序调度机制,其应用的难点并不在于对状态机概念的理解,而在于对系统工作状态的合理划分。
初学者往往会把某个“程序动作”当作是一种“状态”来处理。
我称之为“伪态”。
那么如何区分“动作”和“状态”。
本匠人的心得是看二者的本质:“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
初学者的另一种比较致命的错误,就是在状态划分时漏掉一些状态。
我称之为“漏态”。
“伪态”和“漏态”这两种错误的存在,将会导致程序结构的涣散。
因此要特别小心避免。
更复杂的状态机前面介绍的是一种简单的状态结构。
它只有一级,并且只有一维,如图3所示。
图3线性状态机结构如果有必要,我们可以建立更复杂的状态机模型。
1 多级状态结构状态机可以是多级的。
在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。
在某些状态下,还可以进一步划分子状态。
比如,我们可以把前面的时钟例子修改如下:把所有和时钟功能有关的状态,合并成1个一级状态。
在这个状态下,又可以划分出3个二级子状态,分别为显示时间、设置小时、设置分钟;同样,我们也可以把所有和闹钟功能有关的状态,合并成1个一级状态。
在这个状态下,再划分出4个二级子状态,分别为显示闹钟、设置“时”、设置“分”、设置鸣叫时间。
我们需要用另一个状态变量(寄存器)来表示这些子状态。
子状态下面当然还可以有更低一级的孙状态(子子孙孙无穷尽也),从而将整个状态体系变成了树状多级状态结构,如图4所示。
图4 树状多级状态结构2 多维状态结构状态结构也可以是多维的。
从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。
比如,在按照按键和显示划分状态的同时,又按照系统的工作进程做出另一种状态划分。
这两种状态划分同时存在,相互交叉,从而构成了二维的状态结构空间。
举一个这方面的例子,如:空调遥控器,如图5所示。
图5 多维状态机结构同样,我们也可以构建三维、四维甚至更多维的状态结构。
每一维的状态都需要用一个状态变量(寄存器)来表示。
无论多级状态结构和多维状态结构看上去多么迷人,匠人的忠告是:我们依然要尽可能地简化状态结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的复杂结构。
简单的才是最有效的。
结束语对状态机的理解需要一个由浅入深的过程。
这个过程应该是与实践应用和具体案例思考相结合的。
当一种良好的思路成为设计的习惯,它就能给设计者带来回报。
愿这篇手记里介绍的基于状态机的编程思路能给新手们带来一些启迪,帮助大家找到“程序设计”的感觉。