单片机

许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢?今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同。

单片机c语言比起普通C语言增加了一些基本的指令,变量的赋值是16进制,当然单片机c语言只牵涉到普通c语言的基础部分。

具体体现在:

1.单片机中C的语法一般都对 ANSI C有些扩展,及一些特殊写法 如C51扩展的 data xdata bit sbit 一类的,还有一些中断程序写法 void int() interrput 1 一类的。

2.C是一门语言,由对应平台的编译器编译成对应平台汇编的程序,各平台的汇编不一样,当然编译器也不一样 DOS上的TC2 TC3 WINDOWS上的VC 8051的C51都有自已的编译器 。具体区别是由编译器决的,只能参考对应的编译手册,即使同种平台不同的编译器对C的扩展也有不同。

3.单片机c语言编程是基于C语言的单片机编程。单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短、运行速度高、存储空间小、符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。

C51本质就是C,是为在单片机上使用C而出来的,如果C不牢固,还是多掌握一点C再学C51,不过新增的知识也不少,而且基本上跟C无关。

4.C只是一种高级语言。它除具有一般高级语言的功能特性外,它可以很好的操作底层的硬件接口。在C语言的基础上,如果你把一些单片机的端口或特殊功能寄存器加于定义,使之方便于在 写语句的时候,直接直观的编写。这样就差不多是单片机C语言。

结语:C语言是我们入门编程所学习的一门语言,也是IOS开发、单片机开发等应用上具有重要应用的一门语言,虽然C语言与单片机C语言、C++、C#等有或小或大的差异,但他们的编译机理、表达形式都是一样的!

来源:https://segmentfault.com/a/1190000020185943

围观 88

单片机应用中,常常会遇到这种情况,在用单片机制作电子钟或要求根据时钟启控的控制系统时,会突然发现当初校准了的电子时钟的时间竟然变快或是变慢了。

于是,尝试用各种方法来调整它的走时精度,但是最终的效果还是不尽人意,只好每过一段时间手动调整一次。那么,是否可使时钟走时更精确些呢?现探讨如下:

一、误差原因分析

1.单片机电子时钟的计时脉冲基准,是由外部晶振的频率经过12分频后提供的,采用内部的定时,计数器来实现计时功能。所以,外接晶振频率的精确度直接影响电子钟计时的准确性。

2.单片机电子时钟利用内部定时,计数器溢出产生中断(12MHz晶振一般为50ms)再乘以相应的倍率,来实现秒、分、时的转换。大家都知道,从定时,计数器产生中断请求到响应中断,需要3_8个机器周期。定时中断子程序中的数据人栈和重装定时,计数器的初值还需要占用数个机器周期。此外。从中断人口转到中断子程序也要占用一定的机器周期。例如:


从上述程序可以看出,从中断人口到定时/计数器初值的低8位装入需要占用2+2+2=6个机器周期。所以,在编程时一般会把这6个机器周期加入定时/计数器的初值中。但是,从定时,计数器溢出中断请求到执行中断需要几个机器周期(3~8个机器周期)。就很难确定准确值,正是这一原因导致了电子时钟计时的不准。

二、解决方法

1、采用高精度晶振方案

虽然采用高精度的晶振可以稍微提高电子钟计时的精确度,但是晶振并不是导致电子钟计时不准的主要因素,而且高精度的晶振价格较高,所以不必采用此方案。

2、动态同步修正方案
从程序人手,采用动态同步修正方法给定时,计数器赋初值。动态同步修正方法如下:由于定时,计数器溢出后,又会从O开始自动加数,故在给定时/计数器再次赋值前,先将定时,计数器低位(TLO)中的值和初始值相加,然后送人定时,计数器中,此时定时,计数器中的值即为动态同步修正后的准确值。具体程序如下:


采用此种方法后,相信制作的电子时钟的精度已有提高了。

3、自动调整方案

采用同步修正方案后,电子时钟的精度虽然提高了很多,但是由于晶振频率的偏差和一些其他未知因素的影响(同一块电路板、同样的程序换了一片单片机后,走时误差不一样,不知是何原因),时间长了仍然会有积累误差。为此,可采用自动调整方案。实际上是一种容错技术。其自动调整原理为:实测出误差Is所需的时间,然后每隔这样一段时间后就对秒进行加“1”或减“1”调整。例如:电子钟每过50小时就慢1秒,其自动调整程序如下:


以下是一个完整实例:



结语

使用此方法调整较费时间,但效果非常好。经实验,一次调整可/以将月误差控制在Is左右,如按此方法再次测出误差Is所需的天数并进行二次调整,其精度会更高。

来源:网络

围观 41

单片机(Microcontroller)一般都有内部ROM/EEPROM/FLASH供用户存放程序。为了防止未经授权访问或拷贝单片机的机内程序,大部分单片机都带有加密锁定位或者加密字节,以保护片内程序。如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机内的程序,这就是所谓拷贝保护或者说锁定功能。

事实上,这样的保护措施很脆弱,很容易被破解。单片机攻击者借助专用设备或者自制设备,利用单片机芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取单片机内程序。因此,作为电子产品的设计工程师非常有必要了解当前单片机攻击的最新技术,做到知己知彼,心中有数,才能有效防止自己花费大量金钱和时间辛辛苦苦设计出来的产品被人家一夜之间仿冒的事情发生。

单片机攻击技术

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

(1)软件攻击

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

(2)电子探测攻击

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

(3)过错产生技术

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

(4)探针技术

该技术是直接暴露芯片内部连线,然后观察、操控、干扰单片机以达到攻击目的。为了方便起见,人们将以上四种攻击技术分成两类,一类是侵入型攻击(物理攻击),这类攻击需要破坏封装,然后借助半导体测试设备、显微镜和微定位器,在专门的实验室花上几小时甚至几周时间才能完成。所有的微探针技术都属于侵入型攻击。另外三种方法属于非侵入型攻击,被攻击的单片机不会被物理损坏。在某些场合非侵入型攻击是特别危险的,这是因为非侵入型攻击所需设备通常可以自制和升级,因此非常廉价。大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反,侵入型的探针攻击则不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品。因此,对单片机的攻击往往从侵入型的反向工程开始,积累的经验有助于开发更加廉价和快速的非侵入型攻击技术。

侵入型攻击的一般过程

侵入型攻击的第一步是揭去芯片封装。有两种方法可以达到这一目的:第一种是完全溶解掉芯片封装,暴露金属连线。第二种是只移掉硅核上面的塑料封装。第一种方法需要将芯片绑定到测试夹具上,借助绑定台来操作。第二种方法除了需要具备攻击者一定的知识和必要的技能外,还需要个人的智慧和耐心,但操作起来相对比较方便。芯片上面的塑料可以用小刀揭开,芯片周围的环氧树脂可以用浓硝酸腐蚀掉。热的浓硝酸会溶解掉芯片封装而不会影响芯片及连线。该过程一般在非常干燥的条件下进行,因为水的存在可能会侵蚀已暴露的铝线连接。接着在超声池里先用丙酮清洗该芯片以除去残余硝酸,然后用清水清洗以除去盐分并干燥。没有超声池,一般就跳过这一步。

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

对于使用了防护层来保护EEPROM单元的单片机来说,使用紫外光复位保护电路是不可行的。对于这种类型的单片机,一般使用微探针技术来读取存储器内容。在芯片封装打开后,将芯片置于显微镜下就能够很容易的找到从存储器连到电路其它部分的数据总线。

由于某种原因,芯片锁定位在编程模式下并不锁定对存储器的访问。利用这一缺陷将探针放在数据线的上面就能读到所有想要的数据。在编程模式下,重启读过程并连接探针到另外的数据线上就可以读出程序和数据存储器中的所有信息。

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

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

应对单片机破解的几点建议

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

(1)在选定加密芯片前,要充分调研,了解单片机破解技术的新进展,包括哪些单片机是已经确认可以破解的。尽量不选用已可破解或同系列、同型号的芯片。
(2)尽量不要选用MCS51系列单片机,因为该单片机在国内的普及程度最高,被研究得也最透。
(3)产品的原创者,一般具有产量大的特点,所以可选用比较生僻、偏冷门的单片机来加大仿冒者采购的难度。
(4)选择采用新工艺、新结构、上市时间较短的单片机,如ATMELAVR系列单片机等。
(5)在设计成本许可的条件下,应选用具有硬件自毁功能的智能卡芯片,以有效对付物理攻击。
(6)如果条件许可,可采用两片不同型号单片机互为备份,相互验证,从而增加破解成本。
(7)打磨掉芯片型号等信息或者重新印上其它的型号,以假乱真。当然,要想从根本上防止单片机被解密,程序被盗版等侵权行为发生,只能依靠法律手段来保障。

来源:网络

围观 22

单片机的选型是一件重要而费心的事,如果选型得当,则做出来的产品就会性价比较高,且工作稳定;反之,则可能会造成产品成本过高或影响产品正常运行,甚至可能根本就达不到预先设计要求。

一般来说,总的选型原则是:
(1)“芯片含有(功能或数量)略大于设计需求”,“设计需求尽可能(用)芯片完成(少用外围器件)”;
(2)“选大(大厂)不选小,选多(供应量多)不选少,选名(名牌)不选渺(飘渺,不知详情的厂子),选廉(廉价)但要好(质量保证)”。具体要从单片机应用的技术性、实用性和开可发性等方面来考虑:

1、内存

单片机FLASH的容量根据程序的大小确定,FLASH容量必须大于代码量。举例来说,如果你的代码量大约50 KB,那么建议你选择FLASH容量为64 KB或128 KB的单片机。

2、速度

单片机的运行速度首先看时钟频率,一般情况对于同一种结构的单片机,时钟频率越高速度越快。如果你的设计对速度要求很高,那么要选择一个运行速度较快的单片机。例如,一般情况下,电机控制应用大多采用100ksps或更高的采样速率,因此当单片机用于电机控制时,时钟频率要足够高。总之,在选用单片机时要根据产品需要选择时钟频率,不要片面追求高速度,时钟频率越高功耗也就越大。此外,单片机的稳定性、抗干扰性等参数基本上跟单片机的运行速度成反比。因此,要尽量寻找可以在很高的时钟频率下运行而功耗又不高的单片机。

3、外设需求

如果你的设计需要ADC、SPI、GPIO、USB等之类的外设,那么你需要寻找一款集成所有这些外设的单片机。因为,使用一个具有上述外设的单片机显然比使用一个普通的单片机及外围加一个单独的ADC更为经济。此外,外设集成于单片机同时也意味着更低的功耗,因为没有可以产生功耗的外围电路,也没有用于连接外围电路的能产生功耗的敷铜,只有单片机本身产生功耗。

4、方便的开发工具

这是个非常重要的方面,因为开发工具可以极大地影响你所设计的产品的功耗。很多公司都已经开发出了具有代码优化功能的编译器,所以当你编译代码的时候,编译器会告知具体编译信息,你可以根据编译信息优化代码以降低功耗。举例来说,如果你的设计需要用到ADC、UART和GPIO等外设,你就需要初始化这些器件,但是设计中使用UART是有条件的(仅用于调试时显示结果),此时编译器会提示你禁用这个外设以降低功耗。必须得说这种智能化的开发工具对开发者来说是一种福音。

5、未来需求和兼容性

设计者在设计产品时需要考虑产品未来可能需要升级等之类的问题。例如,若需要给设计增加某些功能,那么可能需要增加内存、外设等,还可能需要加提高单片机的运行速度。因此,在单片机的选型上需要在当前设计需求以及未来设计上寻找平衡,以满足不同程度的要求。

6、成本

一个好的设计不仅要功能完善,而且要满足成本要求,如果无法控制成本,再好的设计也是枉然。因此,需要尽可能地降低单片机甚至整个产品的成本。

7、工作电压(VCC)

单片机的工作电压是指可以让其正常工作所需要提供的电压。工作电压越高,单片机的功耗也就越大。因此,为了降低产品功耗,必须要尽可能地降低工作电压。

除此之外,我还要建议设计者根据具体产品需求选择合适芯片架构。若仅是个简单的控制应用(如照明系统、电子玩具等),那么并不需要一个像ARM那样具有复杂架构的芯片。此外,对于低功耗设计,单片机必须具有睡眠模式,基于中断操作的睡眠模式/低功耗模式的使用是降低功耗的一个标准的行业惯例。

最后再来一句老生常谈:不要拘泥与芯片是否先进,单片机只是一个工具,真正的功夫在于你的专业知识,要用最合适的芯片做出最合适的产品。

来源:网络

围观 41

硬件看门狗

硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813,5045,IMP 813等,价格4~10元不等。

软件看门狗

软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。

对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的余量。而T1的中断正常与否我们再由T0定时中断子程序来监视。这样就够成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。

系统软件"看门狗"的设计思路:

1. 看门狗定时器T0的设置。

在初始化程序块中设置T0的工作方式,并开启中断和计数功能。系统Fosc=12 MHz,T0为16位计数器,最大计数值为(2的16次方)-1=65 535,T0输入计数频率是.Fosc/12,溢出周期为(65 535+1)/1=65 536(μs)。

2. 计算主控程序循环一次的耗时。

考虑系统各功能模块及其循环次数,本系统主控制程序的运行时间约为16.6 ms。系统设置"看门狗"定时器T0定时30 ms(T0的初值为65 536-30 000=35 536)。主控程序的每次循环都将刷新T0的初值。如程序进入"死循环"而T0的初值在30 ms内未被刷新,这时"看门狗"定时器T0将溢出并申请中断。

3. 设计T0溢出所对应的中断服务程序。

此子程序只须一条指令,即在T0对应的中断向量地址(000BH)写入"无条件转移"命令,把计算机拖回整个程序的第一行,对单片机重新进行初始化并获得正确的执行顺序。

来源:电子发烧友网

围观 16

一、单片机内部结构分析

我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。

二、几个基本概念

1、数的本质和物理现象

我们知道,计算机可以进行数学运算,这可令我们非常的难以理解,计算机吗,我们虽不了解它的组成,但它总只是一些电子元器件,怎么可以进行数学运算呢?我们做数学题如37+45是这样做的,先在纸上写37,然后在下面写45,然后大脑运算,最后写出结果,运算的原材料:37、45和结果:82都是写在纸上的,计算机中又是放在什么地方呢?为了解决这个问题,先让我们做一个实验:这里有一盏灯,我们知道灯要么亮,要么不亮,就有两种状态,我们可以用’0’和’1’来代替这两种状态,规定亮为’1’,不亮为’0’。现在放上两盏灯,一共有几种状态呢?我们列表来看一下:

请大家自已写上3盏灯的情况000 001 010 011 100 101 110 111我们来看,这个000,001,101 不就是我们学过的的二进制数吗?本来,灯的亮和灭只是一种物理现象,可当我们把它们按一定的顺序排更好后,灯的亮和灭就代表了数字了。让我们再抽象一步,灯为什么会亮呢?看电路1,是因为输出电路输出高电平,给灯通了电。因此,灯亮和灭就可以用电路的输出是高电平还是低电平来替代了。这样,数字就和电平的高、低联系上了。(请想一下,我们还看到过什么样的类似的例子呢?(海军之)灯语、旗语,电报,甚至红、绿灯)

2、位的含义

通过上面的实验我们已经知道:一盏灯亮或者说一根线的电平的高低,可以代表两种状态:0和1。实际上这就是一个二进制位,因此我们就把一根线称之为一“位”,用BIT表示。

3、字节的含义

一根线可以表于0和1,两根线可以表达00,01,10,11四种状态,也就是可以表于0到3,而三根可以表达0-7,计算机中通常用8根线放在一起,同时计数,就可以表过到0-255一共256种状态。这8根线或者8位就称之为一个字节(BYTE)。

三、存储器的工作原理

1、存储器构造


存储器就是用来存放数据的地方。它是利用电平的高低来存放数据的,也就是说,它存放的实际上是电平的高、低,而不是我们所习惯认为的1234这样的数字,这样,我们的一个谜团就解开了,计算机也没什么神秘的吗。

如上图左所示:一个存储器就象一个个的小抽屉,一个小抽屉里有八个小格子,每个小格子就是用来存放“电荷”的,电荷通过与它相连的电线传进来或释放掉,至于电荷在小格子里是怎样存的,就不用我们操心了,你可以把电线想象成水管,小格子里的电荷就象是水,那就好理解了。存储器中的每个小抽屉就是一个放数据的地方,我们称之为一个“单元”。

有了这么一个构造,我们就可以开始存放数据了,想要放进一个数据12,也就是00001100,我们只要把第二号和第三号小格子里存满电荷,而其它小格子里的电荷给放掉就行了(看上图右)。可是问题出来了,看上图右,一个存储器有好多单元,线是并联的,在放入电荷的时候,会将电荷放入所有的单元中,而释放电荷的时候,会把每个单元中的电荷都放掉,这样的话,不管存储器有多少个单元,都只能放同一个数,这当然不是我们所希望的,因此,要在结构上稍作变化,看上图右,在每个单元上有个控制线,我想要把数据放进哪个单元,就给一个信号这个单元的控制线,这个控制线就把开关打开,这样电荷就可以自由流动了,而其它单元控制线上没有信号,所以开关不打开,不会受到影响,这样,只要控制不同单元的控制线,就可以向各单元写入不同的数据了,同样,如果要某个单元中取数据,也只要打开相应的控制开关就行了。

2、存储器译码

那么,我们怎样来控制各个单元的控制线呢?这个还不简单,把每个单元的控制线都引到集成电路的外面不就行了吗?事情可没那么简单,一片27512存储器中有65536个单元,把每根线都引出来,这个集成电路就得有6万多个脚?不行,怎么办?要想法减少线的数量。我们有一种方法称这为译码,简单介绍一下:一根线可以代表2种状态,2根线可以代表4种状态,3根线可以代表几种,256种状态又需要几根线代表?8种,8根线,所以65536种状态我们只需要16根线就可以代表了。

3、存储器的选片及总线的概念

至此,译码的问题解决了,让我们再来关注另外一个问题。送入每个单元的八根线是用从什么地方来的呢?它就是从计算机上接过来的,一般地,这八根线除了接一个存储器之外,还要接其它的器件,如图4所示。这样问题就出来了,这八根线既然不是存储器和计算机之间专用的,如果总是将某个单元接在这八根线上,就不好了,比如这个存储器单元中的数值是0FFH另一个存储器的单元是00H,那么这根线到底是处于高电平,还是低电平?岂非要打架看谁历害了?所以我们要让它们分离。办法当然很简单,当外面的线接到集成电路的引脚进来后,不直接接到各单元去,中间再加一组开关就行了。平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关接通就行了。这组开关由三根引线选择:读控制端、写控制端和片选端。要将数据写入片中,先选中该片,然后发出写信号,开关就合上了,并将传过来的数据(电荷)写入片中。如果要读,先选中该片,然后发出读信号,开关合上,数据就被送出去了。读和写信号同时还接入到另一个存储器,但是由于片选端不同,所以虽有读或写信号,但没有片选信号,所以另一个存储器不会“误会”而开门,造成冲突。那么会不同时选中两片芯片呢?只要是设计好的系统就不会,因为它是由计算控制的,而不是我们人来控制的,如果真的出现同时出现选中两片的情况,那就是电路出了故障了,这不在我们的讨论之列。

从上面的介绍中我们已经看到,用来传递数据的八根线并不是专用的,而是很多器件大家共用的,所以我们称之为数据总线,总线英文名为BUS,总即公交车道,谁也可以走。而十六根地址线也是连在一起的,称之为地址总线。

围观 9

总结前人的经验,摸索着写一点实用的方法,供大家参考:在这里不讲加密算法,只讨论结合软硬件的加密方法,总结了一下大该有以下几种:

一、加密方法

1、烧断数据总线。这个方法我想应不错,但应有损坏的风险,听说也能破解。

2、芯片打磨改型,这个方法有一定作用,改了型号能误导,但同时也增加成本,解密者一般也能分析出来。

3、用不合格的单片机的的存储器:这个方法听起来不错,值得一试。很多单片机有这种情况,有的是小容量改为大容量来用,解密者应很难发现。例:8031/8052 单片机就是8731/8752掩模产品中的不合格产品,内部可能有ROM。可把8031/8052 当8751/8752 来用.但使用时要测试可靠。

4、其他还有添加外部硬件电路的加密方法。但那样增加成本,效果不一定好。

5、软件加密,是一些防止别人读懂程序的方法,单一的这种方法不能防止别人全盘复制。须配合其他的加密方法。

6、通过序列号加密,

这个方法当你的产品是连接PC时或网络,我想是一个比较理想的方法。原理跟电话产品防伪标志相近。就是在你的单片机中生成一个唯一的随机长序列号,并加入复杂的特种算法,或加入你们重新编码的企业信息在里面,每个芯片内不同,复制者只能复制到一个序列号。这个方法不能防止复制,但能发现复制品,并可在升级或在网络状态控制它或让他自毁。如果产品不联机或不可升级,则这个方法完全无效,只能是在上法院时可当作证据,因为内含特种算法破解者是无法知道的。

7、通过单片机唯一的特性标识(不可修改)进行加密

这个方法最好,能很好的防止复制。但大多单片机没有唯一标识。STC单片机里面含唯一标识,但本人没用过,下次一定要研究使用一下。理论上只要含唯一标识是单片机都可实现,ATMEL AVR系列单片大部分型号有RC校正字节(几十个芯片才有一个相同,并且不可修改)能实现这个理想功能,可做到即使芯片内程序被读出也无法直接在另一个同型号的单片机上正常运行。并且如果用这个唯一标识来生成含有加密算法的序列号,结合第6种方法,哪应是最理想的加密方法。

以上方法应都是一种加密的思路,各种方法可接合着用,6、7两种方法是本人认为比较合适,实现起来比较容易的方法。后面将重点介绍两种加密方式的实现方法。

二、序列号加密实现方法

1、原理

就是在存储器某个区块放入一个唯一的序列号(长一点,无规律),每个芯片不同。原理跟电话产品防伪标志相近
| PC机 | <------------>| 带自定义算法序列号单片机系统 |

控制方法:

1、PC根据传回来的序列号根据算法判断是否合法,合法就运行,不合法处理它。当然,如果是加密的序列号,可自毁。

2、单片机内部的序列号经加密算法处理,单片机系统同样要防止软件被更改,可在单片机内部加入CRC等数据校验。一般情况下,序列号如果不合算法,单片机系统应让程序运行出错,这样解密者一般不会去修改序列号,如果修改了也没关系,因为PC还能判断是否合法。

3、序列号传送时可采用双向加密算法认证,相当于银卡的数据交换方式。

传送过程:

PC发送随机SEED数据---->单片机系统跟据随机SEED算出加密的序列号----->PC根据算法判断序列号是否合法这样在序列号的传送过程中,数据每次不同,解密者无法看到序列号的明码。这样PC软件他同样不容易更改。

注意:加密算法可以很简单理解一个为异或,当然算法由你自已随意定,反正目的不能上别人一看软件就懂。解密者只是破解一个产品只能得到一个序列号,即使序列号是明码,他也只能知道是一个。如他随便修改一个序列号一般情况就不符合算法,除非他看懂你的软件算法,我想这是一般解密者最不愿意做的事情。

单片机系统的量产:

产生这样的序列号,单片机系统如何生成?如果用手工一个个去计算调入,得重新编译是不可能的事情。如果编写一个软件生成数据放入到HEX文件中,那样不说工作量好大,编程时还必须一次次装入HEX文件,量产同样无法完成。这个可于
MiniPro TL866 编程器完成。

编程器的介绍可查看:http://www.autoelectric.cn/minipro

TL866编程器有个自动编号功能,可利用DLL动态库调用实现任意的序列号.如何使用DLL设定序列号,可参考编程器安装包内的DLL实例,内有详细说明。后面讲的用单片机唯一的特性标识进行加密也用到DLL调用,基本大同小异。

经过这样的加密,达到一个目的,就是解密者必须修改你的软件后才能放心使用,但是每次升级同样会受你控制,好像微软随时可以黑你屏一样的道理,否则可能随时会被你宰了!!但这种方法只适合连接PC或网络的系统。

三、用单片机唯一的特征标识进行加密

加密原理:

单片机必须有唯一标志,单片机程序内只要判断是否是这个标志,就可防止程序直接复制使用。理论上可以做到很难破解,本人认为是最有效又实用的方法。

达到目的: 解密者最不愿意做的事让他必须做。

一般大部分搞单片机解密的都是暴力破解,因为这个最容易,只要牚握技巧,有设备,工艺熟练就可了,不用太强的专业知识。如果复制后,程序无法运行,那就蒙了,因为这个时候就要去看汇编语言了,我相信有很多汇编高手,能很容易破解。但我也同时认为,这么多型号的单片机,汇编指令差别好大,每一种单片机的汇编都很熟的人应不多了。所以这会大大增加破解难度。如果一个加密设计好的软件,根据单片机的唯一特征字来加密,有时他可能不得不看懂里面的加密算法。这样加密目的就达到了。

开发人员需要做的事:

有了唯一特征字,并不是加密万无一失了。如果你只是在程序中只用一条语句判断,是不是这个芯片的特征字,则程序被读出后,解密者只要简单的修改程序,直接跳过判断语句。可能只要几分钟就解决了。所以在程序要加入加密算法,尽量不用IF判断语句。可用子程序调用地址来参与特征字的加密运算等等方法,如何防反汇编及修改软件等不在这里讨论,网上可以找到有关这方面的很多资料。

免责声明:本文转自网络,版权归原作者所有,如有问题,请联系删除,谢谢!

围观 199

页面

订阅 RSS - 单片机