收藏 分销(赏)

单片机破解的常用方法及应对策略.doc

上传人:pc****0 文档编号:7497410 上传时间:2025-01-06 格式:DOC 页数:23 大小:145KB 下载积分:10 金币
下载 相关 举报
单片机破解的常用方法及应对策略.doc_第1页
第1页 / 共23页
单片机破解的常用方法及应对策略.doc_第2页
第2页 / 共23页


点击查看更多>>
资源描述
单片机破解的常用方法及应对策略 作者:未知    文章来源:未知    点击数: 243    更新时间:2007-10-1 摘要:介绍了单片机内部密码破解的常用方法,重点说明了侵入型攻击/物理攻击方法的详细步骤,最后,从应用角度出发,提出了对付破解的几点建议。 1 引言 单片机(Microcontroller)一般都有内部ROM/EEPROM/FLASH供用户存放程序。为了防止未经授权访问或拷贝单片机的机内程序,大部分单片机都带有加密锁定位或者加密字节,以保护片内程序。如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机内的程序,这就是所谓拷贝保护或者说锁定功能。事实上,这样的保护措施很脆弱,很容易被破解。单片机攻击者借助专用设备或者自制设备,利用单片机芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取单片机内程序。因此,作为电子产品的设计工程师非常有必要了解当前单片机攻击的最新技术,做到知己知彼,心中有数,才能有效防止自己花费大量金钱和时间辛辛苦苦设计出来的产品被人家一夜之间仿冒的事情发生。 2 单片机攻击技术 目前,攻击单片机主要有四种技术,分别是: (1)软件攻击 该技术通常使用处理器通信接口并利用协议、加密算法或这些算法中的安全漏洞来进行攻击。软件攻击取得成功的一个典型事例是对早期ATMEL AT89C 系列单片机的攻击。攻击者利用了该系列单片机擦除操作时序设计上的漏洞,使用自编程序在擦除加密锁定位后,停止下一步擦除片内程序存储器数据的操作,从而使加过密的单片机变成没加密的单片机,然后利用编程器读出片内程序。 (2) 电子探测攻击 该技术通常以高时间分辨率来监控处理器在正常操作时所有电源和接口连接的模拟特性,并通过监控它的电磁辐射特性来实施攻击。因为单片机是一个活动的电子器件,当它执行不同的指令时,对应的电源功率消耗也相应变化。这样通过使用特殊的电子测量仪器和数学统计方法分析和检测这些变化,即可获取单片机中的特定关键信息。 (3)过错产生技术 该技术使用异常工作条件来使处理器出错,然后提供额外的访问来进行攻击。使用最广泛的过错产生攻击手段包括电压冲击和时钟冲击。低电压和高电压攻击可用来禁止保护电路工作或强制处理器执行错误操作。时钟瞬态跳变也许会复位保护电路而不会破坏受保护信息。电源和时钟瞬态跳变可以在某些处理器中影响单条指令的解码和执行。 (4)探针技术 该技术是直接暴露芯片内部连线,然后观察、操控、干扰单片机以达到攻击目的。 为了方便起见,人们将以上四种攻击技术分成两类,一类是侵入型攻击(物理攻击),这类攻击需要破坏封装,然后借助半导体测试设备、显微镜和微定位器,在专门的实验室花上几小时甚至几周时间才能完成。所有的微探针技术都属于侵入型攻击。另外三种方法属于非侵入型攻击,被攻击的单片机不会被物理损坏。在某些场合非侵入型攻击是特别危险的,这是因为非侵入型攻击所需设备通常可以自制和升级,因此非常廉价。 大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反,侵入型的探针攻击则不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品。因此,对单片机的攻击往往从侵入型的反向工程开始,积累的经验有助于开发更加廉价和快速的非侵入型攻击技术。 3 侵入型攻击的一般过程 侵入型攻击的第一步是揭去芯片封装。有两种方法可以达到这一目的:第一种是完全溶解掉芯片封装,暴露金属连线。第二种是只移掉硅核上面的塑料封装。第一种方法需要将芯片绑定到测试夹具上,借助绑定台来操作。第二种方法除了需要具备攻击者一定的知识和必要的技能外,还需要个人的智慧和耐心,但操作起来相对比较方便。 芯片上面的塑料可以用小刀揭开,芯片周围的环氧树脂可以用浓硝酸腐蚀掉。热的浓硝酸会溶解掉芯片封装而不会影响芯片及连线。该过程一般在非常干燥的条件下进行,因为水的存在可能会侵蚀已暴露的铝线连接。 接着在超声池里先用丙酮清洗该芯片以除去残余硝酸,然后用清水清洗以除去盐分并干燥。没有超声池,一般就跳过这一步。这种情况下,芯片表面会有点脏,但是不太影响紫外光对芯片的操作效果。 最后一步是寻找保护熔丝的位置并将保护熔丝暴露在紫外光下。一般用一台放大倍数至少100倍的显微镜,从编程电压输入脚的连线跟踪进去,来寻找保护熔丝。若没有显微镜,则采用将芯片的不同部分暴露到紫外光下并观察结果的方式进行简单的搜索。操作时应用不透明的纸片覆盖芯片以保护程序存储器不被紫外光擦除。将保护熔丝暴露在紫外光下5~10分钟就能破坏掉保护位的保护作用,之后,使用简单的编程器就可直接读出程序存储器的内容。 对于使用了防护层来保护EEPROM单元的单片机来说,使用紫外光复位保护电路是不可行的。对于这种类型的单片机,一般使用微探针技术来读取存储器内容。在芯片封装打开后,将芯片置于显微镜下就能够很容易的找到从存储器连到电路其它部分的数据总线。由于某种原因,芯片锁定位在编程模式下并不锁定对存储器的访问。利用这一缺陷将探针放在数据线的上面就能读到所有想要的数据。在编程模式下,重启读过程并连接探针到另外的数据线上就可以读出程序和数据存储器中的所有信息。 还有一种可能的攻击手段是借助显微镜和激光切割机等设备来寻找保护熔丝,从而寻查和这部分电路相联系的所有信号线。由于设计有缺陷,因此,只要切断从保护熔丝到其它电路的某一根信号线,就能禁止整个保护功能。由于某种原因,这根线离其它的线非常远,所以使用激光切割机完全可以切断这根线而不影响临近线。这样,使用简单的编程器就能直接读出程序存储器的内容。 虽然大多数普通单片机都具有熔丝烧断保护单片机内代码的功能,但由于通用低档的单片机并非定位于制作安全类产品,因此,它们往往没有提供有针对性的防范措施且安全级别较低。加上单片机应用场合广泛,销售量大,厂商间委托加工与技术转让频繁,大量技术资料外泻,使得利用该类芯片的设计漏洞和厂商的测试接口,并通过修改熔丝保护位等侵入型攻击或非侵入型攻击手段来读取单片机的内部程序变得比较容易。 4 应对单片机破解的几点建议 任何一款单片机从理论上讲,攻击者均可利用足够的投资和时间使用以上方法来攻破。所以,在用单片机做加密认证或设计系统时,应尽量加大攻击者的攻击成本和所耗费的时间。这是系统设计者应该始终牢记的基本原则。除此之外,还应注意以下几点: (1)在选定加密芯片前,要充分调研,了解单片机破解技术的新进展,包括哪些单片机是已经确认可以破解的。尽量不选用已可破解或同系列、同型号的芯片。 (2)尽量不要选用MCS51系列单片机,因为该单片机在国内的普及程度最高,被研究得也最透。 (3)产品的原创者,一般具有产量大的特点,所以可选用比较生僻、偏冷门的单片机来加大仿冒者采购的难度。 (4)选择采用新工艺、新结构、上市时间较短的单片机,如ATMEL AVR系列单片机等。 (5)在设计成本许可的条件下,应选用具有硬件自毁功能的智能卡芯片,以有效对付物理攻击。 (6)如果条件许可,可采用两片不同型号单片机互为备份,相互验证,从而增加破解成本。 (7)打磨掉芯片型号等信息或者重新印上其它的型号,以假乱真。 当然,要想从根本上防止单片机被解密,程序被盗版等侵权行为发生,只能依靠法律手段来保障。 c8051f单片机使用经验总结 作者:未知    文章来源:未知    点击数: 596    更新时间:2007-10-1 我自己应用c8051f单片机总结出来的经验: 1. c8051f单片机速度快,时钟频率可达到25,50甚至100Mhz!内部资源丰富! 推荐用c8051f330d 芯片,价格便宜,20pin dip封装,上手快! 2. 电源用计算机的usb接口5伏电源,然后串接3个1N4007或1N4148二极管可以得到3伏左右的电压!!!如果要使用片内ad功能,电源电压需要更好些,可以使用三极管、稳压管等构成串联稳压电路,效果还是很好的!!!重要提示,f320,f340芯片内部集成了5伏转3.3伏电路,就不需要这些电路了!!! 3.  串口通信转换芯片可以不用max3232或max232,只需要2个三极管和4个电阻就可以了!我的波特率可以达到115.2kbps,很稳定! 4. c8051f330D芯片的10位ad很不错,我的采用查询方式,转换结果很满意,很稳定(转换结果在1个LSB上下变化,由于我的c8051f330D demo板3伏电源采用分立元件构成,所以软件采用了多次采样求平均值算法)! 5.   f330d的da转换功能是电流型的,这样就可以测量小功率三极管直流电流放大倍数。用它提供10到20微安的电流做三极管的基极电流,集电极接3伏电源,在三极管的射极串一个精密电阻,用ad转换测量电阻两端的电压,然后就可以按公式算得三极管电流放大倍数,很遗憾这种办法不适合pnp型的三极管。 6.说一下自己动手焊接c8051f单片机贴片芯片比较实用的办法。c8051f单片机与其它单片机,dsp,arm芯片相比较而言是脆弱的,如果焊接时不小心就很可能把芯片损坏!建议用比较好的恒温可调的烙铁,功率在30瓦左右,温度控制在260到300度,建议采用点焊而不用拉焊,焊接时烙铁放在每个引脚的时间不能太长(最好低于3秒)。上边提到的方法还不能确保芯片完好,对芯片有危害的还有带电烙铁的静电感应!烙铁质量不是太好的,焊接时可以把烙铁电源插头拔掉,呵呵,比较麻烦!以上办法还是比较有效的。 7.以前学习和使用usb是有难度的,如果现在想学习和使用usb,推荐使用c8051f320芯片,性价比高,软硬件资料很全,上手快。我自己试着做了一款c8051f320 USB demo 板,效果很好!!! 8.c8051f单片机和at89c5x,at89s5x单片机的不同之处。第一,c8051f单片机没有采用时钟12分频,因此运行速度快了一个数量级;第二,c8051f单片机采用低电平复位,而at89x5x采用高电平复位;第三,c8051f单片机内部带有晶振,其中不少的精度高,可以和外部的晶振切换工作;第四,c8051f单片机的看门狗上电复位后已打开(所以通常要关掉),而at89s5x单片机的看门狗上电复位后关闭;第五,c8051f单片机的flash至少可以擦除编程20000次,而且可以当e2prom数据寄存器使用,而at89x5x单片机的flash最多擦除编程1000次;第六,at89x5x采用5伏供电,c8051f单片机虽然采用3伏供电,但i/o口可以承受5伏电压;第七,at89s5x单片机的一个i/o口最多有两种功能,而c8051f单片机的i/o口可以达到3种以上的功能,这是通过内部的交叉开关实现的;最后要说的是开发工具不一样。 9. 自己做了c2接口的并口和串口两款下载线,我没有EC2/EC3/EC5仿真器,用它来学习和开发c8051f330d demo 板,c8051f320 USB demo 板,效果令我很满意!!! 单片机硬件抗干扰经验 作者:未知    文章来源:未知    点击数: 170    更新时间:2007-7-13 在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性? 一、下面的一些系统要特别注意抗电磁干扰: 1、微控制器时钟频率特别高,总线周期特别快的系统。 2、系统含有大功率,大电流驱动电路,如产生火花的继电器,大电流开关等。 3、含微弱模拟信号电路以及高精度A/D变换电路的系统。 二、为增加系统的抗电磁干扰能力采取如下措施: 1、选用频率低的微控制器: 选用外时钟频率低的微控制器可以有效降低噪声和提高系统的抗干扰能力。同样频率的方波和正弦波,方波中的高频成份比正弦波多得多。虽然方波的高频成份的波的幅度,比基波小,但频率越高越容易发射出成为噪声源,微控制器产生的最有影响的高频噪声大约是时钟频率的3倍。 2、减小信号传输中的畸变 微控制器主要采用高速CMOS技术制造。信号输入端静态输入电流在1mA左右,输入电容10PF左右,输入阻抗相当高,高速CMOS电路的输出端都有相当的带载能力,即相当大的输出值,将一个门的输出端通过一段很长线引到输入阻抗相当高的输入端,反射问题就很严重,它会引起信号畸变,增加系统噪声。当Tpd>Tr时,就成了一个传输线问题,必须考虑信号反射,阻抗匹配等问题。 信号在印制板上的延迟时间与引线的特性阻抗有关,即与印制线路板材料的介电常数有关。可以粗略地认为,信号在印制板引线的传输速度,约为光速的1/3到1/2之间。微控制器构成的系统中常用逻辑电话元件的Tr(标准延迟时间)为3到18ns之间。 在印制线路板上,信号通过一个7W的电阻和一段25cm长的引线,线上延迟时间大致在4~20ns之间。也就是说,信号在印刷线路上的引线越短越好,最长不宜超过25cm。而且过孔数目也应尽量少,最好不多于2个。[ url href="/ 当信号的上升时间快于信号延迟时间,就要按照快电子学处理。此时要考虑传输线的阻抗匹配,对于一块印刷线路板上的集成块之间的信号传输,要避免出现Td>Trd的情况,印刷线路板越大系统的速度就越不能太快。 用以下结论归纳印刷线路板设计的一个规则: 信号在印刷板上传输,其延迟时间不应大于所用器件的标称延迟时间。 3、减小信号线间的交叉干扰: A点一个上升时间为Tr的阶跃信号通过引线AB传向B端。信号在AB线上的延迟时间是Td。在D点,由于A点信号的向前传输,到达B点后的信号反射和AB线的延迟,Td时间以后会感应出一个宽度为Tr的页脉冲信号。在C点,由于AB上信号的传输与反射,会感应出一个宽度为信号在AB线上的延迟时间的两倍,即2Td的正脉冲信号。这就是信号间的交叉干扰。干扰信号的强度与C点信号的di/at有关,与线间距离有关。当两信号线不是很长时,AB上看到的实际是两个脉冲的迭加。 CMOS工艺制造的微控制由输入阻抗高,噪声高,噪声容限也很高,数字电路是迭加100~200mv噪声并不影响其工作。若图中AB线是一模拟信号,这种干扰就变为不能容忍。如印刷线路板为四层板,其中有一层是大面积的地,或双面板,信号线的反面是大面积的地时,这种信号间的交叉干扰就会变小。原因是,大面积的地减小了信号线的特性阻抗,信号在D端的反射大为减小。特性阻抗与信号线到地间的介质的介电常数的平方成反比,与介质厚度的自然对数成正比。若AB线为一模拟信号,要避免数字电路信号线CD对AB的干扰,AB线下方要有大面积的地,AB线到CD线的距离要大于AB线与地距离的2~3倍。可用局部屏蔽地,在有引结的一面引线左右两侧布以地线。 4、减小来自电源的噪声 电源在向系统提供能源的同时,也将其噪声加到所供电的电源上。电路中微控制器的复位线,中断线,以及其它一些控制线最容易受外界噪声的干扰。电网上的强干扰通过电源进入电路,即使电池供电的系统,电池本身也有高频噪声。模拟电路中的模拟信号更经受不住来自电源的干扰。 5、注意印刷线板与元器件的高频特性 在高频情况下,印刷线路板上的引线,过孔,电阻、电容、接插件的分布电感与电容等不可忽略。电容的分布电感不可忽略,电感的分布电容不可忽略。电阻产生对高频信号的反射,引线的分布电容会起作用,当长度大于噪声频率相应波长的1/20时,就产生天线效应,噪声通过引线向外发射。 印刷线路板的过孔大约引起0.6pf的电容。 一个集成电路本身的封装材料引入2~6pf电容。 一个线路板上的接插件,有520nH的分布电感。一个双列直扦的24引脚集成电路扦座,引入4~18nH的分布电感。 这些小的分布参数对于这行较低频率下的微控制器系统中是可以忽略不计的;而对于高速系统必须予以特别注意。 6、元件布置要合理分区 元件在印刷线路板上排列的位置要充分考虑抗电磁干扰问题,原则之一是各部件之间的引线要尽量短。在布局上,要把模拟信号部分,高速数字电路部分,噪声源部分(如继电器,大电流开关等)这三部分合理地分开,使相互间的信号耦合为最小。 7、处理好接地线 印刷电路板上,电源线和地线最重要。克服电磁干扰,最主要的手段就是接地。 对于双面板,地线布置特别讲究,通过采用单点接地法,电源和地是从电源的两端接到印刷线路板上来的,电源一个接点,地一个接点。印刷线路板上,要有多个返回地线,这些都会聚到回电源的那个接点上,就是所谓单点接地。所谓模拟地、数字地、大功率器件地开分,是指布线分开,而最后都汇集到这个接地点上来。与印刷线路板以外的信号相连时,通常采用屏蔽电缆。对于高频和数字信号,屏蔽电缆两端都接地。低频模拟信号用的屏蔽电缆,一端接地为好。 对噪声和干扰非常敏感的电路或高频噪声特别严重的电路应该用金属罩屏蔽起来。 8、用好去耦电容。 好的高频去耦电容可以去除高到1GHZ的高频成份。陶瓷片电容或多层陶瓷电容的高频特性较好。设计印刷线路板时,每个集成电路的电源,地之间都要加一个去耦电容。去耦电容有两个作用:一方面是本集成电路的蓄能电容,提供和吸收该集成电路开门关门瞬间的充放电能;另一方面旁路掉该器件的高频噪声。数字电路中典型的去耦电容为0.1uf的去耦电容有5nH分布电感,它的并行共振频率大约在7MHz左右,也就是说对于10MHz以下的噪声有较好的去耦作用,对40MHz以上的噪声几乎不起作用。 1uf,10uf电容,并行共振频率在20MHz以上,去除高频率噪声的效果要好一些。在电源进入印刷板的地方和一个1uf或10uf的去高频电容往往是有利的,即使是用电池供电的系统也需要这种电容。 每10片左右的集成电路要加一片充放电电容,或称为蓄放电容,电容大小可选10uf。最好不用电解电容,电解电容是两层溥膜卷起来的,这种卷起来的结构在高频时表现为电感,最好使用胆电容或聚碳酸酝电容。 去耦电容值的选取并不严格,可按C=1/f计算;即10MHz取0.1uf,对微控制器构成的系统,取0.1~0.01uf之间都可以。 三、降低噪声与电磁干扰的一些经验。 能用低速芯片就不用高速的,高速芯片用在关键地方。 可用串一个电阻的办法,降低控制电路上下沿跳变速率。 尽量为继电器等提供某种形式的阻尼。 使用满足系统要求的最低频率时钟。 时钟产生器尽量靠近到用该时钟的器件。石英晶体振荡器外壳要接地。 用地线将时钟区圈起来,时钟线尽量短。 I/O驱动电路尽量靠近印刷板边,让其尽快离开印刷板。对进入印制板的信号要加滤波,从高噪声区来的信号也要加滤波,同时用串终端电阻的办法,减小信号反射。 MCD无用端要接高,或接地,或定义成输出端,集成电路上该接电源地的端都要接,不要悬空。 闲置不用的门电路输入端不要悬空,闲置不用的运放正输入端接地,负输入端接输出端。 (10) 印制板尽量使用45折线而不用90折线布线以减小高频信号对外的发射与耦合。 印制板按频率和电流开关特性分区,噪声元件与非噪声元件要距离再远一些。 单面板和双面板用单点接电源和单点接地、电源线、地线尽量粗,经济是能承受的话用多层板以减小电源,地的容生电感。 时钟、总线、片选信号要远离I/O线和接插件。 模拟电压输入线、参考电压端要尽量远离数字电路信号线,特别是时钟。 对A/D类器件,数字部分与模拟部分宁可统一下也不要交叉。 时钟线垂直于I/O线比平行I/O线干扰小,时钟元件引脚远离I/O电缆。 元件引脚尽量短,去耦电容引脚尽量短。 关键的线要尽量粗,并在两边加上保护地。高速线要短要直。 对噪声敏感的线不要与大电流,高速开关线平行。 石英晶体下面以及对噪声敏感的器件下面不要走线。 弱信号电路,低频电路周围不要形成电流环路。 任何信号都不要形成环路,如不可避免,让环路区尽量小。 每个集成电路一个去耦电容。每个电解电容边上都要加一个小的高频旁路电容。 用大容量的钽电容或聚酷电容而不用电解电容作电路充放电储能电容。使用管状电容时,外壳要接地。 走向单片机世界 作者:佚名    文章来源:    点击数: 376    更新时间:2007-3-5    当今大家对计算机已经不陌生了。从铺天盖地的计算机学习班广告到有关任职必须具备计算机知识的通知,已经使我们自觉不自觉地进入了计算机的世界。但是还有一类计算机我们可能并不熟悉,它就在我们面前,这就是单片机。单片机顾名思义就是将计算机集成到一个芯片上,正因为如此,它已经深入到电饭堡:洗衣机、录象机、电话、汽车、火车、飞机、火箭、医疗器械等各个地方,甚至在微机里也有单片机在默默地工作。因此了解单片机的工作原理、掌握它的使用方法就成了十分有意义的事情。本刊从本期开始,系统地、通俗地介绍这方面的知识。 一、从晶体管到单片机    为了有个对比,在搭乘单片机列车之前,先回顾一下我们已经熟悉的传统的电子世界。在传统的电子世界里,电子管已经退役多时了,虽然现在“胆机”在音响发烧友中间又流行起来,但是在控制领域电子管已经远远的离开了舞台,我们不再花时间讨论。晶体管是电子爱好者们熟悉的器材,我们对于二极管的整流原理和三极管的放大原理非常熟悉,但是对于它们所构成的逻辑电路是否也很熟悉呢?我们不妨共同做一简要复习。    用二极管构成的与门电路,它是怎样工作的?读者不妨自己先叙述一下,看看我们想的是否相同。当A和B都接到地时,C端由于两个二极管都导通,二极管的导通压降是很小的,可以近似认为是0伏,也就是处于低电平。当A接地,B接到+5V时,C端没有发生根本变化。这是因为二极管D1的导通使C点仍为低电平,B点虽然接到+5V, 但是D2未导通,所以C点仍为低电平。当A接十5V,B接地 时情况同样如此。只有A和日同时接到+5V时,两只二极管都不导通了,此时C点升到+5V。    结论是: 与门电路的输入端只有一个接低电平,输出就为低电平,只有全部输入都为高电平时,输出才为高电平。简单说就是:A为高“与”B为高,输出才为高。把电路改变一下接法就构成了或门电路,工作原理 不再赘述,只把结论写在这里: 或门电路的输入端只要有一个接高电平,输出就为高电平, 只有输入端全部接低电平时,输出才为低电平。简化为:A为高 “或”B为高,输出就为高。    还有一种“非”门电路:当输入为高时,输出为低;当输入为低时,输出为高。用一个三极管就可以构成非门电路。当三极管的基极输入为高电平时三极管饱和,集电极输出近似为0V也就是低电平;反之,当基极接低电平时三极管截止,集电极输出接近+5V为高电平。输入和输出总是相反,故称之为非门。    与、或、非电路是逻辑电路的基本形式。由理论可知:    一切逻辑电路都可以通过这三种基本逻辑电路的组合形成。在逻辑电路中为了突出电路之间的逻辑关系,不再关心是用什么器件产生的逻辑关系,也不考虑电路的输入是接到三极管的基极还是接到二极管的阳极,而是用一个逻辑符号表示之间的联系。三种基本逻辑电路对应的符号标在图的下部。    随着技术的进步和社会发展的需要,直接由三极管构成逻辑电路在体积和功能上已经不能满足需要了,于是产生了集成电路。早期集成电路----一片芯片集成了几个或几十个晶体管,称之为小规模集成电路。后来集成度提高到几百,几千个晶体管, 称之为大规模集成电路,现在一个芯片可以集成相当于几十万、几百万或更多的晶体管称为超大规模集成电路。这样从电子管时间算起,电子电路经历了四代变迁。    从集成电路来看,比晶体管在性能上有极大提高,体积大 大缩小、功能也更加完善,单以74类门电路为例就有LLS、HC等不同系列,每个系列都有几百个品种。用它们可以组合出各种各样的电路。逻辑集成电路的出现为逻辑电路的广泛应用打下了基础。    逻辑电路可以分为两种类型:组合电路和时序电路。 像上面介绍的单个与、或、非门电路就属于“组合电路”。 这类电路的特点是:输出状态跟随输入状态变化,输入状态一旦发生变化,输出立即改变。并且输出状态和输入状态一一对 应:每一种输入状态对应唯一的输出状态。    另一类逻辑电路称“时序电路”;这类电路的输出不但和当时的输入状态有关,还与以前的状态有关。计数器就是一种典 型的时序电路。计数器的输入端每接受一个脉冲,输出端的状态就发生一次变化,并且输出的状态是与前一次状态有关的。以 74LS161为例,这个集成电路有一个时钟输入端、四个输出端和一些辅助端。当按器件规定接好线路后,在时钟端每输入一个脉冲,输出状态就变化一次。最初清零后四个输出端QA、 QB、QC、QD均为0。第一个脉冲到来后QA=1,其余输出仍为0。第二个脉冲到来后QA=0、QB=1,其余为0。依次输入脉冲。    可以看到从同一个输入端进入信号,输出却有不相同变化。 计数器的应用非常广泛。将前端接上机械开关或光电开关就可作为流水线产品计数;把标准时间脉冲作为输入,就可以作为精确的定时器。   因为栏目所限,基础部分不能写的很多、很细,那些知识可以由三极管原理、数字电路知识等类似的学习材料得到,不能完全包含在本栏目的范围内。同样原因,对于单片机的原理也不会是全面的、系统的讲解,而是从使用者的角度,将最基本、最常角的内容做一简单介绍,达到“人门”的目的。    预计通过阅读这个栏目,配合基本练习,可以掌握单片机的基本知识;学会使用单片机的基本方法;能够进行简单程序(几十行)的阅读;基本程序(上百行)的编写,为进一步深造打下基础。需要强调的一点是:计算机(自然包括单片机)是实践性很强的一门技术。一定要通过实践来理解基本原理,至少要将文中介绍的实验亲手实践一遍,最好举一反三用自己编写的程序验证所学习的知识。到底情况如何,可以通过实践体会一下。 如果真的还有什么困难,我也愿和大家一起克服,共同进入单片机世界。 51单片机 Keil C 延时程序的简单研究 作者:佚名    文章来源:    点击数: 374    更新时间:2007-3-5   应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。   以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:     mov   r0, #09h loop:  djnz  r0, loop 51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。如果需要更长时间,可以使用两层嵌套。而且精度可以达到2us,一般来说,这已经足够了。   现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。因而在实时性要求高的场合,还需要汇编和C的联合应用。但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。   用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的: void delay2(unsigned char i) {   for(; i != 0; i--); } 到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:        ; FUNCTION _delay2 (BEGIN)                       ; SOURCE LINE # 18 ;---- Variable "i" assigned to Register "R7" ----                       ; SOURCE LINE # 19                       ; SOURCE LINE # 20 0000     ?C0007: 0000 EF        MOV   A,R7 0001 6003       JZ   ?C0010 0003 1F        DEC   R7 0004 80FA       SJMP  ?C0007                       ; SOURCE LINE # 21 0006     ?C0010: 0006 22        RET          ; FUNCTION _delay2 (END) 真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。也就是说,它的精度顶多也就是6us而已,这还没算上一条 lcall 和一条 ret。如果我们把调用函数时赋的i值根延时长度列一个表的话,就是: i  delay time/us 0  6 1  12 2  18 ... 因为函数的调用需要2个时钟周期的lcall,所以delay time比从函数代码的执行时间多2。顺便提一下,有的朋友写的是这样的代码: void delay2(unsigned char i) {   unsigned char a;   for(a = i; a != 0; a--); } 可能有人认为这会生成更长的汇编代码来,但是事实证明:        ; FUNCTION _delay2 (BEGIN)                       ; SOURCE LINE # 18 ;---- Variable "i" assigned to Register "R7" ----                       ; SOURCE LINE # 19                       ; SOURCE LINE # 21 ;---- Variable "a" assigned to Register "R7" ---- 0000     ?C0007: 0000 EF        MOV   A,R7 0001 6003       JZ   ?C0010 0003 1F        DEC   R7 0004 80FA       SJMP  ?C0007                       ; SOURCE LINE # 22 0006     ?C0010: 0006 22        RET          ; FUNCTION _delay2 (END) 其生成的代码是一样的。不过这的确不是什么好的习惯。因为这里实在没有必要再引入多余的变量。我们继续讨论正题。有的朋友为了得当更长的延时,甚至用了这样的代码: void delay2(unsigned long i) {   for(; i != 0; i--); } 这段代码产生的汇编代码是什么样子的?其实不用想也知道它是如何恐怖的$#^%&%$......让我们看一看:        ; FUNCTION _delay2 (BEGIN)                       ; SOURCE LINE # 18 0000 8F00    R   MOV   i+03H,R7 0002 8E00    R   MOV   i+02H,R6 0004 8D00    R   MOV   i+01H,R5 0006 8C00    R   MOV   i,R4                       ; SOURCE LINE # 19                       ; SOURCE LINE # 20 0008     ?C0007: 0008 E4        CLR   A 0009 FF        MOV   R7,A 000A FE        MOV   R6,A 000B FD        MOV   R5,A 000C FC        MOV   R4,A 000D AB00    R   MOV   R3,i+03H 000F AA00    R   MOV   R2,i+02H 0011 A900    R   MOV   R1,i+01H 0013 A800    R   MOV   R0,i 0015 C3        CLR   C 0016 120000   E   LCALL  ?C?ULCMP 0019 601A       JZ   ?C0010 001B E500    R   MOV   A,i+03H 001D 24FF       ADD   A,#0FFH 001F F500    R   MOV   i+03H,A 0021 E500    R   MOV   A,i+02H 0023 34FF       ADDC  A,#0FFH 0025 F500    R   MOV   i+02H,A 0027 E500    R   MOV   A,i+01H 0029 34FF       ADDC  A,#0FFH 002B F500    R   MOV   i+01H,A 002D E500    R   MOV   A,i 002F 34FF       ADDC  A,#0FFH 0031 F500    R   MOV   i,A 0033 80D3       SJMP  ?C0007                       ; SOURCE LINE # 21 0035     ?C0010: 0035 22        RET          ; FUNCTION _delay2 (END) 呵呵,这倒是的确可以延迟很长时间~~~但是毫无精度可言了。   那么,用C到底能不能实现精确的延时呢?我把代码稍微改了一下: void delay1(unsigned char i) {   while(i--); } 因为根据经验,越简洁的C代码往往也能得出越简洁的机器代码。那这样结果如何呢?把它生成的汇编代码拿出来看一看就知道了。满怀希望的我按下了“Build target”键,结果打击是巨大的:        ; FUNCTION _delay1 (BEGIN)                       ; SOURCE LINE # 13 ;---- Variable "i" assigned to Register "R7" ----                       ; SOURCE LINE # 14 0000     ?C0004:                       ; SOURCE LINE # 15 0000 AE07       MOV   R6,AR7 0002 1F        DEC   R7 0003 EE        MOV   A,R6 0004 70FA       JNZ   ?C0004                       ; SOURCE LINE # 16 0006     ?C0006: 0006 2
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服