一、单片机论文怎么写?
简单写几句……希望够接地气,
第一章简介,是对你做的工作的简单介绍。你要做什么,你为什么要做(动机),你做了什么,结果怎么样。
第二章,相关研究,你想要设计的系统要解决一个什么问题?问题的复杂度是怎么样的?以前的研究(别人的论文),他们怎么描述这个任务的难度的?他们做到了什么样的效果?相比于已经存在的方案,你这次要做的有什么改进?或者你期望解决什么还没被解决的问题?
第三章,基础或者说基础知识,把所有应该作为铺垫的基础知识放过来,比如说什么是单片机?什么是单片机的最小系统。你论文里会用到传感器,那么这里也可以类比的解释传感器的种类,各自的优缺点。等等等等,这一章方便读者储备需要的基础知识,免得后期理解不了你的实际工作。
第四章,系统设计和实现。首先分析需求,推导出你需要实现的功能,以及效果。然后,通过比较不同的方案,通过理论分析去决定用哪个方案。比如,有很多单片机可以选,通过列举,分析我项目的需求,不同单片机的优缺点,我最终选择msp430。
第五章,实验或者说验证。设计合理的实验去测试你实现的系统,并且需要给出科学的测量。最好能跟相关研究里提到的别人的数据做对比。
第六章,总结。回顾你想做什么,做了什么,你完成了什么,还有哪些工作可以成为下一步的工作。
以上我写的很具体,但是主要想说明,这是你的题目,你肯定有你自己的需求,考量,不太可能跟别人的一模一样。
二、STC89C51单片机相比于其他单片机具有那些优点。?
STC89C51只适合和同性能的51内核单片机相比,性能不同并无可比性。
11年前,我就是通过自学STC89C51入行单片机开发的。
到目前为止都非常经典,很多开发板都是基于这个芯片去做的。
我对STC单片机也是比较有好感的,一般51单片机的产品基本都用它。
下面罗列下它的优点:
1.资料丰富
现在新手学习单片机基本都是从STC89C51,配套开发板和学习资源也更多,新手入门基本无压力。
2.程序可以直接用串口下载,学习成本更低。
这点我个人认为很重要,但是往往也是容易被新手忽略的。
以前我接触过一些冷门的单片机,才知道烧录器是真的贵,最少都要几百上千。
而STC的基本都支持串口下载,一个USB转串口工具才10多块。
3.速度相对传统51单片机快8-12倍,价格也便宜。
STC的很多51单片机,频率都会比传统的51单片机快很多,价格也便宜,所以很多小产品也会用stc的单片机,还是值得去学习的。
4.稳定
现在很多出货量很大的产品都用STC单片机做的,我自己做过一款每个月出货量在10K以上的产品,很稳定。
5.对新手友好
STC89C51是51内核的单片机,外设资源比较少,比较容易上手。
使用外设资源必须配置寄存器,对单片机底层工作原理也能有更深的理解。
很多新手看到现在STM32很火,所以一上来就跳过51直接学STM32。
这个我不太建议,STM32基本都是调用库函数去实用单片机外设,可能你学完了还不知道单片机最终是通过配置寄存器去实用其功能的。
我们无际单片机学员都是统一从51单片机开始学习,以项目驱动,把知识落地。
单片机和C语言都只是工具,作为一个合格的单片机工程师,最核心的竞争力在于编程思维和水平。
这个做51单片机级别项目或许看不出来,但是你上到STM32级别的项目,就会明显感觉知识不够用。
如果你没做过51单片机项目,直接一上来就学STM32,外设可能还可以学会。
但是一让你用STM32做项目,你会一脸懵逼。
有优点,自然就有缺点:
1.外设资源有限
51单片机ROM和RAM,以及外设资源非常有限,不太适合做复杂的产品。
ADC、EEPROM之类的功能只能靠硬件扩展,增加硬件和软件的负担。
2.运行速度慢
虽然STC51相对传统的速度有几倍提升,但对于功能都多的产品依然非常吃力。
所以,一般STC89C51作为教学用途比较多,如果是实际产品开发,会选择一些别的型号,比如STC15系列等等。
最后彩蛋时间!!!最近有同学跟我要单片机的资料,我特意花一个月时间,总结了我10年产品研发经验,收集了这份史上最良心、最硬核、最实用的「单片机入门到高级教程+工具包+22个热门项目」,无偿分享给大家。
资料包几乎覆盖了C语言、单片机、模电数电、原理图和PCB设计、单片机高级编程等等,非常适合初学者入门和进阶。除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手!
据说有小伙伴靠这份顺利入职BAT,所以一定要保存起来好好学习!后期我也会组建一些技术交流群,让大家能认识更多的大佬,有个好的圈子,你对行业的认知将在最前沿。大家想要上面「单片机入门到高级教程工具包 + 进入单片机交流群」,可以点击下方⬇️卡片看文章开头领取。
无际单片机:单片机入门到高级开挂学习路径(附教程+工具)或者可以找「无际单片机」,全网同名的。 下面是更多无际原创的个人成长经历、行业经验、技术干货。
电子工程师的能力有多可怕?为什么我学了几天 STM32 感觉一脸茫然?谁能教教我怎么学单片机,先学什么,怎么入门?Stm32学了好久了,感觉独立做项目还是有力不从心的感觉?无际单片机:单片机怎么实现模块化编程?思维+实例+系统教程(实用程度令人发指)无际单片机:c语言回调函数的使用及实际作用详解无际单片机:手把手教你c语言队列实现代码,通俗易懂超详细!无际单片机:新手学习单片机最常见的六大误区,你进坑了吗?三、单片机学习培训哪家好?
到目前为止,单片机这方面的技术人员并不多,市面上对单片机技术人员的紧缺性非常大,这也说明想进入单片机嵌入式的你有很大的发展机会。单片机是嵌入式系统开发中的一部分,如果想要在这行业中有好的发展,那么我们可以参加单片机培训班进行实训,或者参与到一些项目当中历练。
在参加单片机培训班之前,先带大家了解一些简单的基本常识:
电路和数字,模拟电路:模拟电路和数字电路属于抽象学科,要把它学好还得费点精神。
在你学习之前,觉得模拟电路和数字电路基础不好的话,不要急着学习stm32单片机,应该先回顾所学过的模拟电路和数字电路知识,为学习stm32单片机加强基础。这方面我一般要求学员只要能正确使用电阻,电容等元器件掌握二极管,三极管基本工作原理,还有一些知识比较细,你们可以来问我
计算机语言:C语言知识,没有任何编程基础的人都可以学,在我看来,接受过六年基础教育都能学会,当你能使用C语言开发应用系统就行
51单片机:最好是能有8位单片机原理的学习经历和实践经验,像我之前的文章讲到,并不是每个人都是天才,学习51单片机是STM32的预备知识!
实践能力:数字万用表会进行基本的检测,对电路的通断会判断,会使用电烙铁进行焊接等等。
这个就像我们学习编程语言一样的,你熟悉一门语言以后再去学习别的语言会事半功倍。
重点来了,参加单片机培训班的学费是多少?学习时间是多长?
对于单片机线下培训机构的收费情况来说,费用很高,一般都在1.5到2万左右,培训的时间一般是4-6个月,具体情况由培训机构定。
现在市场上,只要是编程开发培训类的公司,不单单只有单片机培训项目费用这么高,其他的项目如前端培训、JAVA培训、PHP培训等,所有的项目培训费用都在上万元。
学费那么贵,依旧为什么很多人都会选择单片机培训班学习?因为交学费学技术,就像自己创业一样,先投入钱,然后靠自己的努力学完技术后,再通过工作把自己之前投入的钱赚回,付出和回报是成正比的,这一点是你一定要清楚的。对于单片机培训费用的介绍就到这来了,每个培训机构在价格上有所不同,基本都在1.5万到2万左右,只要你能了解单片机的发展前景,和自己未来的发展路线,那么你选择单片机行业是正确的。
线下脱产班的话基本的都有,新手往往很难选择。其实,单片机入门基础完全可以自学,真正难的是进阶!
培训的目的主要是找工作对吧?那一定要了解企业需求,企业需要真正能做商业化产品的。
【华维单片机编程】实战训练营,定位就是企业的需求,一切产品开发为起点,为企业提供相应的人才。价格不贵,一对一教学,方式会比较新颖,有兴趣的同学可以了解下
华维单片机编程:免费领!单片机入门到高级进阶路径(附教程+工具)4 赞同 · 2 评论文章4 赞同 · 2 评论文章想要一起学习单片机的朋友,评论”我要入门“,有惊喜,加入我们,就可以与导师一对一互动,快速成长
四、单片机编程软件有什么?
比较有名的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
这个状态机结构体变量,它有两个成员:u8LedStat
和 u8KeyCnt
。用这个结构体来做状态机好像有点儿啰嗦,我们能不能只用一个像 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
状态转换图,程序流程图写都不用写。
六、单片机传给手机txt文件?
没过上位机是手机的,弄过上位机是蓝牙主机然后通过串口传到pc上的,pc上用的是c#,w而且是几年以前了。我只能给你提供个大体方向,蓝牙协议一定要看懂,之后无非就是主从透传,单片机先数据处理,上位机处理一下获得的数据。你的例子得学一些安卓的编程,不然你的上位机无法处理数据。
学业不精,望指正
七、我是一个大一新生,自动化专业,报了一个单片机培训班,花挺多时间的,请问我们这个专业用单片机多吗?
用单片机挺多的,尤其是你想要参加比赛,有一定的科研经历,会对考研很有帮助。
培训班教的是arduino还是51?arduino还好,不是太早,只需会c就够了。而51就还需要数电微机原理的基础了,那就真的太早了。
作为同样在做比赛项目的,给你一些学习路线上的建议:
①从arduino入门。这应该是最常见、使用最简单的板子了。你只要c语言的基础就可以使用arduino了,而且arduino相关的库也很多。这个时候不需要知道单片机原理,能用就行。一般的比赛学到这就可以了。后面的这些是你决定走嵌入式开发以后需要学习的,或者arduino性能达不到比赛要求,不得不上32。
②后面建议学51,补一下前面缺的单片机的基础(数电微机原理等)。了解各种通信方式的原理。这时候你也可以去看一下arduino的源代码,会让你对单片机理解更深。
③后面就可以去学stm32(我现在在这里挣扎)。32引脚配置会卡掉近一半的人,所以建议从HAL库入门,用cubemx配置引脚确实比自己写代码初始化要更加简单、直观。能让你更加轻松的进入32。到这个时候,各种串口通信方式都会有多种方式实现(阻塞,中断或者DMA),一个通信方式大概会有100个相关的函数可以调用(HAL库),一两百个变量定义,但只需要知道有这些东西,用的时候去查就行了。
④最后就是linux的学习。我还没接触过,没法给你建议。
八、单片机烧录需要单片机吗?
单片机烧录不一定需要单片机的。因为这块芯片是由一堆上面的单元再加上一些数字电路,比如串口控制器所构成的,对这个flash的读写同样也不需要单片机CPU的参与,只需要遵循serial interface的时序就可以了。所以在烧写单片机的flash的时候是不需要CPU的参与的,只需要遵循flash的接口时序就可以了。
九、单片机和单片机哪个好?
单片机和嵌入式主要看应用场合,单片机的性价比较高,价格配置嵌入式的价格稍贵,功能强大。
十、EN单片机是什么单片机?
EN单片机是一个国产的单片机品牌,主要以8位单片机为主。EN单片机的特点是低功耗和小体积;大部分应用在低端电子市场上,例如小家电、闪灯控制、LED灯控制;虽说目前的主流市场是16和32位,但8位的地位仍旧无人撼动。
- 相关评论
- 我要评论
-