从单片机初学者迈向单片机工程师
从单片机初学者迈向单片机工程师(对初学者非常有用)
从单片机初学者迈向单片机工程师 目录: 一、LED 1 二、LED 主题讨论周第二章----学会释放 CPU................................................. 2 三、LED 识..............................................8 四、LED 灯................................................25 五、LED 28 六、KEY 主题讨论第一章按键程序编写的基础..................................... 37 主题讨论周第五章----多任务环境下的数码管编程设计................. 主题讨论周第四章----渐明渐暗的 主题讨论周第三章----模块化编程初 主题讨论周第一章----写在前面....................................................摸索出来了自己的一条路子。当然这 个过程必然是艰辛的,而他学会 了之后也不会在网络上轻易分享自己的学习成果。如此恶性循环下去,也 就不难理解为什幺初级的学习资 料满天飞,而深入一点的学习资料却很少的原因了。相较于其他领域,单 片机技术的封锁更加容易。尽管 已经问世了很多年了,有价值的资料还是相当的欠缺,大部分的资料都是 止于入门阶段或者是简单的演示 实验。但是在实际工程应用中却是另外一回事。有能力的高手无暇或者是 不愿公开自己的学习经验。 很多时候,我也很困惑,看到国外爱好者毫不保留的在网络上发布自己的 作品,我忽然感觉到一丝丝的 悲哀。也许,我们真的该转变一下思路了,帮助别人,其实也是在帮助自 己。啰啰嗦嗦的说了这幺多,相 信大家能够明白说的是什幺意思。在接下来的一段日子里,我将会结合电 子工程师之家举办的主题周活动 写一点自己的想法。尽可能从实用的角度去讲述。希望能够帮助更多的初
从技术员迈向工程师的历程 已读
学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。
也感谢一线工人提供了这个机会。
希望大家有什么好的想法和建议都直接跟帖说出来。
毕竟只有交流才能够碰撞出火花来^_^。
几年前,和众多初学者一样,我接触到了单片机,立刻被其神奇的功能所吸引,从此不能自拔。
很多个日夜就这样陪伴着它度过了。
期间也遇到过非常多的问题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。
经常混迹于论坛里,也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。
很多时候,都想写一点什么东西出来,希望对广大的初学者有一点点帮助。
但总是不知从何处写起。
只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经验的地方写出来,权当是我对自己的一个总结吧。
而作为看官的你,如果看到了我的错误,还请一定指正,这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。
要成为一名优秀的单片机开发工程师,最重要的素质是什么?单片机从开发到产品端有很多关键阶段。
首先,开发新产品需要了解市场需求和应用方面的技术,才能定IC的规格;IC规格定下来后才能进行IC设计;IC设计完成后要进行验证;验证完成后,要做演示版进行市场推广。
这些阶段都要求单片机工程师具备优良的素质。
首先他们要懂技术,并注意技术经验的长期积累。
比如定IC规格,这是决定IC成败的关键,规格定得好,IC才能做得好。
但IC规格不能关起门来自己定,一定要与市场和产品端相结合。
所以就要求工程师必须熟悉整机产品的整个研发和生产过程,要懂生产环节和产品的专业知识,懂IC内部的相关工艺和IC设计。
因此,要完全掌握这项技术至少需要十年的经验积累,并且要一直做到工程主管的职位,才有可能完成。
因此这种人才在任何一家公司都非常宝贵,大概只有2%的人能做。
从单片机初学者迈向单片机工程师
这个我从eehome贴过来的。
写的非常的好。
我们用学单片机不要停在演示的基础上。
只能让单片机完成局部事。
这样我们永远不会走出流水灯地狱!!!学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。
也感谢一线工人提供了这个机会。
希望大家有什么好的想法和建议都直接跟帖说出来。
毕竟只有交流才能够碰撞出火花来^_^。
“卖弄”也好,“吹嘘”也罢,我只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经验的地方写出来,权当是我对自己的一个总结吧。
而作为看官的你,如果看到了我的错误,还请一定指正,这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。
姑妄言之,姑妄听之。
如果有啥好的想法和建议一定要说出来。
几年前,和众多初学者一样,我接触到了单片机,立刻被其神奇的功能所吸引,从此不能自拔。
很多个日夜就这样陪伴着它度过了。
期间也遇到过非常多的问题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。
经常混迹于论坛里,也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。
很多时候,都想写一点什么东西出来,希望对广大的初学者有一点点帮助。
但总是不知从何处写起。
今天借一线工人的台,唱一唱我的戏一路学习过来的过程中,帮助最大之一无疑来自于网络了。
很多时候,通过网络,我们都可以获取到所需要的学习资料。
但是,随着我们学习的深入,我们会慢慢发现,网络提供的东西是有限度的,好像大部分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想更进一步提高时,却发现能够获取到的资料越来越少,相信各位也会有同感,铺天盖地的单片机资料中大部分不是流水灯就是LED,液晶,而且也只是仅仅作功能性的演示。
于是有些人选择了放弃,或者是转移到其他兴趣上面去了,而只有少部分人选择了继续摸索下去,结合市面上的书籍,然后在网络上锲而不舍的搜集资料,再从牛人的只言片语中去体会,不断动手实践,慢慢的,也摸索出来了自己的一条路子。
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系列开始,第一是书多、资料多,而且掌握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上运行。
从入门到大神,学习单片机的八个步骤介绍
从入门到大神,学习单片机的八个步骤介绍任何一款单片机,其实学习步骤都是一样的,不管是8位的入门芯片,还是32位的高速芯片。
以下步骤是必须的,按部就班的学完了,你不成大神你来找我。
第一步:数字I/O的使用使用按键输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,同时还学会了寄存器的操作方式。
例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。
每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。
要注意的是两个功能使用同一组I/O口,比如LCD和LED数据端口在好多例程里都是共用一组端口,如果两者结合,会有冲突,达不到预期的效果,或者在现在LCD的同时LED也在乱跳,这是目前大开发板采用的方式,建议不同的模块使用不同的IO口。
第二步:定时器的使用学会定时器的使用,就可以写出更高效的程序,别人的程序跑完一遍需要100ms,加入定时器后,你的程序跑完一遍可能只要10ms,在工业、家用电气设备的控制中也有很多应用。
真正会写程序的人必然是用定时器的高手。
例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。
数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。
定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。
第三步:中断单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事。
从单片机初学者迈向单片机工程师第一章
从单片机初学者迈向单片机工程师第二版之第一章----究竟该如何学习By : 蒋晨辉(网名:红金龙吸味)Mail: power_mcu@Blog:/power_mcu走进图书城,面对整排的单片机类技术书籍,看着一个个陌生的单片机型号,你是否茫然不知如何选择?就单片机内核体系结构而言,有51单片机,AVR单片机,PIC单片机,MSP430单片机, ARM系列内核等等。
除了这些广为人知的之外,还有很多兼容上述某些内核体系的单片机。
选择何种单片机作为入门学习的对象,往往成为困扰初学者最大的问题。
我们可能道听途说,某某型号的单片机功能很丰富,某某型号的单片机市场使用量大,某某型号单片机抗干扰强。
这些信息都可能导致先入为主的观念,对初学者选择单片机型号进行学习产生影响。
是否有必要把这些单片机都学习一遍,才能信心满满的去面对工作中的挑战?答案是否定的。
单片机的学习并不能拘泥于某一体系的具体某种型号的单片机。
而是通过某一种单片机的学习,掌握单片机程序设计的思想。
从而在后续的开发工作中,以不变应万变。
如果掌握了具体的程序设计思想,学习一种新的单片机只是需要了解其相应的寄存器设置即可。
对于底层硬件驱动程序以及上层应用程序的编写均可以套用以前学习过的思想。
这样无论未来工作中接触到何种单片机,均可以在很快的时间内上手掌握。
只有达到了这样的地步,方能真正称之为掌握了单片机。
对于编程语言的选择,也是困扰初学者的一个大问题。
君不见,电子专业论坛上面,每每时隔不久就会冒出“单片机编程到底是选择汇编语言还是C语言?”之类的帖子。
而且这些帖子一旦出现就会成为众生争论之地,但除了一番口水战,最终无法给出一个确切的定论。
汇编语言由于是直接操作硬件,在对时序要求精确以及代码精简和讲究极端效率的地方可以派上大大的用场。
但是这也并不是表明用汇编语言编写出来的程序就一定是最优的程序。
程序的优与否取决于程序编写者的实际能力,优秀的程序员才能编写出高质量的代码。
单片机学习心得10篇完整版
《单片机学习心得》单片机学习心得(一):单片机学习心得体会我从大二起,就去实验室去学习。
在那里与老师和一些电子设计爱好者的交流中,我学到了更多的专业知识。
我从此走上了学习嵌入式的道路。
这丰富了我的大学生活,是我在大学的最大收获。
我是从学习单片机开始我的嵌入式学习的。
我接触单片机的方式是在图书馆看书,我看了很多本书,但是大多数书写的大同小异。
书里面讲解的单片机的寄存器我看了很多遍也没有看懂。
我都不明白改怎样学习它了。
慢慢的我悟出了一个道理:电子的学习实践是最重要的,这样,我在大二的时候就买了一块学习板,我一边看视频一边仿照视频的程序,自己编写程序,在很短的时间里,我的单片机有了很大的提高。
那些难懂的寄存器透过编写程序,我慢慢的弄懂了它们,此刻回头看去,原先它还是很简单的。
用哪种编程语言最适合我们。
我看过的单片机的书籍,大部分的程序都是汇编写的。
它是一种基于机器硬件的低级语言,对于我们这些只学习过C语言的人来说,十分难懂。
我认为刚开始学习单片机没有必要必须要从学习汇编编程开始。
我学习单片机就是用C语言编程的,我并不会汇编语言,也没有妨碍我把单片机学好。
我的单片机学习心得。
很多人说,学单片机最好先学汇编语言,以我的经验告诉大家,绝对没有这个必要,初学者一开始就直接用C语言为单片机编程,既省时间,学起来又容易,进步速度会很快。
在刚开始学单片机的时候,千万不要为了解单片机内部结构而浪费时间,这样只能打击你的信心,当你学会编程后,自然一步步就掌握其内部结构了。
单片机的学习实践。
单片机提高重在实践,想要学好单片机,软件编程必不可少。
但是熟悉硬件对于学好单片机的也是十分重要的。
如何学习好硬件,动手实践是必不可少的。
我们能够透过自己动手做一个自己的电子制作,透过完成它,以提高我的对一些芯片的了解和熟练运用它。
这样我们就能够多一些了解芯片的结构。
我相信,你完成了一个属于自己的电子制作,你的单片机水平就会有一个质的提高。
需要学什么内容单片机工程师
需要学什么内容单片机工程师
单片机工程师需要学习以下内容:
1. 单片机原理和体系结构:了解单片机的工作原理、硬件结构和寄存器等基本概念。
2. 编程语言:熟悉单片机常用的编程语言,如C语言和汇编
语言。
3. 嵌入式系统开发:掌握嵌入式系统开发的基本原理和方法,包括硬件和软件的设计与开发。
4. 电路基础:理解电路原理、模数转换、串行通信等基本电路知识。
5. 接口技术:了解并掌握常见的接口技术,如串口通信、SPI、I2C等。
6. 嵌入式系统调试与测试:熟悉常用的调试工具和方法,能够对嵌入式系统进行调试和测试。
7. 电源管理:了解电源管理的基本知识,包括电源选择、电压稳定器等。
8. 通信协议:了解并熟悉常用的通信协议,如CAN、Ethernet、USB等。
9. 仿真和调试工具使用:掌握常见的仿真和调试工具的使用方法。
10. 学习能力:由于单片机技术发展迅速,持续学习和更新知识是单片机工程师必备的能力。
以上是单片机工程师需要学习的内容,根据不同岗位的需求可能会有所差异。
“从单片机初学者迈向单片机工程师”之LED主题讨论
【转】“从单片机初学者迈向单片机工程师”之LED主题讨论周第三章----模块化编程初识2010-06-13 11:12转载自迪克斯达最终编辑awanda好的开始是成功的一半通过上一章的学习,我想你已经掌握了如何在程序中释放CPU了。
希望能够继续坚持下去。
一个良好的开始是成功的一半。
我们今天所做的一切都是为了在单片机编程上做的更好。
在谈论今天的主题之前,先说下我以前的一些经历。
在刚开始接触到C语言程序的时候,由于学习内容所限,写的程序都不是很大,一般也就几百行而矣。
所以所有的程序都完成在一个源文件里面。
记得那时候大一参加学校里的一个电子设计大赛,调试了一个多星期,所有程序加起来大概将近1000行,长长的一个文件,从上浏览下来都要好半天。
出了错误简单的语法错误还好定位,其它一些错误,往往找半天才找的到。
那个时候开始知道了模块化编程这个东西,也尝试着开始把程序分模块编写。
最开始是把相同功能的一些函数(譬如1602液晶的驱动)全部写在一个头文件(.h)文件里面,然后需要调用的地方包含进去,但是很快发现这种方法有其局限性,很容易犯重复包含的错误。
而且调用起来也很不方便。
很快暑假的电子设计大赛来临了,学校对我们的单片机软件编程进行了一些培训。
由于学校历年来参加国赛和省赛,因此积累了一定数量的驱动模块,那些日子,老师每天都会布置一定量的任务,让我们用这些模块组合起来,完成一定功能。
而正是那些日子模块化编程的培训,使我对于模块化编程有了更进一步的认识。
并且程序规范也开始慢慢注意起来。
此后的日子,无论程序的大小,均采用模块化编程的方式去编写。
很长一段时间以来,一直有单片机爱好者在QQ上和我一起交流。
有时候,他们会发过来一些有问题的程序源文件,让我帮忙修改一下。
同样是长长的一个文件,而且命名极不规范,从头看下来,着实是痛苦,说实话,还真不如我重新给他们写一个更快一些,此话到不假,因为手头积累了一定量的模块,在完成一个新的系统时候,只需要根据上层功能需求,在底层模块的支持下,可以很快方便的完成。
从单片机初学者迈向单片机工程师完整
从单片机初学者迈向单片机工程师完整今天讲个技巧方面的知识:一个有关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基础上再去衍生算法,系统程序越做越大,速度越做越慢。
一个老工程师给单片机初学者的几点建议
一个老工程师给单片机初学者的几点建议1、单片机种类不要贪多单片机生产厂家众多,种类繁多,例如PIC单片机就有多达500种型号!显然要把各种单片机都学会是不可能的,也是没有必要的。
实际上一个人会1~2种单片机(例如STC、AVR、STM32等)就足够了。
我们多年来做过100多个单片机项目,主要使用的不过就3种单片机。
对于初学者,建议就选一种单片机为主(当然,最基础的51单片机是必学的),把它学透、用精。
即使以后需要用到其它种类的单片机,,由于基础扎实很快也能学会,因为单片机功能毕竟都是大同小异的。
至于选用哪种单片机,最好请教有经验的老师或工程师。
2、学的精比学的多好有些学习板号称带有几G~几十G的“免费”学习资料,且不说这些海量资料是怎么来的,光把这些资料浏览一遍就够花上数月乃至上年的时间了。
看完之后还只是懂个大概,该不会的还是不会,时间长了还都忘光了。
倒不如踏踏实实静下心来,吃透每一个知识点,理解每一个细节。
本人学习C语言时仅仅利用一套实际产品的源码和一本C语言语法书,对每行程序都做彻底研究,不懂的语法就去查书(现在有网络就更方便了),顺藤摸瓜对每一个知识点都不放过。
学完这套源码后,我马上就会编写实用程序了。
这种学习方法的好处是把知识点放在实际应用场景中来学,不仅容易理解,而且学完就会用,效率极高。
3、按需学习单片机种类繁多,应用范围广泛,外围设备众多,要全部学会是不可能的。
当然如果你有大把的时间除外。
在实际工作中按需学习,这是一种高效率的学习方法,因为学了就用记得牢。
而且,一年级的工程师和三年级的工程师同时学习某个功能模块,显然是三年级的工程师要学得快。
(知行合一!)4、能力比知识重要在工作或学习过程中遇到技术难题,能不能运用所学的知识来快速解决问题,是工程师能力高低的一种体现。
这种能力与个人天赋有关,更需要后天的培养。
只要做到勤于实践、勤于思考、勤于积累,不放过每一个疑问或问题,你的能力将会不断获得提升。
单片机按键去抖原理
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对波形整形。我见过的按键除了上述的硬件处 理之外,软件上面同样要消抖,因为是用在工业环境里,什么情况都有可能出现。 “我们可以在有 键按下时锁住所按 键的扫描码吧,当然视你要完成的功能而定 这样的话,由于所按的 键已锁存,后面的中 断判断的就 是有 无按键了,调节好其判 断条件如 时间 什么的,就像电脑设 置了按 键响应 速度一 样,这样 可以解 决吧。” 呵呵,想法太简单。 按键处 理也要分情 况,对于很重要的,一般接中 断,剩下的应用级的,在主循 环中循环检测 即可。 比较好的做好是,开辟一个环形缓冲。确定按键按下,丢到缓冲区,任务根据当前状态取键值,作处理。
我的经历从一名产线工人到单片机工程师
我的经历从一名产线工人到单片机工程师第一篇:我的经历从一名产线工人到单片机工程师我的经历: 从一名产线工人到单片机工程师我是学电子信息的,本科。
当年毕业的时候,外企热得不得了,外企有先进的管理体制5s,有着现代化的电子设备,有着很高的福利。
那个时候,每个人都以进外企工作为荣,我也不例外。
不论是当年还是现在外企要的条件都很高,能进去都时间很不容易的事,我最终凭借出色的英语表达能力进了外企。
我的职位是设备工程师,薪水是税后1500,五险一金,公司提供午餐和班车。
这在一般人看来很一般,可是对于一贫如洗的我来说(我从小就是单亲,没见过钱),这个待遇已经可以让我蹦起来了。
上班了,我努里的工作着,积极地对待着我这来之不易的工作。
可到第5个月的时候,我发现不对劲了。
设备出现问题,无非是改改参数,换换零件。
有时,大家为了体现自己的价值争着按一个按钮。
有两个技术员,初中毕业,在干着和我一样的活,只是因为他们学历比我低,比我少拿600块钱。
模电和单片机根本就用不上的。
天啊,难道学历的价值就体现在这里?原来是个比马文。
御帝,如来,俺老孙让你们给骗了!!我本打算辞职,但想了想还是应该干到合同到期比较好,必定我们才签了1年合同,再忍几个月合同就到期了。
于是,干满一年,我辞职了。
辞职以后,我没有立即找工作,我在家温习了3个月的C语言,然后开始找电路设计的工作。
我经常遇到这样的答复:单位:“你干过开发吗?”我:“没有”单位:“你是应届吗?”我:“我毕业一年了”单位:“那我们不能要你,我们要有经验的或应届的。
你一样都不符合”我:“我压低薪水,可以吗”单位:“那也不行”难道毕业以后的第一份职业是一生的职业,难道真的无法逆转吗?最后我被一个公司录了。
职位是电子工程师。
和我去的还有两个刚毕业的,我们都没有经验。
那个公司连研发部都没有,里面一个懂电路的都没有,我们每天就在那里上网,打杂。
到第9个月我们都不干了,那两个人先在干了销售。
我没有气馁,继续寻找,然后找到了一个公司,职位是电路工程师。
第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 需求分析
单片机牛人吴鉴鹰:谁才是真正的工程师?
单片机牛人吴鉴鹰:谁才是真正的工程师?吴鉴鹰在论坛连载的吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的实战项目引起很大的反响,我相信很多人对这位达人十分感兴趣,本期社区达人,咱就来了解了解吴鉴鹰对学习、对工作的态度。
下面开始电子发烧友论坛对吴鉴鹰的采访:1.电子发烧友:在论坛上你发表的单片机项目实战详解的连载贴引起很大的关注,大家都比较想了解您个人学习的历程与感想,与大家分享一下吧吴鉴鹰:在本科期间,就积极参与校园的各项活动,那时我对电子的感情用“痴迷”两个字来形容绝不为过,参加学校组织的各项比赛,在本科生期间,获得全省的电子设计大赛一等奖,飞思卡尔比赛二等奖。
利于业余时间申请并获得专利10余项。
那时候我们学校有一个电子协会,电子科技协会周末还常组织我们给学校里的同学做电器“义务维修”,当时我还以为义务维修是全免费的,后来才知道还是要赢利的……当时真的很不解,为什么学生还要赚学生的钱?虽然维修的费用比外面维修店要便宜很多,但心里还是着实不舒服了很长时间……那是这个社团第一次给我很不好的感觉……义务维修的过程中我学到了很多东西,维修一样以前没有接触过的东西,就迫使着自己要去最短时间内去学习相关的知识,而且还能从实际产品中学到很多成熟的产品设计技巧,更了解到导致一个产品结束使命的往往是设计上的很小的缺陷。
另外,帮同学修东西的过程中能感受到很丰富的情感,也许一个很简单很破旧的随身听身后藏着一段什么样的美好回忆。
也许将来我的设计也能带给使用他的人这样或那样的美好回忆……这些东西在后来的研究生学习和今后的工作中还是有一定的帮助的。
2.电子发烧友:您对那些想学好单片机技术童鞋,有什么建议?吴鉴鹰:我凭借自己多年的项目经验,给几点自己的建议:首先,单片机应的学习该有一定的基础:电子技术方面要有数字电路和模拟电路等方面的理论基础,特别是模拟电路;编程语言要求汇编语言或C语言,有很多工程师不建议学习汇编语言,我个人觉得学习汇编语言是很有必要的,学习汇编能让你更好的理解单片机内部的硬件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这个我从eehome贴过来的。
写的非常的好。
我们用学单片机不要停在演示的基础上。
只能让单片机完成局部事。
这样我们永远不会走出流水灯地狱!!!学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。
也感谢一线工人提供了这个机会。
几年前,和众多初学者一样,我接触到了单片机,立刻被其神奇的功能所吸引,从此不能自拔。
很多个日夜就这样陪伴着它度过了。
期间也遇到过非常多的问题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。
经常混迹于论坛。
“卖弄”也好,“吹嘘”也罢,我只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经验的地方写出来,权当是我对自己的一个总结吧。
而作为看官的你,如果看到了我的错误,还请一定指正,这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。
姑妄言之,姑妄听之。
里,也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。
很多时候,都想写一点什么东西出来,希望对广大的初学者有一点点帮助。
但总是不知从何处写起。
今天借一线工人的台,唱一唱我的戏一路学习过来的过程中,帮助最大之一无疑来自于网络了。
很多时候,通过网络,我们都可以获取到所需要的学习资料。
但是,随着我们学习的深入,我们会慢慢发现,网络提供的东西是有限度的,好像大部分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想更进一步提高时,却发现能够获取到的资料越来越少,相信各位也会有同感,铺天盖地的单片机资料中大部分不是流水灯就是LED,液晶,而且也只是仅仅作功能性的演示。
于是有些人选择了放弃,或者是转移到其他兴趣上面去了,而只有少部分人选择了继续摸索下去,结合市面上的书籍,然后在网络上锲而不舍的搜集资料,再从牛人的只言片语中去体会,不断动手实践,慢慢的,也摸索出来了自己的一条路子。
当然这个过程必然是艰辛的,而他学会了之后也不会在网络上轻易分享自己的学习成果。
如此恶性循环下去,也就不难理解为什么初级的学习资料满天飞,而深入一点的学习资料却很少的原因了。
相较于其他领域,单片机技术的封锁更加容易。
尽管已经问世了很多年了,有价值的资料还是相当的欠缺,大部分的资料都是止于入门阶段或者是简单的演示实验。
但是在实际工程应用中却是另外一回事。
有能力的高手无暇或者是不愿公开自己的学习经验。
很多时候,我也很困惑,看到国外爱好者毫不保留的在网络上发布自己的作品,我忽然感觉到一丝丝的悲哀。
也许,我们真的该转变一下思路了,帮助别人,其实也是在帮助自己。
啰啰嗦嗦的说了这么多,相信大家能够明白说的是什么意思。
在接下来的一段日子里,我将会结合电子工程师之家举办的主题周活动写一点自己的想法。
尽可能从实用的角度去讲述。
希望能够帮助更多的初学者更上一层楼。
而关于这个主题周的最大主题我想了这样的一个名字“从单片机初学者迈向单片机工程师”。
名字挺大挺响亮,给我的压力也挺大的,但我会努力,争取使这样的一系列文章能够带给大家一点帮助,而不是看后大跌眼镜。
这样的一系列文章主要的对象是初学者,以及想从初学者更进一步提高的读者。
而至于老手,以及那些牛XX的人,希望能够给我们这些初学者更多的一些指点哈~@_@我们首先来看第一章节从这一章开始,我们开始迈入单片机的世界。
在我们开始这一章具体的学习之前,有必要给大家先说明一下。
在以后的系列文章中,我们将以51内核的单片机为载体,C语言为编程语言,开发环境为KEIL uv3。
至于为什么选用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的正常发光电流为10~20MA而低电流LED的工作电流在2mA以下(亮度与普通发光管相同)。
在上图中我们可知,当Q1~Q8引脚上面的电平为低电平时,LED 发光。
通过LED的电流约为(VCC - 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真值表如下:通过这个真值表我们可以看出。
当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 (见定义,对于全局变量,在定义的时候最好给其一个确定的值)所以LED被点亮,然后退出LedStateChange()函数,执行下一个函数LedStateChange()在函数LedStateChange()内部首先判断1MS的系统时标是否到了,如果没有到就直接退出函数,如果到了,就把时标清0以便下一个时标消息的到来,同时对LED计数器加一,然后再判断LED计数器是否到达我们预先想要的值500,如果没有,则退出函数,如果有,对计数器清0,以便下次重新计数,同时把LED状态变量取反,然后退出函数。