从单片机初学者迈向单片机工程师

合集下载

从单片机初学者迈向单片机工程师(对初学者非常有用)

从单片机初学者迈向单片机工程师(对初学者非常有用)
从单片机初学者迈向单片机工程师(对初学者非常有 用)
从单片机初学者迈向单片机工程师 目录: 一、LED 1 二、LED 主题讨论周第二章----学会释放 CPU................................................. 2 三、LED 识..............................................8 四、LED 灯................................................25 五、LED 28 六、KEY 主题讨论第一章按键程序编写的基础..................................... 37 主题讨论周第五章----多任务环境下的数码管编程设计................. 主题讨论周第四章----渐明渐暗的 主题讨论周第三章----模块化编程初 主题讨论周第一章----写在前面....................................................摸索出来了自己的一条路子。当然这 个过程必然是艰辛的,而他学会 了之后也不会在网络上轻易分享自己的学习成果。如此恶性循环下去,也 就不难理解为什幺初级的学习资 料满天飞,而深入一点的学习资料却很少的原因了。相较于其他领域,单 片机技术的封锁更加容易。尽管 已经问世了很多年了,有价值的资料还是相当的欠缺,大部分的资料都是 止于入门阶段或者是简单的演示 实验。但是在实际工程应用中却是另外一回事。有能力的高手无暇或者是 不愿公开自己的学习经验。 很多时候,我也很困惑,看到国外爱好者毫不保留的在网络上发布自己的 作品,我忽然感觉到一丝丝的 悲哀。也许,我们真的该转变一下思路了,帮助别人,其实也是在帮助自 己。啰啰嗦嗦的说了这幺多,相 信大家能够明白说的是什幺意思。在接下来的一段日子里,我将会结合电 子工程师之家举办的主题周活动 写一点自己的想法。尽可能从实用的角度去讲述。希望能够帮助更多的初

从技术员迈向工程师的历程 已读

从技术员迈向工程师的历程                                    已读

学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。

也感谢一线工人提供了这个机会。

希望大家有什么好的想法和建议都直接跟帖说出来。

毕竟只有交流才能够碰撞出火花来^_^。

几年前,和众多初学者一样,我接触到了单片机,立刻被其神奇的功能所吸引,从此不能自拔。

很多个日夜就这样陪伴着它度过了。

期间也遇到过非常多的问题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。

经常混迹于论坛里,也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。

很多时候,都想写一点什么东西出来,希望对广大的初学者有一点点帮助。

但总是不知从何处写起。

只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经验的地方写出来,权当是我对自己的一个总结吧。

而作为看官的你,如果看到了我的错误,还请一定指正,这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。

要成为一名优秀的单片机开发工程师,最重要的素质是什么?单片机从开发到产品端有很多关键阶段。

首先,开发新产品需要了解市场需求和应用方面的技术,才能定IC的规格;IC规格定下来后才能进行IC设计;IC设计完成后要进行验证;验证完成后,要做演示版进行市场推广。

这些阶段都要求单片机工程师具备优良的素质。

首先他们要懂技术,并注意技术经验的长期积累。

比如定IC规格,这是决定IC成败的关键,规格定得好,IC才能做得好。

但IC规格不能关起门来自己定,一定要与市场和产品端相结合。

所以就要求工程师必须熟悉整机产品的整个研发和生产过程,要懂生产环节和产品的专业知识,懂IC内部的相关工艺和IC设计。

因此,要完全掌握这项技术至少需要十年的经验积累,并且要一直做到工程主管的职位,才有可能完成。

因此这种人才在任何一家公司都非常宝贵,大概只有2%的人能做。

51学完后进阶方向

51学完后进阶方向

51单片机学完后进阶方向相信各位同学有了51单片机编程基础之后,都会对可编程器件的工作原理有个直观的认识,如果你发现自己对编程控制一些实物比较有兴趣,或者有志于进入我们基地,那么接下来可以有两个发展的方向供你选择:1、软件组ARM方向:这里给一个ARM的简单介绍,具体的请谷歌一下。

ARM内核处理器是当今世界上使用数量最多的处理器,苹果、三星、HTC、小米等几乎所有的智能手机、平板电脑用的都是ARM内核处理器(stm32单片机虽然也是arm内核,但是因为过于精简,不算在此类处理器里),ARM处理器将来有非常大的发展空间。

此处说的ARM处理器通常可以搭载操作系统,以android和linux为主,我们使用的主要是linux。

ARM方向主要是研究linux系统,尤其是嵌入式linux,这里需要大家有个队底层单片机控制的基本认识,所以先鼓励大家学习单片机。

一般来说,我们使用ARM处理器作为中位机或者上位机,由ARM发送指令给单片机执行,单片机做控制和传感器数据采集,ARM做指挥,不直接控制,但是受益于科技的发展,前两年出现了一种名为“卡片电脑”的ARM板(其代表为“树莓派”),这种板子也带有GPIO引脚,直接支持IIC,SPI等功能,可以直接控制传感器。

当然,它这方面的控制功能比起单片机来说还差一些,但是由于基于linux系统,使用的是一些高级程序语言,并且带有大量的库函数,使用起来非常简单和方便,开发速率远超单片机,为喜欢DIY的人提供了一个方便快捷的开发平台。

不过我们为了以后升级方便,以及追求更高的实时性,现阶段依然是由单片机管理硬件,ARM不直接参与硬件控制。

选择ARM方向你将会学到以下的知识:(一)、linux基本操作,如命令行,python编程等(二)、嵌入式linux的相关技术,如嵌入式系统底层驱动、嵌入式定制操作系统的裁减与移植、嵌入式系统板载应用程序、网络通讯程序等。

(三)、软件算法的研究,如视觉,路径规划等。

51单片机初学者到电子工程师

51单片机初学者到电子工程师

51单片机初学者到电子工程师(1)一、前言很多电子工程师在某个方面精深钻研,成为某一个特殊领域的专家,从一开始的养家糊口、慢慢小有收益、最后宝马豪宅,也是有的;这些电子工程师可能没有全面掌握这些知识,因为这些行业用不上,例如,液晶显示器,很多行业就不需要;但是,对于一个初学者,我认为,这个提纲是切合实际的,对于面向控制而言,已经基本够用了;对于初学者,全面地掌握这些知识是很有必要的,因为你不知道今后需要使用什么哪些知识,而这些知识,80%以上你会在今后的工作中使用上,因为这是都是最基本的。

熟练掌握这些知识和应用,根据不同的地区、行业和老板,月薪应该可以在3000元~5000元之间,甚至更高。

其实,可能有些你用不上,但是知道了也没有坏处;所谓书到用时方很少,又有谓艺不压身。

知识=月薪=年薪=金钱=香车宝马=…….. ,呵呵。

为什么要掌握这些知识?实际上,电子工程师就是将一堆器件搭在一起,注入思想(程序),完成原来的这些器件分离时无法完成的功能,做成一个成品。

所需要的技能越高、功能越复杂、成本越低、市场上对相应的东东的需求越大,就越成功。

这就是电子工程师的自身的价值。

从成本到产品售出,之间的差价就是企业的追求。

作为企业的老板,是在市场上去寻找这样的应用;对电子工程师而言,是将老板提出的需求或者应用按照一定的构思原则(成本最低、可*性最高、电路板最小、功能最强大等)在最短的时间内完成。

最短的时间,跟电子工程师的熟练程度、工作效率和工作时间直接有关。

这就是电子工程师的价值。

将电子产品抽象成一个硬件的模型,大约有以下组成:1) 输入2) 处理核心3) 输出输入基本上有以下的可能:1) 键盘2) 串行接口(RS232/485/can bus/以太网/USB)3) 开关量(TTL,电流环路,干接点)4) 模拟量(4~20ma、0~10ma、0~5V(平衡和非平衡信号))输出基本上有以下组成:1) 串行接口(RS232/485/can bus/以太网/USB)2) 开关量(TTL、电流环路、干接点、功率驱动)3) 模拟量(4~20ma,0~10ma,0~5V(平衡和非平衡信号))4) LED显示:发光管、八字5) 液晶显示器6) 蜂鸣器处理核心主要有:1) 8位单片机,主要就是51系列2) 32位arm单片机,主要有atmel和三星系列51系列单片机现在看来,只能做一些简单的应用,说白了,这个芯片也就是做单一的一件事情,做多了,不如使用arm来做;还可以在arm上加一个操作系统,程序既可*又容易编写。

(整理)从51初学者到电子工程师47220

(整理)从51初学者到电子工程师47220

Ⅰ前言& 51单片机最小系统一、前言我的帖子“合格的电子工程师需要掌握的知识和技能”在电子工程师论坛上发表后,点击的人数还行,这让我也小有了成就感一把。

也有人说这个帖子太空,是的,因为实际上这只是一个我对公司初级员工讲课的培训大纲;但是,初学者可以将这个大纲作为一个参照物,参照自己的知识是否全面。

很多电子工程师在某个方面精深钻研,成为某一个特殊领域的专家,从一开始的养家糊口、慢慢小有收益、最后宝马豪宅,也是有的;这些电子工程师可能没有全面掌握这些知识,因为这些行业用不上,例如,液晶显示器,很多行业就不需要;但是,对于一个初学者,我认为,这个提纲是切合实际的,对于面向控制而言,已经基本够用了;对于初学者,全面地掌握这些知识是很有必要的,因为你不知道今后需要使用什么哪些知识,而这些知识,80%以上你会在今后的工作中使用上,因为这是都是最基本的。

熟练掌握这些知识和应用,根据不同的地区、行业和老板,月薪应该可以在3000元~5000元之间,甚至更高。

其实,可能有些你用不上,但是知道了也没有坏处;所谓书到用时方很少,又有谓艺不压身。

知识=月薪=年薪=金钱=香车宝马=…….. ,呵呵。

为什么要掌握这些知识?实际上,电子工程师就是将一堆器件搭在一起,注入思想(程序),完成原来的这些器件分离时无法完成的功能,做成一个成品。

所需要的技能越高、功能越复杂、成本越低、市场上对相应的东东的需求越大,就越成功。

这就是电子工程师的自身的价值。

从成本到产品售出,之间的差价就是企业的追求。

作为企业的老板,是在市场上去寻找这样的应用;对电子工程师而言,是将老板提出的需求或者应用按照一定的构思原则(成本最低、可靠性最高、电路板最小、功能最强大等)在最短的时间内完成。

最短的时间,跟电子工程师的熟练程度、工作效率和工作时间直接有关。

这就是电子工程师的价值。

将电子产品抽象成一个硬件的模型,大约有以下组成:1) 输入2) 处理核心3) 输出输入基本上有以下的可能:1) 键盘2) 串行接口(RS232/485/can bus/以太网/USB)3) 开关量(TTL,电流环路,干接点)4) 模拟量(4~20ma、0~10ma、0~5V(平衡和非平衡信号))输出基本上有以下组成:1) 串行接口(RS232/485/can bus/以太网/USB)2) 开关量(TTL、电流环路、干接点、功率驱动)3) 模拟量(4~20ma,0~10ma,0~5V(平衡和非平衡信号))4) LED显示:发光管、八字5) 液晶显示器6) 蜂鸣器处理核心主要有:1) 8位单片机,主要就是51系列2) 32位arm单片机,主要有Atmel和三星系列51系列单片机现在看来,只能做一些简单的应用,说白了,这个芯片也就是做单一的一件事情,做多了,不如使用arm来做;还可以在arm上加一个操作系统,程序既可靠又容易编写。

三步教你从零开始成为单片机达人(附单片机实验经典详解)

三步教你从零开始成为单片机达人(附单片机实验经典详解)

三步教你从零开始成为单片机达人(附单片机实验经典详解)无论是作为一名业余的电子爱好者还是一名电子行业的相关从业人员,掌握单片机技术无疑可以使您如虎添翼,为您的电子小制作或者开发设计电子产品时打开方便的大门!学习单片机技术有一定的难度,不花费一番努力是很难学会的,但是只要不断努力就一定能成功,套用一句广告歌词:努力总有回报!学习单片机最好从51系列开始,第一是书多、资料多,而且掌握51技术的人多,碰到问题能请教的老师也就多了,51系列的实验芯片AT89C51价格低廉而且很容易买到,AT89C51芯片而且可以反复擦写1000次以上,对于初学者来说真是太合适了,就算以后考虑工业运用,也可以先学透51后再学其他类型的单片机,毕竟技术是相通的。

学习单片机的第一步是看书,单片机是一个知识密集的东东,不看书是绝对不行的,北京航空航天大学出版社出版了大量单片机方面的好书,你可以直接登录他们的网站进行邮购。

学习单片机的第二步是购买工具,单片机芯片必须借助编程器才能写入程序,站长用的编程器是一种性能较好的Genius NSP 通用编程器,通用编程器的特点是专为开发单片机和烧写各类存储器而设计的通用机型,它的编程可靠性高,支持的器件品种很多。

Genius NSP 通用编程器:4Opins万用锁紧插座。

适应绝大多数器件编程之所需。

使用适配器能够支持非DIP封装器件的编程。

RS232窜口通讯。

通讯波特率:57600bit/s9V/500mA电源转换器。

主要功能:EPROM、EEPROM、FLASH、MPU/CPU、PLD。

Serial EEPROM六大类器件的编程;RAM器件及CMOS/TTL器件的测试等等。

可选择的器件插入自动探测启动功能,即当您选择该功能并启动后,不再需要每次点击鼠标启动操作,每次当您更换芯片并锁紧万用插座后操作自动启动。

Genius NSP 可以在 WINDOS95、 98、me、2000、XP上运行。

单片机学习心得15篇

单片机学习心得15篇

单片机学习心得15篇单片机学习心得(一):1、学习单片机没有捷径,别指望两三天就学会,要坚持不懈,重在积累。

2、别崇拜高手,别相信天才,大部分人都不是天才(相信你也不是)!3、单片机是一门应用性和实践性很强的学科,要多动手,多做实验。

4、要学会参考别人的程序,减少自我琢磨的时间,迅速提高自我的编程潜力。

5、碰到问题能够借助网络来搜寻答案和对自我有帮忙的问题,能够大大减少你的开发时间。

6、要多交一些朋友,多交流。

技术是靠不断的积累和交流才会提高的,封闭自守只会更加落后。

单片机学习心得(二):首先,学习单片机要有必须的基础:电子技术方面要有数字电路和模拟电路等方面的理论基础,个性是数字电路;编程语言要求汇编语言或C语言。

要想成为单片机高手,推荐初学者首先学习汇编语言,学的差不多的时候,转入C语言学习。

尽管汇编语言属于低级语言,编程效率低,可是较C语言具有目标代码简短,占用内存少,执行速度快等优点,更重要的是能使初学者尽快熟悉单片机的内部结构,并能对其进行精确的控制。

汇编语言在单片机教材里面都会涉及,不需要单独购买教材和学习。

C语言是一门学问,有很多专业书籍来讲解,并且对我们今后的编程生涯有绝对的好处,所以要深入学习,千万不要自以为看了某某的视频教程就以为掌握了C语言,那只是C语言的一部分。

在那里给大家推荐一本单片机C语言程序设计参考书,马忠梅等著,北京航空航天大学出版社出版的《单片机的C语言应用程序设计》,要求C语言基础。

如果没学过C语言,推荐学习清华大学谭浩强编写的C语言程序设计,这本书写的不错,通俗易懂。

其次,是单片机教材选取。

单片机是一门十分重视实践的技术,不能总是看书,但要学习它首先应看书,对单片机引脚、内部结构、寄存器和原理有必须地了解和感官认识,它的是怎样工作的,能干些什么?刚开始时,也许你看不明白,但这并不要紧,因为你还缺乏实践经验。

此刻单片机应用广泛,所以各个厂家分别推出了自我的单片机,按内部结构体系派系分:51系列、PIC系列、AVR系列、摩托罗拉等等……我们没必要每样都学!因为他们的编程方法和调试过程以及内部指令结构有必须的相似,只要学精通一款就OK了!尤其是用C语言编程,就几乎不用分什么派系,可是我们要选取一款有代表性的知识范围广,并且入门容易,书籍多。

第2章 如何成为单片机系统工程师

第2章 如何成为单片机系统工程师
2.3.2 单片机的控制
我们把发光二极管D1的负极连接在 单片机的P0.4口(35管脚)上,电 阻R1起到限流的作用。根据器件的 连接关系分析知道:当单片机的 P0.4口输出低电平时(接地),发 光二极管D1正、负极之间获得电压 而被点亮;当P0.4口输出高电平时 (+5V),发光二极管D1则熄灭。 所以要实现图2-17所示的功能,即 让发光二极管以500ms为间隔闪烁 ,变成了让单片机的P0.4口以 500ms为间隔输出高、低电平。
第2章 如何成为单片机系统设计师
2.3.1 发光二极管工作原理
发光二极管(LED,电路符 号 )是一种最常用的指示 器件,近几年因其成本下降 和节能的特点大量使用在照 明设备中。发光二极管有极 性之分,当有足够的正向电 流(正极流向负极的电流, 约10mA~30mA)通过时便 会发光。
第2章 如何成为单片机系统设计师
第2章 如何成为单片机系统设计师
2.1.3 硬件工具之一:面包板
面包板的表面有规则排列的 供插装元器件的插孔,在面 包板中间有一条中心分隔槽 把它分成上、下两个部分。 上半部分每列5个插孔之间是 导通的,下半部分每列5个插 孔之间也是导通的。而上、 下部分插孔之间不导通。
第2章 如何成为单片机系统设计师
电路原理图可生成印刷电路 板图。把印刷电路板图交给 电路板生产厂家就可以把印 刷电路板加工出来。电子产 品的电路板已经具备工作的 基本条件了。
第2章 如何成为单片机系统设计师
2.1.5 焊接工具
第2章 如何成为单片机系统设计师
2.1.6 焊接方法
插元器件入过孔,焊接元器 件管脚与焊盘。
第2章 如何成为单片机系统设计师
第2章 如何成为单片机系统设计师
2.2.1 需求分析

从入门到大神,学习单片机的八个步骤介绍

从入门到大神,学习单片机的八个步骤介绍

从入门到大神,学习单片机的八个步骤介绍任何一款单片机,其实学习步骤都是一样的,不管是8位的入门芯片,还是32位的高速芯片。

以下步骤是必须的,按部就班的学完了,你不成大神你来找我。

第一步:数字I/O的使用使用按键输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,同时还学会了寄存器的操作方式。

例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。

每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。

要注意的是两个功能使用同一组I/O口,比如LCD和LED数据端口在好多例程里都是共用一组端口,如果两者结合,会有冲突,达不到预期的效果,或者在现在LCD的同时LED也在乱跳,这是目前大开发板采用的方式,建议不同的模块使用不同的IO口。

第二步:定时器的使用学会定时器的使用,就可以写出更高效的程序,别人的程序跑完一遍需要100ms,加入定时器后,你的程序跑完一遍可能只要10ms,在工业、家用电气设备的控制中也有很多应用。

真正会写程序的人必然是用定时器的高手。

例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。

数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。

定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。

第三步:中断单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事。

单片机入门指南 从零开始学习单片机

单片机入门指南 从零开始学习单片机

单片机入门指南从零开始学习单片机单片机(Microcontroller)作为一种在嵌入式系统中广泛使用的微型计算机,拥有广泛的应用领域。

对于初学者来说,学习和掌握单片机的基础知识至关重要。

本篇文章将从零开始介绍单片机的入门知识,帮助读者系统地学习单片机。

一、简介单片机是一种集成了处理器核心、存储器、输入输出接口、定时器和其他相关模块的微型计算机系统。

它以其体积小、功耗低、成本低等优势,在嵌入式系统领域得到了广泛应用。

学习单片机需要掌握基本的电子知识、C语言等。

二、准备工作要学习单片机,首先需要准备一台可编程的单片机开发板,如常见的51单片机开发板、Arduino开发板等。

同时,还需要下载并安装开发板所需的集成开发环境(IDE),如Keil、Arduino IDE等。

三、基本原理1. 单片机的结构:单片机由中央处理器(CPU)、存储器、输入输出(I/O)口、定时器、串口等组成。

掌握这些基本组成部分的工作原理是学习单片机的关键。

2. GPIO口:通用输入输出口(GPIO)是单片机与外部世界通信的接口,可以通过编程控制来实现不同的功能,如输入、输出、中断等。

3. 定时器和计数器:定时器和计数器是单片机中常用的模块,可以用于延时、定时、脉冲计数等应用。

熟悉定时器和计数器的使用是学习单片机的重要一步。

四、编程语言在学习单片机时,常用的编程语言是C语言。

C语言具有简洁、高效的特点,对于单片机的程序设计非常适用。

学习C语言语法和相关的编程技巧是学习单片机的基础。

五、入门实例为了更好地理解和掌握单片机的基础知识,以下是一个简单的LED 灯闪烁程序的实例:```c#include <reg51.h>#define LED P0void delay(unsigned int time) // 延时函数{unsigned int i, j;for(i = time; i > 0; i--)for(j = 120; j > 0; j--);}void main(){while(1){LED = 0xFF; // 打开LED灯delay(500); // 延时500msLED = 0x00; // 关闭LED灯delay(500); // 延时500ms}}```通过以上简单的程序,可以实现LED灯的闪烁。

从单片机初学者迈向单片机工程师第一章

从单片机初学者迈向单片机工程师第一章

从单片机初学者迈向单片机工程师第二版之第一章----究竟该如何学习By : 蒋晨辉(网名:红金龙吸味)Mail: power_mcu@Blog:/power_mcu走进图书城,面对整排的单片机类技术书籍,看着一个个陌生的单片机型号,你是否茫然不知如何选择?就单片机内核体系结构而言,有51单片机,AVR单片机,PIC单片机,MSP430单片机, ARM系列内核等等。

除了这些广为人知的之外,还有很多兼容上述某些内核体系的单片机。

选择何种单片机作为入门学习的对象,往往成为困扰初学者最大的问题。

我们可能道听途说,某某型号的单片机功能很丰富,某某型号的单片机市场使用量大,某某型号单片机抗干扰强。

这些信息都可能导致先入为主的观念,对初学者选择单片机型号进行学习产生影响。

是否有必要把这些单片机都学习一遍,才能信心满满的去面对工作中的挑战?答案是否定的。

单片机的学习并不能拘泥于某一体系的具体某种型号的单片机。

而是通过某一种单片机的学习,掌握单片机程序设计的思想。

从而在后续的开发工作中,以不变应万变。

如果掌握了具体的程序设计思想,学习一种新的单片机只是需要了解其相应的寄存器设置即可。

对于底层硬件驱动程序以及上层应用程序的编写均可以套用以前学习过的思想。

这样无论未来工作中接触到何种单片机,均可以在很快的时间内上手掌握。

只有达到了这样的地步,方能真正称之为掌握了单片机。

对于编程语言的选择,也是困扰初学者的一个大问题。

君不见,电子专业论坛上面,每每时隔不久就会冒出“单片机编程到底是选择汇编语言还是C语言?”之类的帖子。

而且这些帖子一旦出现就会成为众生争论之地,但除了一番口水战,最终无法给出一个确切的定论。

汇编语言由于是直接操作硬件,在对时序要求精确以及代码精简和讲究极端效率的地方可以派上大大的用场。

但是这也并不是表明用汇编语言编写出来的程序就一定是最优的程序。

程序的优与否取决于程序编写者的实际能力,优秀的程序员才能编写出高质量的代码。

“从单片机初学者迈向单片机工程师”之LED主题讨论

“从单片机初学者迈向单片机工程师”之LED主题讨论

【转】“从单片机初学者迈向单片机工程师”之LED主题讨论周第三章----模块化编程初识2010-06-13 11:12转载自迪克斯达最终编辑awanda好的开始是成功的一半通过上一章的学习,我想你已经掌握了如何在程序中释放CPU了。

希望能够继续坚持下去。

一个良好的开始是成功的一半。

我们今天所做的一切都是为了在单片机编程上做的更好。

在谈论今天的主题之前,先说下我以前的一些经历。

在刚开始接触到C语言程序的时候,由于学习内容所限,写的程序都不是很大,一般也就几百行而矣。

所以所有的程序都完成在一个源文件里面。

记得那时候大一参加学校里的一个电子设计大赛,调试了一个多星期,所有程序加起来大概将近1000行,长长的一个文件,从上浏览下来都要好半天。

出了错误简单的语法错误还好定位,其它一些错误,往往找半天才找的到。

那个时候开始知道了模块化编程这个东西,也尝试着开始把程序分模块编写。

最开始是把相同功能的一些函数(譬如1602液晶的驱动)全部写在一个头文件(.h)文件里面,然后需要调用的地方包含进去,但是很快发现这种方法有其局限性,很容易犯重复包含的错误。

而且调用起来也很不方便。

很快暑假的电子设计大赛来临了,学校对我们的单片机软件编程进行了一些培训。

由于学校历年来参加国赛和省赛,因此积累了一定数量的驱动模块,那些日子,老师每天都会布置一定量的任务,让我们用这些模块组合起来,完成一定功能。

而正是那些日子模块化编程的培训,使我对于模块化编程有了更进一步的认识。

并且程序规范也开始慢慢注意起来。

此后的日子,无论程序的大小,均采用模块化编程的方式去编写。

很长一段时间以来,一直有单片机爱好者在QQ上和我一起交流。

有时候,他们会发过来一些有问题的程序源文件,让我帮忙修改一下。

同样是长长的一个文件,而且命名极不规范,从头看下来,着实是痛苦,说实话,还真不如我重新给他们写一个更快一些,此话到不假,因为手头积累了一定量的模块,在完成一个新的系统时候,只需要根据上层功能需求,在底层模块的支持下,可以很快方便的完成。

单片机牛人吴鉴鹰:谁才是真正的工程师?

单片机牛人吴鉴鹰:谁才是真正的工程师?

单片机牛人吴鉴鹰:谁才是真正的工程师?吴鉴鹰在论坛连载的吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的实战项目引起很大的反响,我相信很多人对这位达人十分感兴趣,本期社区达人,咱就来了解了解吴鉴鹰对学习、对工作的态度。

下面开始电子发烧友论坛对吴鉴鹰的采访:1.电子发烧友:在论坛上你发表的单片机项目实战详解的连载贴引起很大的关注,大家都比较想了解您个人学习的历程与感想,与大家分享一下吧吴鉴鹰:在本科期间,就积极参与校园的各项活动,那时我对电子的感情用“痴迷”两个字来形容绝不为过,参加学校组织的各项比赛,在本科生期间,获得全省的电子设计大赛一等奖,飞思卡尔比赛二等奖。

利于业余时间申请并获得专利10余项。

那时候我们学校有一个电子协会,电子科技协会周末还常组织我们给学校里的同学做电器“义务维修”,当时我还以为义务维修是全免费的,后来才知道还是要赢利的……当时真的很不解,为什么学生还要赚学生的钱?虽然维修的费用比外面维修店要便宜很多,但心里还是着实不舒服了很长时间……那是这个社团第一次给我很不好的感觉……义务维修的过程中我学到了很多东西,维修一样以前没有接触过的东西,就迫使着自己要去最短时间内去学习相关的知识,而且还能从实际产品中学到很多成熟的产品设计技巧,更了解到导致一个产品结束使命的往往是设计上的很小的缺陷。

另外,帮同学修东西的过程中能感受到很丰富的情感,也许一个很简单很破旧的随身听身后藏着一段什么样的美好回忆。

也许将来我的设计也能带给使用他的人这样或那样的美好回忆……这些东西在后来的研究生学习和今后的工作中还是有一定的帮助的。

2.电子发烧友:您对那些想学好单片机技术童鞋,有什么建议?吴鉴鹰:我凭借自己多年的项目经验,给几点自己的建议:首先,单片机应的学习该有一定的基础:电子技术方面要有数字电路和模拟电路等方面的理论基础,特别是模拟电路;编程语言要求汇编语言或C语言,有很多工程师不建议学习汇编语言,我个人觉得学习汇编语言是很有必要的,学习汇编能让你更好的理解单片机内部的硬件。

从单片机初学者迈向单片机工程师完整

从单片机初学者迈向单片机工程师完整

从单片机初学者迈向单片机工程师完整今天讲个技巧方面的知识:一个有关0.0625℃的运算想到的咨询题碰到一哥们号称挺NB的嵌入软件工程师,看了他的代码后就欧拉,情况是在一个只有4K代码的单片机接2个DS18B20测温传感器,都明白DS18B20输出数据只要乘以0.0625确实是测量的温度值,这哥们讲程序空间如何也不够,实际上程序只有简单的采集两个DS18B20的数据转换成温度值,之后在1602液晶上显示,挺简单个程序,如何也想不通什么缘故程序空间不够。

只读了一下代码发觉程序就没动脑子,确有用浮点库把DS18B20数据直截了当乘以0.0625了,那程序不超才怪呢,略微动动脑子也会明白0.0625不确实是1/16吗,把DS18B20的数据直截了当右移4位不确实是了(因此要注意符号),这右移程序可十分简单还省空间,咨询题专门好解决,空间自然也就够了。

现在想来嵌入处理器确实是进步了,程序空间是越来越大,数据RAM空间也越来越大,导致专门多人在写程序的时候确实是什么都不顾,借着C语言的灵活性真是纵横驰骋,压根也不讲个程序效率和可靠性。

正如前些生活见到一小孩用ARM cortex-m3处理器给人接活写个便携表的1024点FFT算法,本身12位的AD系统,这小家伙直截了当到网上下载了浮点的FFT算法代码就给人加上了,结果整个程序死慢死慢的,人家用户可不买单啊,这时要动动脑子把数据直截了当变成乘以某个数变成整数后用定点FFT处理,之后再把数据除一下不就行了。

速度自然也快了,而且也能省下空间。

实际当中我们做嵌入软件专门多时候犯懒都忽视程序执行效率咨询题,是都能实现功能,但有时候确实是没法谈性能。

我几次碰到如此的工程师,直截了当把传感器的信号放大后进嵌入处理器的AD,也不看看AD数据是否稳固有效,直截了当就进行FFT运算,那FFT结果真是喧闹,不难看出混叠专门严峻,因此又机械地在FFT基础上再去衍生算法,系统程序越做越大,速度越做越慢。

单片机按键去抖原理

单片机按键去抖原理

3楼
要不硬件上消下抖,加个电容?
为什么某个IO状态翻转呢?为什么不像电脑 一样,有kbhit这样 的判断存在,我们可以在有键按下 时锁住所按 键的扫描码吧,当然视 你要完成的功能而定 这样 的话,由于所按的 键已锁存,后面的中 断判断的就是有 无按键了,调节好其判 断条件如 时间 什么的,就像电 脑设置了按键响应速度一样,这样可以解决吧。
它们和我们的单片机系统的I/O口连接一般如下:
对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。简单分析一下按键检测的原理。当按键没有按下的时候,单片机 I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电 平的时候,其值为0(低电平) 。这样,按键的按下与
否,就和与该按键相连的I/O的电平的变化相对应起来。结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而 做出相应的响应。一切看起来很美好,是这样的吗?
◎现实并非理想 在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。我们的结论是基 于理想的情况得出来的,就如同下面这幅按键按下时候对应电平变化的波形图一样:
讨论下吧!
C语言也能 写图形的俄 罗斯方 块?!! TOP
发表于 2010-5-12 23:58 | 只看该作者
4楼
硬件上可以用电容消抖,并接一个104即可 ,如果还想要更好的效果,可以用74HC14对波形整形。我见过的按键除了上述的硬件处 理之外,软件上面同样要消抖,因为是用在工业环境里,什么情况都有可能出现。 “我们可以在有 键按下时锁住所按 键的扫描码吧,当然视你要完成的功能而定 这样的话,由于所按的 键已锁存,后面的中 断判断的就 是有 无按键了,调节好其判 断条件如 时间 什么的,就像电脑设 置了按 键响应 速度一 样,这样 可以解 决吧。” 呵呵,想法太简单。 按键处 理也要分情 况,对于很重要的,一般接中 断,剩下的应用级的,在主循 环中循环检测 即可。 比较好的做好是,开辟一个环形缓冲。确定按键按下,丢到缓冲区,任务根据当前状态取键值,作处理。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这个我从eehome贴过来的。

写的非常的好。

我们用学单片机不要停在演示的基础上。

只能让单片机完成局部事。

这样我们永远不会走出流水灯地狱!!!学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。

也感谢一线工人提供了这个机会。

希望大家有什么好的想法和建议都直接跟帖说出来。

毕竟只有交流才能够碰撞出火花来^_^。

“卖弄”也好,“吹嘘”也罢,我只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经验的地方写出来,权当是我对自己的一个总结吧。

而作为看官的你,如果看到了我的错误,还请一定指正,这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。

姑妄言之,姑妄听之。

如果有啥好的想法和建议一定要说出来。

几年前,和众多初学者一样,我接触到了单片机,立刻被其神奇的功能所吸引,从此不能自拔。

很多个日夜就这样陪伴着它度过了。

期间也遇到过非常多的问题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。

经常混迹于论坛里,也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。

很多时候,都想写一点什么东西出来,希望对广大的初学者有一点点帮助。

但总是不知从何处写起。

今天借一线工人的台,唱一唱我的戏一路学习过来的过程中,帮助最大之一无疑来自于网络了。

很多时候,通过网络,我们都可以获取到所需要的学习资料。

但是,随着我们学习的深入,我们会慢慢发现,网络提供的东西是有限度的,好像大部分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想更进一步提高时,却发现能够获取到的资料越来越少,相信各位也会有同感,铺天盖地的单片机资料中大部分不是流水灯就是LED,液晶,而且也只是仅仅作功能性的演示。

于是有些人选择了放弃,或者是转移到其他兴趣上面去了,而只有少部分人选择了继续摸索下去,结合市面上的书籍,然后在网络上锲而不舍的搜集资料,再从牛人的只言片语中去体会,不断动手实践,慢慢的,也摸索出来了自己的一条路子。

当然这个过程必然是艰辛的,而他学会了之后也不会在网络上轻易分享自己的学习成果。

如此恶性循环下去,也就不难理解为什么初级的学习资料满天飞,而深入一点的学习资料却很少的原因了。

相较于其他领域,单片机技术的封锁更加容易。

尽管已经问世了很多年了,有价值的资料还是相当的欠缺,大部分的资料都是止于入门阶段或者是简单的演示实验。

但是在实际工程应用中却是另外一回事。

有能力的高手无暇或者是不愿公开自己的学习经验。

很多时候,我也很困惑,看到国外爱好者毫不保留的在网络上发布自己的作品,我忽然感觉到一丝丝的悲哀。

也许,我们真的该转变一下思路了,帮助别人,其实也是在帮助自己。

啰啰嗦嗦的说了这么多,相信大家能够明白说的是什么意思。

在接下来的一段日子里,我将会结合电子工程师之家举办的主题周活动写一点自己的想法。

尽可能从实用的角度去讲述。

希望能够帮助更多的初学者更上一层楼。

而关于这个主题周的最大主题我想了这样的一个名字“从单片机初学者迈向单片机工程师”。

名字挺大挺响亮,给我的压力也挺大的,但我会努力,争取使这样的一系列文章能够带给大家一点帮助,而不是看后大跌眼镜。

这样的一系列文章主要的对象是初学者,以及想从初学者更进一步提高的读者。

而至于老手,以及那些牛XX的人,希望能够给我们这些初学者更多的一些指点哈~@_@我们首先来看第一章节从这一章开始,我们开始迈入单片机的世界。

在我们开始这一章具体的学习之前,有必要给大家先说明一下。

在以后的系列文章中,我们将以51内核的单片机为载体,C语言为编程语言,开发环境为KEIL u v3。

至于为什么选用C语言开发,好处不言而喻,开发速度快,效率高,代码可复用率高,结构清晰,尤其是在大型的程序中,而且随着编译器的不断升级,其编译后的代码大小与汇编语言的差距越来越小。

而关于C语言和汇编之争,就像那个啥,每隔一段时间总会有人挑起这个话题,如果你感兴趣,可以到网上搜索相关的帖子自行阅读。

不是说汇编不重要,在很多对时序要求非常高的场合,需要利用汇编语言和C语言混合编程才能够满足系统的需求。

在我们学习掌握C语言的同时,也还需要利用闲余的时间去学习了解汇编语言。

1.从点亮LED(发光二极管)开始在市面上众多的单片机学习资料中,最基础的实验无疑于点亮LED了,即控制单片机的I/O的电平的变化。

如同如下实例代码一般void main(void){LedInit() ;While(1){LED = ON ;DelayMs(500) ;LED = OFF ;DelayMs(500) ;}}程序很简单,从它的结构可以看出,LED先点亮500MS,然后熄灭500MS,如此循环下去,形成的效果就是LED以1HZ的频率进行闪烁。

下面让我们分析上面的程序有没有什么问题。

看来看出,好像很正常的啊,能有什么问题呢?这个时候我们应该换一个思路去想了。

试想,整个程序除了控制LED = ON ; LED = OFF;这两条语句外,其余的时间,全消耗在了DelayMs(500)这两个函数上。

而在实际应用系统中是没有哪个系统只闪烁一只LED就其它什么事情都不做了的。

因此,在这里我们要想办法,把CPU解放出来,让它不要白白浪费500MS的延时等待时间。

宁可让它一遍又一遍的扫描看有哪些任务需要执行,也不要让它停留在某个地方空转消耗CPU时间。

从上面我们可以总结出(1) 无论什么时候我们都要以实际应用的角度去考虑程序的编写。

(2) 无论什么时候都不要让CPU白白浪费等待,尤其是延时(超过1MS)这样的地方。

下面让我们从另外一个角度来考虑如何点亮一颗LED。

先看看我们的硬件结构是什么样子的。

我手上的单片机板子是电子工程师之家的开发的学习板。

就以它的实际硬件连接图来分析吧。

如下(原文件名:led.jpg)引用图片一般的LED的正常发光电流为10~20MA而低电流LED的工作电流在2mA以下(亮度与普通发光管相同)。

在上图中我们可知,当Q1~Q8引脚上面的电平为低电平时,LED发光。

通过LED的电流约为(VC C - Vd)/ RA2 。

其中Vd为LED导通后的压降,约为1.7V左右。

这个导通压降根据LED颜色的不同,以及工作电流的大小的不同,会有一定的差别。

下面一些参数是网上有人测出来的,供大家参考。

红色的压降为1.82-1.88V,电流5-8mA,绿色的压降为1.75-1.82V,电流3-5mA,橙色的压降为1.7-1.8V,电流3-5mA兰色的压降为3.1-3.3V,电流8-10mA,白色的压降为3-3.2V,电流10-15mA,(供电电压5V,LED直径为5mm)74HC573真值表如下:(原文件名:74hc573.jpg)引用图片通过这个真值表我们可以看出。

当OutputEnable引脚接低电平的时候,并且LatchEnable引脚为高电平的时候,Q端电平与D端电平相同。

结合我们的LED硬件连接图可以知道LED_CS端为高电平时候,P0口电平的变化即Q端的电平的变化,进而引起LED的亮灭变化。

由于单片机的驱动能力有限,在此,74HC573的主要作用就是起一个输出驱动的作用。

需要注意的是,通过74HC573的最大电流是有限制的,否则可能会烧坏74HC573这个芯片。

上面这个图是从74HC573的DATASHEET中截取出来的,从上可以看出,每个引脚允许通过的最大电流为35mA 整个芯片允许通过的最大电流为75mA。

在我们设计相应的驱动电路时候,这些参数是相当重要的,而且是最容易被初学者所忽略的地方。

同时在设计的时候,要留出一定量的余量出来,不能说单个引脚允许通过的电流为35mA,你就设计为35mA,这个时候你应该把设计的上限值定在20mA左右才能保证能够稳定的工作。

(设计相应驱动电路时候,应该仔细阅读芯片的数据手册,了解每个引脚的驱动能力,以及整个芯片的驱动能力)了解了相应的硬件后,我们再来编写驱动程序。

首先定义LED的接口#define LED P0然后为亮灭常数定义一个宏,由硬件连接图可以,当P0输出为低电平时候LED亮,P0输出为高电平时,LED熄灭。

#define LED_ON() LED = 0x00 //所有LED亮#define LED_OFF() LED = 0xff //所有LED熄灭下面到了重点了,究竟该如何释放CPU,避免其做延时空等待这样的事情呢。

很简单,我们为系统产生一个1MS的时标。

假定LED需要亮500MS,熄灭500MS,那么我们可以对这个1MS的时标进行计数,当这个计数值达到500时候,清零该计数值,同时把LED的状态改变。

unsigned int g_u16LedTimeCount = 0 ; //LED计数器unsigned char g_u8LedState = 0 ; //LED状态标志, 0表示亮,1表示熄灭void LedProcess(void){if(0 == g_u8LedState) //如果LED的状态为亮,则点亮LED{LED_ON() ;}else //否则熄灭LED{LED_OFF() ;}}void LedStateChange(void){if(g_bSystemTime1Ms) //系统1MS时标到{g_bSystemTime1Ms = 0 ;g_u16LedTimeCount++ ; //LED计数器加一if(g_u16LedTimeCount >= 500) //计数达到500,即500MS到了,改变LED的状态。

{g_u16LedTimeCount = 0 ;g_u8LedState = ! g_u8LedState ;}}}上面有一个变量没有提到,就是g_bSystemTime1Ms 。

这个变量可以定义为位变量或者是其它变量,在我们的定时器中断函数中对其置位,其它函数使用该变量后,应该对其复位(清0) 。

我们的主函数就可以写成如下形式(示意代码)void main(void){while(1){LedProcess() ;LedStateChange() ;}}因为LED的亮或者灭依赖于LED状态变量(g_u8LedState)的改变,而状态变量的改变,又依赖于LED计数器的计数值(g_u16LedTimeCount ,只有计数值达到一定后,状态变量才改变)所以,两个函数都没有堵塞CPU的地方。

让我们来从头到尾分析一遍整个程序的流程。

程序首先执行LedProcess() ;函数因为g_u8LedState 的初始值为0 (见定义,对于全局变量,在定义的时候最好给其一个确定的值)所以在函数LedStateChange()内部首先判断1MS的系统时标是否到了,如果没有到就直接退出函数,如果到了,就把时标清0以便下一个时标消息的到来,同时对LED计数器加一,然后再判断LED计数器是否到达我们预先想要的值500,如果没有,则退出函数,如果有,对计数器清0,以便下次重新计数,同时把LED状态变量取反,然后退出函数。

相关文档
最新文档