从单片机初学者迈向单片机工程师_完整.doc
从单片机初学者迈向单片机工程师(对初学者非常有用)
从单片机初学者迈向单片机工程师 目录: 一、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初学者到电子工程师 [2005-10-21]在搜索引擎上查找HC245芯片的资料时,无意中发现了这篇文章...就放到BLOG上,没事自己看看...别人也是转的,没写原作者,我以前写的的一些文章,虽然不怎么入流,但也到处乱转,根本没我的名现在对电路和硬件越来越感兴趣,估计这个项目做完后,我也是半个电子工程师了从51初学者到电子工程师 第一课从初学者到电子工程师一、前言我的帖子“合格的电子工程师需要掌握的知识和技能”在电子产品世界(/list.asp?boardid=11)和电子工程师论坛(/superbbs/list.asp?boardid=21)上发表后,点击的人数还行,这让我也小有了成就感一把。
也有人说这个帖子太空,是的,因为实际上这只是一个我对公司初级员工讲课的培训大纲;但是,初学者可以将这个大纲作为一个参照物,参照自己的知识是否全面。
很多电子工程师在某个方面精深钻研,成为某一个特殊领域的专家,从一开始的养家糊口、慢慢小有收益、最后宝马豪宅,也是有的;这些电子工程师可能没有全面掌握这些知识,因为这些行业用不上,例如,液晶显示器,很多行业就不需要;但是,对于一个初学者,我认为,这个提纲是切合实际的,对于面向控制而言,已经基本够用了;对于初学者,全面地掌握这些知识是很有必要的,因为你不知道今后需要使用什么哪些知识,而这些知识, 80%以上你会在今后的工作中使用上,因为这是都是最基本的。
熟练掌握这些知识和应用,根据不同的地区、行业和老板,月薪应该可以在3000元~5000元之间,甚至更高。
其实,可能有些你用不上,但是知道了也没有坏处;所谓书到用时方很少,又有谓艺不压身。
知识=月薪=年薪=金钱=香车宝马=…….. ,呵呵。
为什么要掌握这些知识?实际上,电子工程师就是将一堆器件搭在一起,注入思想(程序),完成原来的这些器件分离时无法完成的功能,做成一个成品。
所需要的技能越高、功能越复杂、成本越低、市场上对相应的东东的需求越大,就越成功。
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上运行。
第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)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。
定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。
第三步:中断单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事。
从单片机初学者迈向单片机工程师第一章
从单片机初学者迈向单片机工程师第二版之第一章----究竟该如何学习By : 蒋晨辉(网名:红金龙吸味)Mail: power_mcu@Blog:/power_mcu走进图书城,面对整排的单片机类技术书籍,看着一个个陌生的单片机型号,你是否茫然不知如何选择?就单片机内核体系结构而言,有51单片机,AVR单片机,PIC单片机,MSP430单片机, ARM系列内核等等。
除了这些广为人知的之外,还有很多兼容上述某些内核体系的单片机。
选择何种单片机作为入门学习的对象,往往成为困扰初学者最大的问题。
我们可能道听途说,某某型号的单片机功能很丰富,某某型号的单片机市场使用量大,某某型号单片机抗干扰强。
这些信息都可能导致先入为主的观念,对初学者选择单片机型号进行学习产生影响。
是否有必要把这些单片机都学习一遍,才能信心满满的去面对工作中的挑战?答案是否定的。
单片机的学习并不能拘泥于某一体系的具体某种型号的单片机。
而是通过某一种单片机的学习,掌握单片机程序设计的思想。
从而在后续的开发工作中,以不变应万变。
如果掌握了具体的程序设计思想,学习一种新的单片机只是需要了解其相应的寄存器设置即可。
对于底层硬件驱动程序以及上层应用程序的编写均可以套用以前学习过的思想。
这样无论未来工作中接触到何种单片机,均可以在很快的时间内上手掌握。
只有达到了这样的地步,方能真正称之为掌握了单片机。
对于编程语言的选择,也是困扰初学者的一个大问题。
君不见,电子专业论坛上面,每每时隔不久就会冒出“单片机编程到底是选择汇编语言还是C语言?”之类的帖子。
而且这些帖子一旦出现就会成为众生争论之地,但除了一番口水战,最终无法给出一个确切的定论。
汇编语言由于是直接操作硬件,在对时序要求精确以及代码精简和讲究极端效率的地方可以派上大大的用场。
但是这也并不是表明用汇编语言编写出来的程序就一定是最优的程序。
程序的优与否取决于程序编写者的实际能力,优秀的程序员才能编写出高质量的代码。
单片机按键处理技巧及编程方式
单片机按键处理技巧及编程方式2010-10-23 15:01从这一章开始,我们步入按键程序设计的殿堂。
在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。
输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。
在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。
我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。
◎按键检测的原理常见的独立按键的外观如下,相信大家并不陌生,各种常见的开发板学习板上随处可以看到他们的身影。
(原文件名:1.jpg)引用图片总共有四个引脚,一般情况下,处于同一边的两个引脚内部是连接在一起的,如何分辨两个引脚是否处在同一边呢?可以将按键翻转过来,处于同一边的两个引脚,有一条突起的线将他们连接一起,以标示它们俩是相连的。
如果无法观察得到,用数字万用表的二极管挡位检测一下即可。
搞清楚这点非常重要,对于我们画PCB的时候的封装很有益。
它们和我们的单片机系统的I/O口连接一般如下:(原文件名:2.jpg)引用图片对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。
简单分析一下按键检测的原理。
当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。
这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。
结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。
一切看起来很美好,是这样的吗?◎现实并非理想在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。
删繁就简-单片机入门到精通1-2
目录目录 (1)导 言 (4)第一章单片机基础 (5)1.1.什么是单片机 (5)1.2.单片机是如何工作的 (7)1.3.单片机与电脑的区别 (11)1.4.晶振 (13)1.5.系统时钟和周期 (14)1.6.单片机指令和汇编语言 (17)1.7.RAM/ROM的作用 (23)1.8.单片机接口 (25)1.9.接口驱动能力 (31)1.10.方便实用的中断 (31)1.11.函数和堆栈 (44)1.12.单片机PAGE/BANK概念 (47)1.13.CISC与RISC (49)1.14.为什么DSP跑得快 (51)1.15.单片机产品开发常见用语 (53)第二章单片机应用小技巧 (58)2.1.用IO模拟接口 (58)2.2.交流特性显神通 (63)2.3.电阻网络低成本高速AD (65)2.4.利用电容充放电测电阻 (66)2.5.晶振也能控制电源 (67)2.6.如何降低功耗 (68)2.7.开机请用NOP (68)2.8.查表与乘除法 (69)2.9.RAM动态装载程序 (69)2.10.程序也可被压缩 (76)2.11.累计误差 (79)2.12.让定时更准一些 (80)2.13.寄存器也可当RAM (82)2.14.清中断标志的位置 (84)2.15.键盘扫描 (84)2.16.视觉暂留 (87)2.17.让耳朵优先 (88)2.18.1000与1024 (89)2.19.PWM (90)第三章单片机高级特性 (92)3.1.Cache (93)3.2.总线 (102)3.3.DMA (111)3.4.存储器管理 (114)3.5.嵌入式与操作系统 (121)什么是嵌入式 (121)嵌入式误区之不死机 (127)嵌入式效率 (132)第四章单片机C语言 (134)4.1.单片机C语言 (134)4.2.for()和while()循环 (135)4.3.循环里的i++与i— (143)4.4.优化的方法与效果 (145)4.5.全局变量的风险 (148)4.6.变量类型与代码效率 (154)4.7.慎用int (157)4.8.危险的指针 (158)4.9.循环延时 (166)4.10.运算表达式 (170)4.11.溢出 (176)4.12.强制转换 (176)4.13.高效实用位运算 (179)4.14.宏和register (184)4.15.手机里的计算器 (193)4.16.函数设计 (200)4.17.某产品函数编写规则 (206)第五章问题分析与调试 (208)5.1.应该具备基本硬件能力 (208)5.2.将自己站在别人角度来思考问题 (211)5.3.先找自己原因再假定他人出错 (216)5.4.充分发掘IDE调试工具功能 (218)5.5.IDE调试工具也会导致错误发生 (227)5.6.没有IDE调试工具的测试 (227)5.7.C语言要多查看汇编代码 (229)5.8.养成查看寄存器内容的习惯 (232)5.9.中断的一些特殊情况 (233)5.10.别迷信文档与硬件 (237)5.11.程序暂停不代表所有模块暂停 (239)5.12.几种仪器好帮手 (239)5.13.多用电脑工具软件 (242)5.14.串口通讯不能使用隔离变压器分析实例 (246)5.15.Cache导致录音有杂音分析实例 (247)5.16.Cache导致RAM验证结果不对分析实例 (251)5.17.双口RAM读写竞争出错分析实例 (252)第六章实际产品开发 (256)6.1.如何开发一个产品 (256)6.2.学会看电气参数表 (258)6.3.接口的匹配 (265)6.4.电源和地的影响 (268)6.5.成本意识 (272)6.6.别烦流程图 (276)6.7.功能的全面与实用 (277)6.8.批量产品的替代方案 (280)6.9.多了解新器件 (281)6.10.尽可能让生产更方便 (284)6.11.误差分析 (287)6.12.电磁兼容 (290)6.13.上电与测试 (291)6.14.程序版本发放记录 (293)导 言本书的对象主要是希望从事单片机软件开发的人员,当然不是只限于这些人员才可以看,只要你有兴趣,哪怕你想成为一名炒菜的大师傅或者已经是大师傅,我一样欢迎你来阅读本书。
“从单片机初学者迈向单片机工程师”之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基础上再去衍生算法,系统程序越做越大,速度越做越慢。
单片机入门到精通
当然 Cache 的实现并不是简单的插入一块小容量高速存储器那么简单,是基于程序统计规律通 过一系列复杂控制技术才得以实现,而且它并不是万能的,同样存在缺陷,后面我们会详细讲述这 些细节。
逐渐增大情况就发生了变化,比如 i 为 1000 时,data_buf1[i]=i 的操作对 RAM 的操作跳转就会变
得比较大,按假定条件 i 和写 data_buf1[1000]在 RAM 中的位置间隔有 4000 字节,虽然这 4000 个
字节并不是特别大,但如果数组大小从 1024 变为 1024*1024 呢?间隔就会非常之大。
作者:Dai ShangJu
删繁就简-单片机入门到精通
for(i=0;i<1024;i++)
//需要读写 i
{
data_buf1[i]=i;
//顺序写数组 data_buf1[]的每一个成员
}
很明显循环体的代码量非常小,执行这段代码完全满足代码地址在一小段区域之内的要求,但
对数据的读写则有点不同,当 i 在 0 附近时,data_buf1[i]=i 的操作 RAM 地址间隔并不大,但当 i
删繁就简-单片机入门到精通
第三章 单片机高级特性
时至今日,单片机的技术已经发展到前所未有的地步,PC 流行大旗刚刚树起的九十年代,主频 终于突破 100MHz,简称 586 的奔腾一代开始用软解压向人们结结巴巴的演示多媒体的未来,就是 INTEL 自己也为这一进步激动不已,从此电视广告中“Beng Beng Beng Beng”的旋律成为 INTEL 的 象征。
从单片机初学者迈向单片机工程师_完整.doc
目录:KEY篇第一章----按键程序编写的基础KEY篇第二章----基于状态转移的独立按键程序设计LED篇第三章----模块化编程初识LED篇第四章----渐明渐暗的灯LED篇第五章----多任务环境下的数码管编程设计我们用学单片机不要停在演示的基础上。
只能让单片机完成局部事。
这样我们永远不会走出流水灯地狱!!!学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。
也感谢一线工人提供了这个机会。
希望大家有什么好的想法和建议都直接跟帖说出来。
毕竟只有交流才能够碰撞出火花来^_^。
几年前,和众多初学者一样,我接触到了单片机,立刻被其神奇的功能所吸引,从此不能自拔。
很多个日夜就这样陪伴着它度过了。
期间也遇到过非常多的问题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。
经常混迹于论坛里,也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。
很多时候,都想写一点什么东西出来,希望对广大的初学者有一点点帮助。
但总是不知从何处写起。
今天借一线工人的台,唱一唱我的戏。
“卖弄”也好,“吹嘘”也罢,我只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经验的地方写出来,权当是我对自己的一个总结吧。
而作为看官的你,如果看到了我的错误,还请一定指正,这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。
姑妄言之,姑妄听之。
如果有啥好的想法和建议一定要说出来。
一路学习过来的过程中,帮助最大之一无疑来自于网络了。
很多时候,通过网络,我们都可以获取到所需要的学习资料。
但是,随着我们学习的深入,我们会慢慢发现,网络提供的东西是有限度的,好像大部分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想更进一步提高时,却发现能够获取到的资料越来越少,相信各位也会有同感,铺天盖地的单片机资料中大部分不是流水灯就是LED,液晶,而且也只是仅仅作功能性的演示。
单片机循序渐进的学习过程
学习是一个循序渐进的过程,单片机的学习遵循同样的道理,是一个由简单到复杂,由表及里的过程。
本人结合自己七年来的单片机学习经验,结合项目谈谈自己对单片机学习的看法。
后续章节里将陆续谈谈自己在每一块学习的心得体会。
第一步:学习数字I/O的使用单片机的I/O端口使用相当于我们使用我们的右手一样频繁,可以不夸张的说,任何一个项目都离不开单片机I/O口的使用。
按键使用是I/O端口使用的经典用法,使用按键输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。
每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。
第二步:定时器的使用定时器之与单片机相当于我们日常生活中钟表之与我们一样重要,没有了钟表,我们的日常生活将变得一团糟。
单片机也是一样,他也有自己的时间参考器---定时器。
这个不仅可以决定单片机什么时间做什么事情,而且还可以控制每件事情的时间安排。
学会定时器的使用,就可以用单片机实现时序电路,时序电路的功能是强大的,在工业、家用电气设备的控制中有很多应用,例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。
数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。
定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。
第三步:中断学习举个简单的例子:你正在看电影,这时你的老师打电话给你,这时你就不得不先暂停看电影出去接电话,接完电话再回来,这就是中断。
单片机按键去抖原理
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录:KEY篇第一章----按键程序编写的基础KEY篇第二章----基于状态转移的独立按键程序设计LED篇第三章—模块化编程初识LED篇第四章----渐明渐暗的灯LED篇第五章----多任务环境下的数码管编程设计我们用学单片机不要停在演示的基础上。
只能让单片机完成局部事。
这样我们永远不会走出流水灯地狱!!!学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。
也感谢一线工人提供了这个机会。
希望大家有什么好的想法和建议都直接跟帖说出来。
毕竟只有交流才能够碰撞出火花来几年前,和众多初学者一样,我接触到了单片机,立刻被其神奇的功能所吸引,从此不能自拔。
很多个日夜就这样陪伴着它度过了。
期间也遇到过非常多的问题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。
经常混迹于论坛里,也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。
很多时候,都想写一点什么东西出来,希望对广大的初学者有一点点帮助。
但总是不知从何处写起。
今天借一线工人的台,唱一唱我的戏。
卖弄”也好,吹嘘”也罢,我只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经验的地方写出来,权当是我对自己的一个总结吧。
而作为看官的你,如果看到了我的错误,还请一定指正,这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。
姑妄言之,姑妄听之。
如果有啥好的想法和建议一定要说出来。
一路学习过来的过程中,帮助最大之一无疑来自于网络了。
很多时候,通过网络,我们都可以获取到所需要的学习资料。
但是,随着我们学习的深入,我们会慢慢发现,网络提供的东西是有限度的,好像大部分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想更进一步提高时,却发现能够获取到的资料越来越少,相信各位也会有同感,铺天盖地的单片机资料中大部分不是流水灯就是LED,液晶,而且也只是仅仅作功能性的演示。
于是有些人选择了放弃,或者是转移到其他兴趣上面去了,而只有少部分人选择了继续摸索下去,结合市面上的书籍,然后在网络上锲而不舍的搜集资料,再从牛人的只言片语中去体会,不断动手实践,慢慢的,也摸索出来了自己的一条路子。
当然这个过程必然是艰辛的,而他学会了之后也不会在网络上轻易分享自己的学习成果。
如此恶性循环下去,也就不难理解为什么初级的学习资料满天飞,而深入一点的学习资料却很少的原因了。
相较于其他领域,单片机技术的封锁更加容易。
尽管已经问世了很多年了,有价值的资料还是相当的欠缺,大部分的资料都是止于入门阶段或者是简单的演示实验。
但是在实际工程应用中却是另外一回事。
有能力的高手无暇或者是不愿公开自己的学习经验。
很多时候,我也很困惑,看到国外爱好者毫不保留的在网络上发布自己的作品,我忽然感觉到一丝丝的悲哀。
也许,我们真的该转变一下思路了,帮助别人,其实也是在帮助自己。
啰啰嗦嗦的说了这么多,相信大家能够明白说的是什么意思。
在接下来的一段日子里,我将会结合电子工程师之家举办的主题周活动写一点自己的想法。
尽可能从实用的角度去讲述。
希望能够帮助更多的初学者更上一层楼。
而关于这个主题周的最大主题我想了这样的一个名字从单片机初学者迈向单片机工程师”。
名字挺大挺响亮,给我的压力也挺大的,但我会努力,争取使这样的一系列文章能够带给大家一点帮助,而不是看后大跌眼镜。
这样的一系列文章主要的对象是初学者,以及想从初学者更进一步提高的读者。
而至于老手,以及那些牛XX 的人,希望能够给我们这些初学者更多的一些指点哈〜@_@我们首先来看第一章节从这一章开始,我们开始迈入单片机的世界。
在我们开始这一章具体的学习之前,有必要给大家先说明一下。
在以后的系列文章中,我们将以51内核的单片机为载体,C语言为编程语言,开发环境为KEIL uv3。
至于为什么选用C语言开发,好处不言而喻,开发速度快,效率高,代码可复用率高,结构清晰,尤其是在大型的程序中,而且随着编译器的不断升级,其编译后的代码大小与汇编语言的差距越来越小。
而关于C语言和汇编之争,就像那个啥,每隔一段时间总会有人挑起这个话题,如果你感兴趣,可以到网上搜索相关的帖子自行阅读。
不是说汇编不重要,在很多对时序要求非常高的场合,需要利用汇编语言和C语言混合编程才能够满足系统的需求。
在我们学习掌握C语言的同时,也还需要利用闲余的时间去学习了解汇编语言。
1.从点亮LED(发光二极管)开始在市面上众多的单片机学习资料中,最基础的实验无疑于点亮LED 了,即控制单片机的I/O的电平的变化。
如同如下实例代码一般void main(void){LedInit();While⑴{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真值表如下:tLXC I IOX TABLEOutputOutput EjmbxLit-ch0 QL H HHL11gLL12JELEDE -VCC2(»)0F ( )1 3; )2 41户|)3 —1 14)5 2 P ;审 $1 0D ]?- 1-- 4 6 K X DDDDDDDDG\CCT—74HC5-3 GKOWS 4 口 A A 0X=doLi t care - ____2=h 曾h impcduKu ee li o m G ・ C fl(原文件名:74hc573.jpg)通过这个真值表我们可以看出。
当OutputEnable弓I脚接低电平的时候,并且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) {g_bSystemTime1Ms = 0 ; g_u16LedTimeCount++ ; if(g_u16LedTimeCount >= 500) {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 的地方。