一、课程开发的课程开发的意义?
教育的目标是为属于某种文化的人进行该文化的传承和更新,对于家庭和个人来说教育的目标有两个,一是教育儿童成为有个人身份的成人,二是向后代传递知识和技能,并让后代为适应他们所生存的自然与社会现实的要求做准备。这两个目标是适应现实及个人和群体生存的基础,为实现目标,就要对课程进行设计开发。同时课程需要跨越时间空间,因此需要设计一个规划,表明课程的决策和组成部分间的相互组织和调整。通过把课程的内容与时间上和资料上的限制相联系,决定对象、内容和学习行为的组合,为教育参与者提供方向指导。
二、单片机编程人工智能?
摘要:不知道大家有没有这样一种感觉,就是感觉自己玩单片机还可以,各个功能模块也都会驱动,但是如果让你完整的写一套代码,却无逻辑与框架可言,上来就是开始写!东抄抄写抄抄。说明编程还处于比较低的水平,那么如何才能提高自己的编程水平呢?学会一种好的编程框架或者一种编程思想,可能会受用终生!比如模块化编程,框架式编程,状态机编程等等,都是一种好的框架。
今天说的就是状态机编程,由于篇幅较长,大家慢慢欣赏。那么状态机是一个这样的东东?状态机(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
状态转换图,程序流程图写都不用写。
三、高中 单片机课程
单片机课程在高中阶段是电子信息技术教育的重要组成部分。随着科技的发展,单片机在各个领域的应用越来越广泛,因此,掌握单片机编程和应用已成为一项必备技能。本文将介绍高中单片机课程的重要性以及如何为学生提供一种有效的学习体验。
为什么高中单片机课程很重要?
在当前的信息时代,单片机是许多电子设备的核心部件,它们被广泛应用于计算机、通信、汽车、医疗和家用电器等领域。对于学习者来说,掌握单片机编程和应用可以培养他们的创新能力、逻辑思维和问题解决技巧。了解单片机的原理和工作方式,能够帮助学生更好地理解电子设备的工作原理,培养学生的电子技术素养。
此外,单片机课程还可以引导学生学会团队合作和项目管理。在学习单片机的过程中,学生通常需要进行实践项目,包括设计和构建简单电子电路、编写程序并进行调试。这些项目不仅提供了学习的机会,还能够培养学生的合作能力和解决实际问题的能力。
高中单片机课程如何设计与实施?
设计和实施高中单片机课程需要教师具备相关的专业知识和教学经验。以下是一些建议:
- 确立学习目标:教师应根据学生的年龄和能力水平设定明确的学习目标。例如,了解单片机的基本原理、掌握编程语言、进行实践项目等。
- 选择合适的教材:根据学生的实际情况选择合适的教材,教材应具有系统性、实用性、易于理解和操作。
- 设计实践项目:通过设计实践项目,让学生将所学的理论知识应用到实际中去。可以设计一些简单的电子电路,让学生进行组装和调试,并编写相关的程序进行控制。
- 提供实验设备:高中单片机课程需要一些实验设备的支持,如单片机开发板、电子元件等。教师可以与学校或相关机构合作,确保学生有足够的设备进行实验。
- 组织学习活动:可以组织一些课外学习活动,如参观科技企业、参加电子设计竞赛等,激发学生的学习兴趣。
高中单片机课程的学习效果评估
对于高中单片机课程的学习效果评估,可以采用多种形式:
- 考试和测试:通过笔试和实践考试,评估学生对单片机知识的掌握程度。考试内容应包括理论知识和实际操作。
- 项目评估:评估学生在实践项目中的表现和成果。可以从项目设计、实验记录、代码质量等方面进行评价。
- 小组讨论和展示:组织学生进行小组讨论和展示,评估他们在团队合作和沟通方面的能力。
高中单片机课程的挑战和解决方案
高中单片机课程的教学面临一些挑战,以下是一些常见的挑战和解决方案:
- 学生兴趣不高:由于单片机课程具有一定的技术性和抽象性,学生可能对其缺乏兴趣。教师可以通过生动的案例和实践项目来激发学生的兴趣。
- 实验设备不足:某些学校可能缺乏实验设备和资源。教师可以利用网络资源,引导学生进行虚拟实验或设计仿真实验。
- 教师专业知识不足:部分教师可能在单片机方面的知识和教学方法方面存在一定的不足。可以通过参加相关培训和交流,提高自身的专业水平。
综上所述,高中单片机课程的设计与实施对于学生的学习和发展具有重要意义。通过系统性的学习和实践活动,学生将能够掌握单片机编程和应用的基本技能,培养创新能力和解决问题的能力。教师在设计和实施单片机课程时,需注重学生的学习兴趣和实践能力的培养,提供相关的实验设备和资源,并进行有效的学习效果评估。
四、单片机开发背景?
1 单片机技术自发展以来已走过了近20年的发展路程 。小到遥控电子玩具,大到航空航天技术等电子行业都有单片机应用的影子。针对单片机技术在电子行业自动化方面的重要应用,为满足广大学生、爱好者、产品开发者迅速学会掌握单片机这门技术,于是产生单片机开发板也称单片机学习板、单片机实验板。比较有名的例如电子人DZR-01A单片机开发板。 常见配套资源如下:
2 硬件实验板及其配件如:连接线、CPU芯片、流水灯、点阵显示、ds18b20温度检测、彩色TFT液晶屏,SD卡,游戏开发(推箱子游戏)、收音机、mp3解码等。
五、plc单片机什么课程?
PLC是电气工程及其自动化专业的主要课程。
PLC单片机涉及主要课程:
电路原理,电力系统自动化,电力系统继电保护,模拟电子技术基础,数字电子技术基础,电机学,高电压技术,电力系统分析,电磁场与电磁波,单片机技术,发电厂电气部分,工厂供电,电机与电力拖动基础。
电力电子技术,自动控制原理,计算机控制系统,系统工程导论,微机原理及接口技术,控制理论,电力工程基础,嵌入式系统与单片机,PLC原理及应用,电力传动技术,电力系统保护与控制,传感器原理及其应用,信号与系统。
六、课程开发的目的?
课程开发的目标是选择教材,制定内容大纲,确定教学程序和考试内容的起点。课程开发时,要制定明确而全面的学习目标。要考虑多方面的因素考虑学习者,当代校外生活学科专家,教育哲学和心理学。具体是要通过教育指明学生需要养成哪些行为。严明这些行为在哪些生活领域或内容得到运用
七、课程开发的特点?
课程开发(Curriculum Development)是指通过需求分析确定课程目标,再根据这一目标选择某一个学科(或多个学科)的教学内容和相关教学活动进行计划、组织、实施、评价、修订,以最终达到课程目标的整个工作过程。
目前课程开发因其诉求不同,主要分为两类,一类是以各大高校为代表的学院式课程开发体系,另一类是以各大中型企业为代表的实战课程开发体系。学院式的课程开发体系的主要特点是教学知识的系统、全面,教学内容讲究严谨、科学。
八、校本课程开发的校本课程开发的特点?
校本课程开发的特点:
(一)涉及课程开发的所有要素
校本课程开发作为一种课程开发活动,它涉及课程目标的制订、课程内容的选择、课程实施、课程评价等课程开发的基本要素。而以往的课外活动、兴趣小组活动仅仅是课堂的补充或延伸,不是一种课程开发活动,缺乏课程开发的基本要素。
(二)以校为本
校本课程开发是基于学校、为了学校、属于学校的课程开发活动,即以学校为基地、以学校为基础、以学校为主体的课程开发。校本课程开发重视学校及社区资源的开发与利用,强调学校办学特色与理念的凸显,关注教师作为课程开发的主体作用的发挥。
(三)自发、自愿
校本课程开发是学校以其特色需求为目标的自发性课程发展过程,在一定程度上能够兼顾地区性或校际间的个别差异,有利于教师根据本地区、本校的特点在课堂上灵活地运用。
(四)一种持续、动态的过程
校本课程开发能依照社会变迁与学生需求随时作出调整与改变,课程更富机动性、多样性与弹性。它不提倡编写固定的、正规的教材,而是强调活动、过程,以保持较大的开放性、灵活性与适应性。总之,校本课程开发不能等同于学校课程(即学校内所实施的一切课程),它更强调行动与过程,不要求自编教材,可以是活动方案或活页资料。与国家课程、地方课程相比,校本课程开发属于儿童中心、兴趣中心、问题中心的课程,属于“教师本位”的课程开发。在学术性课程与非学术性课程、必修课程与选修课程、学科课程与活动课程诸关系网络中,校本课程开发更定位于非学术性、选修类、活动类课程。
九、什么是人工智能课程?
人工智能课程是一门以机器学习、深度学习、自然语言处理、计算机视觉等技术为核心的学科课程。它的主要目的是培养学生的人工智能领域的专业知识、技能和实践能力,让学生了解人工智能的基本原理和最新技术,提升学生在人工智能领域的创新思维和实践能力。人工智能课程的内容涵盖了多个方面,包括机器学习、深度学习、自然语言处理、计算机视觉等。其中,机器学习是人工智能的核心技术之一,它通过训练模型来自动识别数据中的模式并进行预测。深度学习是机器学习的一种,它使用神经网络模型来处理和分析数据。自然语言处理是让计算机理解和处理人类语言的技术,计算机视觉则是让计算机从图像中提取信息的技术。人工智能课程的目标不仅是让学生掌握这些技术,更重要的是让学生理解这些技术在实际问题中的应用。通过实践项目和案例分析,学生可以了解到如何利用这些技术来解决实际问题,提高他们的创新思维和实践能力。此外,人工智能课程还注重培养学生的道德和社会责任感。在人工智能的应用中,我们需要考虑到其对人类社会的影响,例如隐私问题、安全问题等。因此,在人工智能课程中,学生也需要学习如何遵守道德规范和法律法规,确保他们的人工智能应用不会对人类社会造成负面影响。总之,人工智能课程是一门综合性很强的学科课程,它旨在让学生掌握人工智能的核心技术,理解其在实践中的应用,并培养他们的道德和社会责任感。
十、自学单片机如何选择开发板?
选择合适的单片机开发板非常重要。以下是几点建议:
了解自己的需求:在选择开发板之前,需要了解自己的需求。主要是明确你想要学习的单片机品牌和型号,以及开发板需要具备哪些功能和特性。
入门级开发板:针对初学者,可以选择一些入门级的开发板,比如51板子,STM32迷你板、Arduino UNO、Raspberry Pi等,这些开发板价格便宜,易于使用,并且有广泛的开发资源和社区支持。
储备知识:学习开发单片机需要有一定的电子基础知识和编程经验,比如电路基础、C语言等。选择开发板时需要考虑自己的背景知识。
功能和特性:开发板需要具备一定的功能和特性,比如可以连接各类传感器、驱动器、通信模块等,方便进行各种实验和应用。
品牌和质量:考虑使用知名品牌的开发板,并选择有保障的产品,以确保质量和后续支持,避免出现开发过程中无法继续或遇到困难得不到及时解决的情况。