导航:首页 > 操作系统 > 锁步双冗余单片机

锁步双冗余单片机

发布时间:2024-04-15 07:57:52

① 如果单片机程序是加密的怎样解密

单片机解密的常用方法及如何应对单片机解密
单片机解密的常用方法及应对单片机芯片解密的方法如下

单片机芯片的解密方法如下,其实,一般的人也还是破解不开的,能破解的单片机都是小芯片/小程序(直接说就是模仿其功能而新开发新程序)或解密成本比开发还高,只要用以下几种解密方法来设计产品:
1:让原芯片厂家将芯片的封装脚位全部调换;
2:将HTXXXX的印字印为MDTXXXX的,将PICXXX的印为ATXXXX.......。
3:使用四层板(故意多走一些线);
4:用环氧树脂 酶(xxx酶:可增加硬度,如将其弄开后芯片就报废了)将测试好的线路板密封上;
5:将芯片的程序里加入芯片保护程序,EMXXX如2脚有电压输入时就将所有芯片的内容清除......;
6:最好使用裸片来做产品;
7:将部分端口用大电流熔断......。
8:一般单片机解密也是犯法的,现在国家也正在打击这些人,如盗版光蝶;软件;书.....;查到都要罚款及判刑的,在欧盟抓到就发几十万到几十亿欧元。

摘要:介绍了单片机程序解密的常用方法,重点说明了侵入型攻击/物理攻击单片机解密方法的详细步骤,最后,从应用角度出发,提出了对付单片机解密的几点建议。
关键词: 单片机解密,单片机解密软件,单片机解密工具,单片机解密器,单片机解密方法,单片机解密价格,pic单片机解密,stc单片机解密,单片机解密软件下载, 三星单片机解密,motorola单片机解密,单片机解密论坛,AVR单片机解密,单片机程序解密,单片机解密方案,单片机加密解密

1 引言

单片机(Microcontroller)一般都有内部ROM/EEPROM/Flash供用户存放程序。为了防止未经授权访问或拷贝单片机的机内程序,大部分单片机都带有加密锁定位或者加密字节,以保护单片机片内程序。如果在编程时单片机加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机内的程序,这就是所谓拷贝保护或者说锁定功能。事实上,这样的保护措施很脆弱,很容易被破解。单片机攻击者借助专用设备或者自制设备,利用单片机芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取单片机内程序。因此,作为电子产品的设计工程师非常有必要了解当前单片机攻击的最新技术,做到知己知彼,心中有数,才能有效防止自己花费大量金钱和时间辛辛苦苦设计出来的产品被人家一夜之间仿冒的事情发生。

2 单片机攻击技术

目前,攻击单片机主要有四种技术,分别是:

(1)软件攻击

该技术通常使用处理器通信接口并利用协议、加密算法或这些算法中的安全漏洞来进行攻击。软件攻击取得成功的一个典型事例是对早期Atmel AT89 系列单片机的攻击。攻击者利用了该系列单片机擦除操作时序设计上的漏洞,使用自编程序在擦除加密锁定位后,停止下一步擦除片内程序存储器数据的操作,从而使加过密的单片机变成没加密的单片机,然后利用编程器读出片内程序。

(2) 电子探测攻击

该技术通常以高时间分辨率来监控处理器在正常操作时所有电源和接口连接的模拟特性,并通过监控它的电磁辐射特性来实施攻击。因为单片机是一个活动的电子器件,当它执行不同的指令时,对应的电源功率消耗也相应变化。这样通过使用特殊的电子测量仪器和数学统计方法分析和检测这些变化,即可获取单片机中的特定关键信息。

(3)过错产生技术

该技术使用异常工作条件来使处理器出错,然后提供额外的访问来进行攻击。使用最广泛的过错产生攻击手段包括电压冲击和时钟冲击。低电压和高电压攻击可用来禁止保护电路工作或强制处理器执行错误操作。时钟瞬态跳变也许会复位保护电路而不会破坏受保护信息。电源和时钟瞬态跳变可以在某些处理器中影响单条指令的解码和执行。

(4)探针技术

该技术是直接暴露芯片内部连线,然后观察、操控、干扰单片机以达到攻击目的。

为了方便起见,人们将以上四种攻击技术分成两类,一类是侵入型攻击(物理攻击),这类攻击需要破坏封装,然后借助半导体测试设备、显微镜和微定位器,在专门的实验室花上几小时甚至几周时间才能完成。所有的微探针技术都属于侵入型攻击。另外三种方法属于非侵入型攻击,被攻击的单片机不会被物理损坏。在某些场合非侵入型攻击是特别危险的,这是因为非侵入型攻击所需设备通常可以自制和升级,因此非常廉价。

大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反,侵入型的探针攻击则不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品。因此,对单片机的攻击往往从侵入型的反向工程开始,积累的经验有助于开发更加廉价和快速的非侵入型攻击技术。

3 侵入型攻击的一般过程

侵入型攻击的第一步是揭去芯片封装。有两种方法可以达到这一目的:第一种是完全溶解掉芯片封装,暴露金属连线。第二种是只移掉硅核上面的塑料封装。第一种方法需要将芯片绑定到测试夹具上,借助绑定台来操作。第二种方法除了需要具备攻击者一定的知识和必要的技能外,还需要个人的智慧和耐心,但操作起来相对比较方便。

芯片上面的塑料可以用小刀揭开,芯片周围的环氧树脂可以用浓硝酸腐蚀掉。热的浓硝酸会溶解掉芯片封装而不会影响芯片及连线。该过程一般在非常干燥的条件下进行,因为水的存在可能会侵蚀已暴露的铝线连接。

接着在超声池里先用丙酮清洗该芯片以除去残余硝酸,然后用清水清洗以除去盐分并干燥。没有超声池,一般就跳过这一步。这种情况下,芯片表面会有点脏,但是不太影响紫外光对芯片的操作效果。

最后一步是寻找保护熔丝的位置并将保护熔丝暴露在紫外光下。一般用一台放大倍数至少100倍的显微镜,从编程电压输入脚的连线跟踪进去,来寻找保护熔丝。若没有显微镜,则采用将芯片的不同部分暴露到紫外光下并观察结果的方式进行简单的搜索。操作时应用不透明的纸片覆盖芯片以保护程序存储器不被紫外光擦除。将保护熔丝暴露在紫外光下5~10分钟就能破坏掉保护位的保护作用,之后,使用简单的编程器就可直接读出程序存储器的内容。

对于使用了防护层来保护EEPROM单元的单片机来说,使用紫外光复位保护电路是不可行的。对于这种类型的单片机,一般使用微探针技术来读取存储器内容。在芯片封装打开后,将芯片置于显微镜下就能够很容易的找到从存储器连到电路其它部分的数据总线。由于某种原因,芯片锁定位在编程模式下并不锁定对存储器的访问。利用这一缺陷将探针放在数据线的上面就能读到所有想要的数据。在编程模式下,重启读过程并连接探针到另外的数据线上就可以读出程序和数据存储器中的所有信息。

还有一种可能的攻击手段是借助显微镜和激光切割机等设备来寻找保护熔丝,从而寻查和这部分电路相联系的所有信号线。由于设计有缺陷,因此,只要切断从保护熔丝到其它电路的某一根信号线,就能禁止整个保护功能。由于某种原因,这根线离其它的线非常远,所以使用激光切割机完全可以切断这根线而不影响临近线。这样,使用简单的编程器就能直接读出程序存储器的内容。

虽然大多数普通单片机都具有熔丝烧断保护单片机内代码的功能,但由于通用低档的单片机并非定位于制作安全类产品,因此,它们往往没有提供有针对性的防范措施且安全级别较低。加上单片机应用场合广泛,销售量大,厂商间委托加工与技术转让频繁,大量技术资料外泻,使得利用该类芯片的设计漏洞和厂商的测试接口,并通过修改熔丝保护位等侵入型攻击或非侵入型攻击手段来读取单片机的内部程序变得比较容易。

4 应对单片机解密的几点建议

任何一款单片机�从理论上讲,攻击者均可利用足够的投资和时间使用以上方法来攻破。所以,在用单片机做加密认证或设计系统时,应尽量加大攻击者的攻击成本和所耗费的时间。这是系统设计者应该始终牢记的基本原则。除此之外,还应注意以下几点:

(1)在选定加密芯片前,要充分调研,了解单片机解密技术的新进展,包括哪些单片机是已经确认可以解密的。尽量不选用已可解密或同系列、同型号的芯片。

(2)尽量不要选用MCS51系列单片机,因为该单片机在国内的普及程度最高,被研究得也最透。

(3)产品的原创者,一般具有产量大的特点,所以可选用比较生僻、偏冷门的单片机来加大仿冒者采购的难度。

(4)选择采用新工艺、新结构、上市时间较短的单片机,如ATMEL AVR系列单片机等。

(5)在设计成本许可的条件下,应选用具有硬件自毁功能的智能卡芯片,以有效对付物理攻击。

(6)如果条件许可,可采用两片不同型号单片机互为备份,相互验证,从而增加破解成本。

(7)打磨掉芯片型号等信息或者重新印上其它的型号,以假乱真。

当然,要想从根本上防止单片机解密,程序被盗版等侵权行为发生,只能依靠法律手段来保障。

② 关于单片机的种类问题

单片机的分类Ⅰ 按生产厂家分
美国的英特尔(Intel) 公司、摩托罗拉(Motorola)公司、国家办导体(NS) 公司、Atmel公司、微芯片(Microchip) 公司、洛克威尔(Rockwell)公司、莫斯特克公司(Mostek)、齐洛格(Zilog)公司、仙童(Fairchid)公司、德州仪器(TI)公司等等。日本的电气(NS)公司、东芝(Toshiba)公司、富士通(Fujitsu)公司、松下公司、日立(Hitachi)公司、日电(NEC)公司、夏普公司等等。荷兰的飞利浦(Philips)公司。德国的西门子(Siemens)公司等等。
Ⅱ 按字长分(1)4-BIT 单片机
4 位单片机的控制功能较弱,CPU 一次只能处理4 位二进制数。这类单片机常用于计算器、各种形态的智能单元以及作为家用电器中的控制器。典型产品有NEC 公司的UPD 75××系列、NS 公司的COP400 系列、松下公司的MN1400 系列、ROCKWELL 公司的PPS/1系列、富士通公司的MB88 系列、夏普公司的SM××系列、Toshiba 公司的TMP47×××系列等等。
① 华邦公司的W741系列的4位单片机带液晶驱动,在线烧录,保密性高,低操作电压(1.2V~1.8V)。
② 东芝单片机的4位机在家电领域有很大市场。
(2)8-BIT 单片机
8 位单片机 8 位单片机的控制功能较强,品种最为齐全。和4 位单片机相比,它不仅具有较大的存储容量和寻址范围,而且中断源、并行I/O 接口和定时器/计数器个数都有了不同程度的增加,并集成有全双工串行通信接口。在指令系统方面,普遍增设了乘除指令和比较指令。特别是8 位机中的高性能增强型单片机,除片内增加了A/D 和D/A 转换器外,还集成有定时器捕捉/比较寄存器、监视定时器(Watchdog)、总线控制部件和晶体振荡电路等。这类单片机由于其片内资源丰富和功能强大,主要在工业控制、智能仪表、家用电器和办公自动化系统中应用。代表产品有Intel 公司的MCS-48 系列和MCS-51 系列 、Microchip 公司的PIC16C××系列和PIC17C××系列以及PIC1400 系列、Motorola 公司的M68HC05 系列和M68HC11 系列、Zilog 公司的Z8 系列、荷兰Philips 公司的80C51 系列(同MCS-51 兼容)、Atmel公司的AT89 系列(同MCS-51 兼容)、NEC 公司的UPD78××系列等等。
1)51系列单片机
8031/8051/8751是Intel公司早期的产品。应用的早,影响很大,已成为世界上的工业标准。后来很多芯片厂商以各种方式与Intel公司合作,也推出了同类型的单片机,如同一种单片机的多个版本一样,虽都在不断的改变制造工艺,但内核却一样,也就是说这类单片机指令系统完全兼容,绝大多数管脚也兼容;在使用上基本可以直接互换。人们统称这些与8051内核相同的单片机为“51系列单片机”。
8031片内不带程序存储器ROM,使用时用户需外接程序存储器和一片逻辑电路373,外接的程序存储器多为EPROM的2764系列。用户若想对写入到EPROM中的程序进行修改,必须先用一种特殊的紫外线灯将其照射擦除,之后再可写入。写入到外接程序存储器的程序代码没有什么保密性可言。
8051片内有4k ROM,无须外接外存储器和373,更能体现“单片”的简练。但是所编的程序无法写入到其ROM中,只有将程序交芯片厂代为写入,并是一次性的,不能改写其内容。
8751与8051基本一样,但8751片内有4k的EPROM,用户可以将自己编写的程序写入单片机的EPROM中进行现场实验与应用,EPROM的改写同样需要用紫外线灯照射一定时间擦除后再写入。
在众多的51系列单片机中,要算 ATMEL 公司的AT89C51、AT89S52更实用,因他不但和8051指令、管脚完全兼容,而且其片内的4K程序存储器是FLASH工艺的,这种工艺的存储器用户可以用电的方式瞬间擦除、改写,一般专为 ATMEL AT89xx 做的编程器均带有这些功能。显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短。写入单片机内的程序还可以进行加密,这又很好地保护了你的劳动成果。而且,AT89C51、AT89S51目前的售价比8031还低,市场供应也很充足。
AT89S51、52是2003年ATMEL推出的新型品种,除了完全兼容8051外,还多了ISP编程和看门狗功能。
ATMEL公司的51系列还有AT89C2051、AT89C1051等品种,这些芯片是在AT89C51的基础上将一些功能精简掉后形成的精简版。AT89C2051取掉了P0口和P2口,内部的程序FLASH存储器也小到2K,封装形式也由51的P40脚改为20脚,相应的价格也低一些,特别适合在一些智能玩具,手持仪器等程序不大的电路环境下应用;AT89C1051在2051的基础上,再次精简掉了串口功能等,程序存储器再次减小到1k,当然价格也更低。
51 单片机目前已有多种型号,市场上目前供货比较足的芯片还要算ATMEL 的51、52 芯片, HYUNDAI 的GMS97 系列,WINBOND 的78e52,78e58,77e58 等。
GMS97 系列是一次性烧写,一般只有大量生产的人才买。at89c51,52 因可以很容易地解密,一般人们只用它来做实验,或者用在一些即使解了密也无关紧要的场合。89c2051 只有20 腿,体积小巧,在一些简单应用和体积有限的场合得到广泛应用。
2)PIC系列单片机
由美国Microchip公司推出的PIC单片机系列产品,首先采用了RISC结构的嵌入式微控制器,其高速度、低电压、低功耗、大电流LCD驱动能力和低价位OTP技术等都体现出单片机产业的新趋势。
现在PIC系列单片机在世界单片机市场的份额排名中已逐年升位,尤其在8位单片机市场,据称已从1990年的第20位上升到目前的第二位。PIC单片机从覆盖市场出发,已有三种(又称三层次)系列多种型号的产品问世,所以在全球都可以看到PIC单片机从电脑的外设、家电控制、电讯通信、智能仪器、汽车电子到金融电子各个领域的广泛应用。现今的PIC单片机已经是世界上最有影响力的嵌入式微控制器之一。
① PIC 8位单片机的分类
PIC 8位单片机产品共有三个系列,即基本级、中级和高级。
a基本级系列该级产品的特点是低价位,如PIC16C5X,适用于各种对成本要求严格的家电产品选用。又如PIC12C5XX是世界第一个8脚的低价位单片机,因其体积很小,完全可以应用在以前不能使用单片机的家电产品的空间。
b中级系列该级产品是PIC最丰富的品种系列。它是在基本级产品上进行了改进,并保持了很高的兼容性。外部结构也是多种的,从8引脚到68引脚的各种封装,如PIC12C6XX。该级产品其性能很高,如内部带有A/D变换器、E2PROM数据存储器、比较器输出、PWM输出、I2C和SPI等接口。PIC中级系列产品适用于各种高、中和低档的电子产品的设计中。
c高级系列该系列产品如PIC17CXX,其特点是速度快,所以适用于高速数字运算的应用场合中,加之它具备一个指令周期内(160ns)可以完成8×8(位)二进制乘法运算能力,所以可取代某些DSP产品。再有PIC17CXX具有丰富的I/O控制功能,并可外接扩展EPROM和RAM,使它成为目前8位单片机中性能最高的机种之一。所以很适用于高、中档的电子设备中使用。
上述的三层次(级)的PIC 8位单片机还具有很高的代码兼容性,用户很容易将代码从某型号转换到另一个型号中。PIC 8位单片机具有指令少、执行速度快等优点,其主要原因是PIC系列单片机在结构上与其它单片机不同。该系列单片机引入了原用于小型计算机的双总线和两级指令流水结构。这种结构与一般采用CISC(复杂指令集计算机)的单片机在结构上是有不同的。
双总线结构
具有CISC结构的单片机均在同一存储空间取指令和数据,片内只有一种总线。这种总线既要传送指令又要传送数据(如图1-a所示)。因此,它不可能同时对程序存储器和数据存储器进行访问。因与CPU直接相连的总线只有一种,要求数据和指令同时通过,显然“乱套”,这正如一个“瓶颈”,瓶内的数据和指令要一起倒出来,往往就被瓶颈卡住了。所以具有这种结构的单片机,只能先取出指令,再执行指令(在此过程中往往要取数),然后,待这条指令执行完毕,再取出另一条指令,继续执行下一条。这种结构通常称为冯•诺依曼结构,又称普林斯顿结构。
在这里PIC系列单片机采用了一种双总线结构,即所谓哈佛结构。这种结构有两种总线,即程序总线和数据总线。这两种总线可以采用不同的字长,如PIC系列单片机是八位机,所以其数据总线当然是八位。但低档、中档和高档的PIC系列机分别有12位、14位和16位的指令总线。这样,取指令时则经指令总线,取数据时则经数据总线,互不冲突。
② 两级指令流水线结构
由于PIC系列单片机采用了指令空间和数据空间分开的哈佛结构,用了两种位数不同的总线。因此,取指令和取数据有可能同时交叠进行,所以在PIC系列微控制器中取指令和执行指令就采用指令流水线结构。当第一条指令被取出后,随即进入执行阶段,这时可能会从某寄存器取数而送至另一寄存器,或从一端口向寄存器传送数等,但数据不会流经程序总线,而只是在数据总线中流动,因此,在这段时间内,程序总线有空,可以同时取出第二条指令。当第一条指令执行完毕,就可执行第二条指令,同时取出第3条指令,……如此等等。这样,除了第一条指令的取出,其余各条指令的执行和下一条指令的取出是同时进行的,使得在每个时钟周期可以获得最高效率。
在大多数微控制器中,取指令和指令执行都是顺序进行的,但在PIC单片机指令流水线结构中,取指令和执行指令在时间上是相互重叠的,所以PIC系列单片机才可能实现单周期指令。
只有涉及到改变程序计数器PC值的程序分支指令(例如GOTO、CALL)等才需要两个周期。
此外,PIC的结构特点还体现在寄存器组上,如寄存器I/O口、定时器和程序寄存器等都是采用了RAM结构形式,而且都只需要一个周期就可以完成访问和操作。而其它单片机常需要两个或两个以上的周期才能改变寄存器的内容。上述各项,就是PIC系列单片机能做到指令总数少,且大都为单周期指令的重要原因。
3)AVR系列单片机
AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。
①AVR单片机的优势及特点
a AVR单片机易于入手、便于升级、费用低廉。 单片机初学者只需一条ISP下载线,把编辑、调试通过的软件程序直接在线写入AVR单片机,即可以开发AVR单片机系列中的各种封装的器件。AVR单片机因此在业界号称“一线打天下”。 AVR程序写入是直接在电路板上进行程序修改、烧录等操作,这样便于产品升级。AVR单片机可使用ISP在线下载编程方式(即把PC机上编译好的程序写到单片机的程序存储器中),不需购买仿真器、编程器、擦抹器和芯片适配器等,即可进行所有AVR单片机的开发应用,这可节省很多开发费用。程序存储器擦写可达10000次以上,不会产生报废品。
b高速、低耗、保密。首先,AVR单片机是高速嵌入式单片机: AVR单片机具有预取指令功能,即在执行一条指令时,预先把下一条指令取进来,使得指令可以在一个时钟周期内执行。多累加器型,数据处理速度快。AVR单片机具有32个通用工作寄存器,相当于有32条立交桥,可以快速通行。中断响应速度快。AVR单片机有多个固定中断向量入口地址,可快速响应中断。AVR单片机耗能低。对于典型功耗情况,WDT关闭时为100nA,更适用于电池供电的应用设备。有的器件最低1.8 V即可工作。AVR单片机保密性能好。它具有不可破解的位加密锁Lock Bit技术,保密位单元深藏于芯片内部,无法用电子显微镜看到。
c I/O口功能强,具有A/D转换等电路。AVR单片机的I/O口是真正的I/O口,能正确反映I/O口输入/输出的真实情况。工业级产品,具有大电流(灌电流)10mA~40mA,可直接驱动可控硅SSR或继电器,节省了外围驱动器件。AVR单片机内带模拟比较器,I/O口可用作A/D转换,可组成廉价的A/D转换器。ATmega48/8/16等器件具有8路10位A/D。部分AVR单片机可组成零外设元件单片机系统,使该类单片机无外加元器件即可工作,简单方便,成本又低。AVR单片机可重设启动复位,以提高单片机工作的可靠性。有看门狗定时器实行安全保护,可防止程序走乱(飞),提高了产品的抗干扰能力。
d 有功能强大的定时器/计数器及通讯接口。定时/计数器T/C有8位和16位,可用作比较器。计数器外部中断和PWM(也可用作D/A)用于控制输出,某些型号的AVR单片机有3~4个PWM,是作电机无级调速的理想器件。AVR单片机有串行异步通讯UART接口,不占用定时器和SPI同步传输功能,因其具有高速特性,故可以工作在一般标准整数频率下,而波特率可达576K。
②AVR 8-Bit MCU的最大特点
与其它8-Bit MCU相比,AVR 8-Bit MCU最大的特点是:
• 哈佛结构,具备1MIPS / MHz的高速运行处理能力;
• 超功能精简指令集(RISC),具有32个通用工作寄存器,克服了如8051 MCU采用单一ACC进行处理造成的瓶颈现象;
• 快速的存取寄存器组、单周期指令系统,大大优化了目标代码的大小、执行效率,部分型号FLASH非常大,特别适用于使用高级语言进行开发;
• 作输出时与PIC的HI/LOW相同,可输出40mA(单一输出),作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10mA-20mA灌电流的能力;
• 片内集成多种频率的RC振荡器、上电自动复位、看门狗、启动延时等功能,外围电路更加简单,系统更加稳定可靠;
• 大部分AVR片上资源丰富:带E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comparator,WDT等;
• 大部分AVR除了有ISP功能外,还有IAP功能,方便升级或销毁应用程序。
(3)16-BIT 单片机
16 位单片机是在1983 年以后发展起来的。这类单片机的特点是:CPU是16 位的,运算速度普遍高于8 位机,有的单片机的寻址能力高达1MB,片内含有A/D 和D/A转换电路,支持高级语言。这类单片机主要用于过程控制、智能仪表、家用电器以及作为计算机外部设备的控制器等。典型产品有Intel 公司的MCS-96/98 系列、Motorola 公司的M68HC16系列、NS 公司的783××系列、TI公司的MSP430系列等等。
其中,以MSP430系列最为突出。它采用了精简指令集( RISC )结构,具有丰富的寻址方式( 7 种源操作数寻址、 4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度,在 8MHz 晶体驱动下指令周期为 125 ns 。这些特点保证了可编制出高效率的源程序。
在运算速度方面, MSP430 系列单片机能在 8MHz 晶体的驱动下,实现 125ns 的指令周期。 16 位的数据宽度、 125ns 的指令周期以及多功能的硬件乘法器(能实现乘加)相配合,能实现数字信号处理的某些算法(如 FFT 等)。
MSP430 系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。当系统处于省电的备用状态时,用中断请求将它唤醒只用 6us 。
超低功耗 MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。
首先, MSP430 系列单片机的电源电压采用的是 1.8~3.6V 电压。因而可使其在 1MHz 的时钟条件下运行时, 芯片的电流会在 200~400uA 左右,时钟关断模式的最低功耗只有 0.1uA 。
其次,独特的时钟系统设计。在 MSP430 系列中有两个不同的系统时钟系统:基本时钟系统和锁频环( FLL 和 FLL+ )时钟系统或 DCO 数字振荡器时钟系统。有的使用一个晶体振荡器( 32768Hz ) , 有的使用两个晶体振荡器)。由系统时钟系统产生 CPU 和各功能所需的时钟。并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。
由于系统运行时打开的功能模块不同,即采用不同的工作模式,芯片的功耗有着显着的不同。在系统中共有一种活动模式( AM )和五种低功耗模式( LPM0~LPM4 )。在等待方式下,耗电为 0.7uA ,在节电方式下,最低可达 0.1uA 。
系统工作稳定 上电复位后,首先由 DCOCLK 启动 CPU ,以保证程序从正确的位置开始执行,保证晶体振荡器有足够的起振及稳定时间。然后软件可设置适当的寄存器的控制位来确定最后的系统时钟频率。如果晶体振荡器在用做 CPU 时钟 MCLK 时发生故障, DCO 会自动启动,以保证系统正常工作;如果程序跑飞,可用看门狗将其复位。
丰富的片上外围模块 MSP430 系列单片机的各成员都集成了较丰富的片内外设。它们分别是看门狗( WDT )、模拟比较器 A 、定时器 A ( Timer_A )、定时器 B ( Timer_B )、串口 0 、 1 ( USART0 、 1 )、硬件乘法器、液晶驱动器、 10 位 /12 位 ADC 、 I 2 C 总线直接数据存取( DMA )、端口 O ( P0 )、端口 1~6 ( P1~P6 )、基本定时器( Basic Timer )等的一些外围模块的不同组合。其中,看门狗可以使程序失控时迅速复位;模拟比较器进行模拟电压的比较,配合定时器,可设计出 A/D 转换器; 16 位定时器( Timer_A 和 Timer_B )具有捕获 / 比较功能,大量的捕获 / 比较寄存器,可用于事件计数、时序发生、 PWM 等;有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通信等应用;具有较多的 I/O 端口,最多达 6*8 条 I/O 口线; P0 、 P1 、 P2 端口能够接收外部上升沿或下降沿的中断输入; 12/14 位硬件 A/D 转换器有较高的转换速率,最高可达 200kbps ,能够满足大多数数据采集应用;能直接驱动液晶多达 160 段;实现两路的 12 位 D/A 转换;硬件 I 2 C 串行总线接口实现存储器串行扩展;以及为了增加数据传输速度,而采用直接数据传输( DMA )模块。 MSP430 系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。
方便高效的开发环境 目前 MSP430 系列有 OPT 型、 FLASH 型和 ROM 型三种类型的器件,这些器件的开发手段不同。对于 OPT 型和 ROM 型的器件是使用仿真器开发成功之后在烧写或掩膜芯片;对于 FLASH 型则有十分方便的开发调试环境,因为器件片内有 JTAG 调试接口,还有可电擦写的 FLASH 存储器,因此采用先下载程序到 FLASH 内,再在器件内通过软件控制程序的运行,由 JTAG 接口读取片内信息供设计者调试使用的方法进行开发。这种方式只需要一台 PC 机和一个 JTAG 调试器,而不需要仿真器和编程器。开发语言有汇编语言和 C 语言。
MSP430 单片机目前主要以 FLASH 型为主。
(4)32-BIT 单片机
32 位单片机的字长为32 位,是单片机的顶级产品,具有极高的运算速度。近年来,随着家用电子系统的新发展,32 位单片机的市场前景看好。
继16 位单片机出现后不久,几大公司先后推出了代表当前最高性能和技术水平的32 位单片微机系列。32 位单片机具有极高的集成度,内部采用新颖的RISC(精简指令系统计算机)结构,CPU 可与其他微控制器兼容,主频频率可达33MHz 以上,指令系统进一步优化,运算速度可动态改变,设有高级语言编译器,具有性能强大的中断控制系统、定时/事件控制系统、同步/异步通信控制系统。代表产品有Intel 公司的MCS-80960 系列、Motorola 公司的M68300 系列、Hitachi 公司的Super H(简称SH)系列等等。
这类单片机主要应用于汽车、航空航天、高级机器人、军事装备等方面。它代表着单片机发展中的高、新技术水平。
ARM在32位MCU中的主流地位是毫无疑问的。ARM公司于1991年成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术智能财产(IP)核心的处理器,即我们通常所说的ARM处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的处理器应用约占据了32位RISC微处理器75%以上的市场,ARM技术不止逐步渗入到我们生活的各个方面,我们甚至可以说,ARM于人类的生活环境中,已经是不可或缺的一环。
目前市面上常见的ARM处理器架构,可分为ARM7、ARM9以及ARM11,新推出的Cortex系列尚在进行开发验证,市面上还未有相关产品推出。ARM也是嵌入式处理器中首先推出多核心架构的厂商。
ARM首个多核心架构为ARM11 MPCore,架构于原先的ARM11处理器核心之上。ARM11核心是发布于2002年10月份,为了进一步提升效能,其管线长度扩展到8阶,处理单元则增加为预取、译码、发送、转换/MAC1、执行/MAC2、内存存取/MAC3和写入等八个单元,体系上属于ARM V6指令集架构。ARM11采用当时最先进的0.13μm制造制程,运行频率最高可达500到700MHz。如果采用90nm制程,ARM11核心的工作频率能够轻松达到1GHz以上—对于嵌入式处理器来说,这显然是个相当惊人的程度,不过显然1GHz在ARM11体系中不算是个均衡的设定,因此几乎没有厂商推出达到1GHz的ARM11架构处理器。
ARM11的逻辑核心也经过大量的改进,其中最重要的当属“静/动态组合转换的预测功能”。ARM11的执行单元包含一个64位、4种状态的地址转换缓冲,它主要用来储存最近使用过的转换地址。当采用动态转换预测机制而无法在寻址缓冲内找到正确的地址时,静态转换预测功能就会立刻接替它的位置。在实际测试中,单纯采用动态预测的准确率为88%,单纯采用静态预测机制的准确率只有77%,而ARM11的静/动态预测组合机制可实现92%的高准确率。针对高时脉速度带来功耗增加的问题,ARM11采用一项名为“IEM(Intelligent Energy Manager)”的智能电源管理技术,该技术可根据任务负荷情况动态调节处理器的电压,进而有效降低自身的功耗。这一系列改进让ARM11的功耗效能比得以继续提高,平均每MHz只需消耗0.6mW(有快取时为0.8mW)的电力,处理器的最高效能可达到660 Dhrystone MIPS,远超过上一代产品。
Ⅲ 按制造工艺分
① HMOS 工艺 高密度短沟道MOS 工艺,具有高速度、高密度的特点。
② CHMOS(或HCMOS)工艺 互补的金属氧化物的HMOS 工艺,是CMOS 和HMOS 的结合,具有高密度、高速度、低功耗的特点。Intel 公司产品型号中若带有字母“C” ,Motorola 公司产品型号中若带有字母“HC”或“L” ,通常为CHMOS 工艺。

③ AVR单片机的发展起源

AVR单片机是 Atmel 公司 1997 年推出的 RISC 单片机。RISC(精简指令系统计算机)是相对于CISC(复杂指令系统计算机)而言的。RISC 并非只是简单地去减少指令,而是通过使计算机的结构更加简单合理而提高运算速度的。RISC 优先选取使用频率最高的简单指令,避免复杂指令:并固定指令宽度,减少指令格式和寻址方式的种类,从而缩短指令周期,提高运行速度。由于 AVR 采用了 RISC 的这种结构,使AVR系列单片机都具备了1MIPS/MHz(百万条指令每秒/兆赫兹)的高速处理能力。
早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观(51以及51兼容)。此间虽有某些精简指令集单片机(RISC)问世,但依然沿袭对时钟分频的作法。
AVR单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂指令计算机(CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指令。当然这种速度上的升跃,是以高可靠性为其后盾的。
AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。
AVR单片机内嵌高质量的Flash程序存储器,擦写方便,支持ISP和IAP,便于产品的调试、开发、生产、更新。内嵌长寿命的EEProm可长期保存关键数据,避免断电丢失。片内大容量的RAM不仅能满足一般场合的使用,同时也更有效的支持使用高级语言开发系统程序,并可像MCS-51单片机那样扩展外部RAM。
AVR单片机的I/O线全部带可设置的上拉电阻、可单独设定为输入/输出、可设定(初始)高阻输入、驱动能力强(可省去功率驱动器件)等特性,使的得I/O口资源灵活、功能强大、可充分利用。
AVR单片机片内具备多种独立的时钟分频器,分别供URAT、I2C、SPI使用。其中与8/16位定时器配合的具有多达10位的预分频器,可通过软件设定分频系数提供多种档次的定时时间。
AVR单片机独有的“以定时器/计数器(单)双向计数形成三角波,再与输出比较匹配寄存器配合,生成占空比可变、频率可变、相位可变方波的设计方法(即脉宽调制输出PWM)更是令人耳目一新。
增强性的高速同/异步串口,具有硬件产生校验码、硬件检测和校验侦错、两级接收缓冲、波特率自动调整定位(接收时)、屏蔽数据帧等功能,提高了通信的可靠性,方便程序编写,更便于组成分布式网络和实现多机通信系统的复杂应用,串口功能大大超过MCS-51/96单片机的串口,加之AVR单片机高速,中断服务时间短,故可实现高波特率通讯。
面向字节的高速硬件串行接口TWI、SPI。TWI与I2C接口兼容,具备ACK信号硬件发送与识别、地址识别、总线仲裁等功能,能实现主/从机的收/发全部4种组合的多机通信。SPI支持主/从机等4种组合的多机通信。
AVR单片机有自动上电复位电路、独立的看门狗电路、低电压检测电路BOD,多个复位源(自动上下电复位、外部复位、看门狗复位、BOD复位),可设置的启动后延时运行程序,增强了嵌入式系统的可靠性。
AVR单片机具有多种省电休眠模式,且可宽电压运行(5-2.7V),抗干扰能力强,可降低一般8位机中的软件抗干扰设计工作量和硬件的使用量。
AVR系列单片机的选型
AVR单片机系列齐全,可适用于各种不同场合的要求。
AVR单片机有3个档次:
低档Tiny系列:主要有Tiny11/12/13/15/26/28等;
中档AT90S系列:主要有AT90S1200/2313/8515/8535等;(正在淘汰或转型到Mega中)
高档ATmega:主要有ATmega8/16/32/64/128(存储容量为8/16/32/64/128KB)以及ATmega8515/8535等。
AVR器件引脚从8脚到64脚,还有各种不同封装供选择。 ⒈型号紧跟的字母,表示电压工作范围。带“V”:1.8-5.5V;若缺省,不带“V”:2.7-5.5V。
例:ATmega48-20AU,不带“V”表示工作电压为2.7-5.5V。
⒉后缀的数字部分,表示支持的最高系统时钟。
例:ATmega48-20AU,“20”表示可支持最高为20MHZ的系统时钟。
⒊后缀第一(第二)个字母,表示封装。“P”:DIP封装,“A”:TQFP封装,“M”:MLF封装。
例:ATmega48-20AU,“A”表示TQFP封装。
⒋后缀最后一个字母,表示应用级别。“C”:商业级,“I”:工业级(有铅)、“U”工业级(无铅)。
例:ATmega48-20AU,“U”表示无铅工业级。ATmega48-20AI,“I”表示有铅工业级。 该系统模块的控制核心是AVR高速单片机ATmega8。AVR单片机是新一代基于哈佛结构的高速RISC微控制器,具有速度快、价格低、可靠性高,I/O口线驱动能力强和片内集成外设资源丰富等特点,其内部集成有可进行ISP下载编程的Flash,EEPROM、熔丝位和锁定位。AVR单片机的ISP下载电缆制作简单、成本低廉,还有免费的下载软件(例如PonyProg)支持。PDIUSBD12是一款高性价比USB接口器件,完全符合USB1.l规范,易于与各种微处理器接口。
系统模块AVR单片机与PDIUSBD12的电路连接如图1所示。
由图1看出,由于AVR单片机具有高速性,可利用I/O端口线以软件方式模拟PDIUSBD12的时序,对其读写。这种方式可根据不同的微处理器速度灵活控制PDIUSBD12的时序和地址,无需译码电路,从而简化硬件设计,降低成本。
由于ATmega8片内集成了UART,SPI,I2C等接口,该接口模块可利用这些接口与其他系统通信,使得该接口模块成为通用的接口转换器。其系统硬件结构框图如图2所示。 AVR已被广泛用于: 空调控制板 打印机控制板 智能电表 智能手电筒 LED控制屏 医疗设备 GPS

④ 单片机系统软件抗干扰方法

在提高硬件系统抗干扰能力的同时 软件抗干扰以其设计灵活 节省硬件资源 可靠性好越来越受到重视 下面以MCS 单片机系统为例 对微机系统软件抗干扰方法进行研究

软件抗干扰方法的研究

在工程实践中 软件抗干扰研究的内容主要是 一 消除模拟输入信号的嗓声(如数字滤波技术) 二 程序运行混乱时使程序重入正轨的方法 本文针对后者提出了几种有效的软件抗干扰方法

指令冗余

CPU取指令过程是先取操作码 再取操作数 当PC受干扰出现错误 程序便脱离正常轨道 乱飞 当乱飞到某双字节指令 若取指令时刻落在操作数上 误将操作数当作操作码 程序将出错 若 飞 到了三字节指令 出错机率更大

在关键地方人为插入一些单字节指令 或将有效单字节指令重写称为指令冗余 通常是在双字节指令和三字节指令后插入两个字节以上的NOP 这样即使乱飞程序飞到操作数上 由于空操作指令NOP的存在 避免了后面的指令被当作操作数执行 程序自动纳入正轨

此外 对系统流向起重要作用的指令如RET RETI LCALL LJMP JC等指令之前插入两条NOP 也可将乱飞程序纳入正轨 确保这些重要指令的执行

拦截技术

所谓拦截 是指将乱飞的程序引向指定位置 再进行出错处理 通常用软件陷阱来拦截乱飞的程序 因此先要合理设计陷阱 其次要将陷阱安排在适当的位置

软件陷阱的设计

当乱飞程序进入非程序区 冗余指令便无法起作用 通过软件陷阱 拦截乱飞程序 将其引向指定位置 再进行出错处理 软件陷阱是指用来将捕获的乱飞程序引向复位入口地址 H的指令 通常在EPROM中非程序区填入以下指令作为软件陷阱

NOP

NOP

LJMP H

其机器码为

陷阱的安排

通常在程序中未使用的EPROM空间填 最后一条应填入 当乱飞程序落到此区 即可自动入轨 在用户程序区各模块之间的空余单元也可填入陷阱指令 当使用的中断因干扰而开放时 在对应的中断服务程序中设置软件陷阱 能及时捕获错误的中断 如某应用系统虽未用到外部中断 外部中断 的中断服务程序可为如下形式

NOP

NOP

RETI

返回指令可用 RETI 也可用 LJMP H 如果故障诊断程序与系统自恢复程序的设计可靠 完善 用 LJMP H 作返回指令可直接进入故障诊断程序 尽早地处理故障并恢复程序的运行

考虑到程序存贮器的容量 软件陷阱一般 K空间有 个就可以进行有效拦截

软件 看门狗 技术

若失控的程序进入 死循环 通常采用 看门狗 技术使程序脱离 死循环 通过不断检测程序循环运行时间 若发现程序循环时间超过最大循环运行时间 则认为系统陷入 死循环 需进行出错处理

看门狗 技术可由硬件实现 也可由软件实现 在工业应用中 严重的干扰有时会破坏中断方式控制字 关闭中断 则系统无法定时 喂狗 硬件看门狗电路失效 而软件看门狗可有效地解决这类问题

笔者在实际应用中 采用环形中断监视系统 用定时器T 监视定时器T 用定时器T 监视主程序 主程序监视定时器T 采用这种环形结构的软件 看门狗 具有良好的抗干扰性能 大大提高了系统可靠性 对于需经常使用T 定时器进行串口通讯的测控系统 则定时器T 不能进行中断 可改由串口中断进行监控(如果用的是MCS 系列单片机 也可用T 代替T 进行监视) 这种软件 看门狗 监视原理是 在主程序 T 中断服务程序 T 中断服务程序中各设一运行观测变量 假设为MWatch T Watch T Watch 主程序每循环一次 MWatch加1 同样T T 中断服务程序执行一次 T Watch T Watch加1 在T 中断服务程序中通过检测T Watch的变化情况判定T 运行是否正常 在T 中断服务程序中检测MWatch的变化情况判定主程序是否正常运行 在主程序中通过检测T Watch的变化情况判别T 是否正常工作 若检测到某观测变量变化不正常 比如应当加 而未加 则转到出错处理程序作排除故障处理 当然 对主程序最大循环周期 定时器T 和T 定时周期应予以全盘合理考虑 限于篇幅不赘述

系统故障处理 自恢复程序的设计

单片机系统因干扰复位或掉电后复位均属非正常复位 应进行故障诊断并能自动恢复非正常复位前的状态

非正常复位的识别

程序的执行总是从 H开始 导致程序从 H开始执行有四种可能 一 系统开机上电复位 二 软件故障复位 三 看门狗超时未喂狗硬件复位 四 任务正在执行中掉电后来电复位 四种情况中除第一种情况外均属非正常复位 需加以识别

硬件复位与软件复位的识别

此处硬件复位指开机复位与看门狗复位 硬件复位对寄存器有影响 如复位后PC= H SP= H PSW= H等 而软件复位则对SP SPW无影响 故对于微机测控系统 当程序正常运行时 将SP设置地址大于 H 或者将PSW的第 位用户标志位在系统正常运行时设为 那么系统复位时只需检测PSW 标志位或SP值便可判此是否硬件复位 图 是采用PSW 作上电标志位判别硬 软件复位的程序流程图

图 硬 软件复位识别流程图

此外 由于硬件复位时片内RAM状态是随机的 而软件复位片内RAM则可保持复位前状态 因此可选取片内某一个或两个单元作为上电标志 设 H用来做上电标志 上电标志字为 H 若系统复位后 H单元内容不等于 H 则认为是硬件复位 否则认为是软件复位 转向出错处理 若用两个单元作上电标志 则这种判别方法的可靠性更高

开机复位与看门狗故障复位的识别

开机复位与看门狗故障复位因同属硬件复位 所以要想予以正确识别 一般要借助非易失性RAM或者EEROM 当系统正常运行时 设置一可掉电保护的观测单元 当系统正常运行时 在定时喂狗的中断服务程序中使该观测单元保持正常值(设为 AAH) 而在主程中将该单元清零 因观测单元掉电可保护 则开机时通过检测该单元是否为正常值可判断是否看门狗复位

正常开机复位与非正常开机复位的识别

识别测控系统中因意外情况如系统掉电等情况引起的开机复位与正常开机复位 对于过程控制系统尤为重要 如某以时间为控制标准的测控系统 完成一次测控任务需 小时 在已执行测控 分钟的情况下 系统电压异常引起复位 此时若系统复位后又从头开始进行测控则会造成不必要的时间消耗 因此可通过一监测单元对当前系统的运行状态 系统时间予以监控 将控制过程分解为若干步或若干时间段 每执行完一步或每运行一个时间段则对监测单元置为关机允许值 不同的任务或任务的不同阶段有不同的值 若系统正在进行测控任务或正在执某时间段 则将监测单元置为非正常关机值 那么系统复位后可据此单元判系统原来的运行状态 并跳到出错处理程序中恢复系统原运行状态

非正常复位后系统自恢复运行的程序设计

对顺序要求严格的一些过程控制系统 系统非正常复位否 一般都要求从失控的那一个模块或任务恢复运行 所以测控系统要作好重要数据单元 参数的备份 如系统运行状态 系统的进程值 当前输入 输出的值 当前时钟值 观测单元值等 这些数据既要定时备份 同时若有修改也应立即予以备份

当在已判别出系统非正常复位的情况下 先要恢复一些必要的系统数据 如显示模块的初始化 片外扩展芯片的初始化等 其次再对测控系统的系统状态 运行参数等予以恢复 包括显示界面等的恢复 之后再把复位前的任务 参数 运行时间等恢复 再进入系统运行状态

应当说明的是 真实地恢复系统的运行状态需 要极为细致地对系统的重要数据予以备份 并加以数据可靠性检查 以保证恢复的数据的可靠性

其次 对多任务 多进程测控系统 数据的恢复需考虑恢复的次序问题 笔者实际应用的数据恢复过程流程图如图 所示

图 系统自恢复程序流程图

图中恢复系统基本数据是指取出备份的数据覆盖当前的系统数据 系统基本初始化是指对芯片 显示 输入输出方式等进行初始化 要注意输入输出的初始化不应造成误动作 而复位前任务的初始化是指任务的执行状态 运行时间等

结束语

lishixin/Article/program/qrs/201311/11074

⑤ 单片机中mtouch、CCP、ECCP、AUSART、EUSART、FS-USB、ECAN、BOR、PBOR、PLVD、SR-Latch是什么意思求解

CCP:捕捉、比较、脉宽调制(PWM)。这个模块可配置为工作在输入捕捉、定时器比较或 PWM 输出方式下
ECCP模块实现为具有增强型 PWM 功能的标准 CCP 模块。这些功能包括 2 或4 路输出通道、用户可选极性、死区控制和自动关闭与重启。 PWM 的增强型模式,ECCP模块的捕捉、 比较和单输出PWM功能与标准 CCP模块的相同。
AUSART,可寻址的通用同步异步串行口。EUSART,增强型的通用同步异步串行口。增强型的增加了一些性能,如:波特率自动检测和校准,更宽的波特率设置范围,以及一些适应LIN总线系统的性能。具体请看数据手册
BOR(欠压复位)模块是基于内部参考电压电路的。BOR 模块的主要用途是在发生欠压条件时
产生器件复位。欠压条件通常由 AC 电源上的干扰信号(即由于不良的电源传输线路造成的 AC
周期波形丢失)或接入大负载时过电流造成电压下降产生的。
POR:上电复位
PBOR:可编程的掉电锁定复位。
PLVD :可编程低压检测模块执行中断驱动的电源电压检测功能。电压检测监视内部电源电压。
ECAN 增强型控制器局域网模块是一个串行接口,用于同其他 CAN 模块或单片机器件进行通信。

⑥ 51单片机关于密码锁的毕业设计,论文

程序设计内容

(1). 密码的设定,在此程序中密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。

(2). 密码的输入问题:由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。

(3).按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。

C语言源程序

#includeunsignedcharcodeps[]={1,2,3,4,5};

unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,                              

0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

unsignedcharpslen=9;unsignedchartemplen;

unsignedchardigit;unsignedcharfuncount;

unsignedchardigitcount;

unsignedcharpsbuf[9];

bitcmpflag;

bithibitflag;

biterrorflag;

bitrightflag;

unsignedintsecond3;

unsignedintaa;

unsignedintbb;

bitalarmflag;

bitexchangeflag;

unsignedintcc;

unsignedintdd;

bitokflag;

unsignedcharoka;

unsignedcharokb;

voidmain(void)

{ 

unsignedchari,j; 

P2=dispcode[digitcount]; 

TMOD=0x01; 

TH0=(65536-500)/256; 

TL0=(65536-500)%6; 

TR0=1; 

ET0=1; 

EA=1; 

while(1)  

 {     

if(cmpflag==0)       

{         

if(P3_6==0)//functionkey          

 {             

for(i=10;i>0;i--)             

for(j=248;j>0;j--);     

        if(P3_6==0)               

{               

  if(hibitflag==0)      

             {    

                 funcount++; 

                    if(funcount==pslen+2)

                       { 

                        funcount=0;

                         cmpflag=1;

                        }

                      P1=dispcode[funcount];

                   }

                   else

                     {

                        second3=0;

                     } 

                while(P3_6==0);

               }

           }

         if(P3_7==0)//digitkey

           {

             for(i=10;i>0;i--)

             for(j=248;j>0;j--);

             if(P3_7==0)

               {

                 if(hibitflag==0)

                   {

                     digitcount++; 

                 if(digitcount==10)

                       {

                         digitcount=0;

                       }

                     P2=dispcode[digitcount];

                     if(funcount==1)

                       {

                         pslen=digitcount;                         

templen=pslen;

                       }

                       elseif(funcount>1)

                         { 

                          psbuf[funcount-2]=digitcount;

                         }

                   }

                   else

                     {

                       second3=0;

                     }

                 while(P3_7==0);

               }

           }

       } 

      else

         {

           cmpflag=0;

           for(i=0;i

             { 

              if(ps[i]!=psbuf[i])

                 {

                   hibitflag=1;

                   i=pslen;

                   errorflag=1;

                   rightflag=0;

                   cmpflag=0;

                   second3=0;

                   gotoa; 

                }

             }  

         cc=0; 

          errorflag=0; 

          rightflag=1;

           hibitflag=0;

a:   cmpflag=0;

         }

}

}

voidt0(void)

interrupt1using0{ TH0=(65536-500)/256; 

TL0=(65536-500)%6; 

if((errorflag==1)&&(rightflag==0)) 

{

     bb++;

     if(bb==800)

       {

         bb=0;

         alarmflag=~alarmflag;

       }

     if(alarmflag==1)

       {

         P0_0=~P0_0;

       }

     aa++;

     if(aa==800)

       {

         aa=0;

         P0_1=~P0_1;

       }

     second3++;

     if(second3==6400)

       {

         second3=0;

         hibitflag=0;

         errorflag=0;

         rightflag=0;

         cmpflag=0;

         P0_1=1; 

        alarmflag=0;

         bb=0; 

        aa=0; 

      }

   }

 if((errorflag==0)&&(rightflag==1))

   {

     P0_1=0;

     cc++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cc<1000)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okflag=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif(cc<2000)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibitflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmpflag=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_1=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oka=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okb=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okflag=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_0=1;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(okflag==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oka++;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(oka==2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oka=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_0=~P0_0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okb++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(okb==3)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;okb=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0_0=~P0_0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;}

}

阅读全文

与锁步双冗余单片机相关的资料

热点内容
安卓的游戏数据如何转入苹果 浏览:271
app里的支付账户如何修改 浏览:56
linux当前句柄数 浏览:513
怎么加密数字资产 浏览:444
学习python的好书 浏览:630
巨灵鸟php源码ERP破解版 浏览:38
长春编译ipfs制作 浏览:356
程序员业绩表述 浏览:248
云服务器可以下载软件吗 浏览:130
纯蓝无毛猫解压 浏览:564
privatetracker服务器如何搭建 浏览:591
手机c语言怎么编译 浏览:176
双喜地板指标公式源码 浏览:527
app窥探隐私到哪里投诉 浏览:713
decimal数据加密 浏览:646
游戏模型加密了如何破解 浏览:309
北京服务器硬盘回收门店云主机 浏览:837
神探狄仁杰5在哪个app可以观看 浏览:697
云南中级程序员实战培训 浏览:674
安卓软件什么平台比较好 浏览:153