Atmel单片机应用技巧
功能强大的时钟中断
在程序设计中,设置一个好的时钟中断,可大大方便和简化程序的编制,提高系统的效率与可操作性。下面以6MHz时钟的89C51系统为例,说明时钟中断的应用。
定时器初值与中断周期。 时钟中断的时间间隔一般取20ms(50Hz),如需要百分之一秒的时基信号,可取10ms(100Hz)。这里取20ms。T0工作于16位定时器方式(方式1),每过一个机器周期T0自动加1,计至0FFFFh的下一个机器周期,T0溢出产生中断,由硬件设置相应的标志位供软件查询。即中断启动后经过N+1个机器周期,T0产生中断。所以,只要先在T0中存入一个比0FFFFh小N的数,然后启动定时器,便会在N+1个机器周期后产生中断,这个数便是所谓的“初值”。时钟为6MHz,则20ms有10000个机器周期。(10000)10=(2710)16,则0FFFFh-2710h+1=0D8F0h。由于响应中断、保护现场及重装初值还需要7~8机器周期,则T0应装入的初值是0D8F7h。每次中断进入后,先把A及PSW的值压堆,再把0D8F7h装入T0。
设置一个单元,每次中断加1。 将RAM中一个单元取名为INCPI。在中断处理程序中,装完T0初值后,用“INC INCPI”指令将其加1。无论中断程序还是主程序,都可以从INCPI中读取20ms的1~256之间任意整数倍的信号。如向数码管送显的程序,需要每0.5秒刷新一次显示器,可以设一等待单元W_DISP,用“MOV A,INCPI/ADD A,#25/MOV W_DISP,A”三条语句让其比当前的INCPI值大25,然后在每次中断中检查W-DISP是否与INCPI值相等。若相等,说明已过了25个中断周期,执行送显程序,并且让W_DISP再加上25,等待下一个0.5秒。程序中可以设置多个等待单元,以取得多个时基信号。
在中断中读键与看门。 通常,我们在主程序中读键盘,步骤为:扫描键盘,若有键按下,则延时几十毫秒去抖动,再次确认此键确实按下,然后处理该键对应的工作,完成后再次重复上述步骤。这种方式有两点不足:1. 处理相应工作时无法锁存按键的输入,可能漏键。2. 延时去抖时CPU无法做其他事情,效率不高。把读键放在时钟中断中,可避免上述不足。方法为:如果两次相邻的中断中都读到同一个键按下,则这个键是有效的(达到了去抖目的),将其锁存到先入先出(队列)的键盘缓冲区,等主程序来处理。这样,主程序处理按键的同时,仍可响应键盘的输入。缓冲区深度通常可设为8级,若锁存的键数已达到8个,则忽略新的按键,并报警提示用户新的按键将无效。若键盘缓冲队列停滞的时间大大长于主程序处理按键所需要的最大时间,说明主程序已出错或跑飞,可以在中断中用指令将系统复位,起到了看门狗的目的。
主程序中的延时。 由于有常开的时钟中断,所以当主程序中有需要时间较短、精度较高的延时时,应暂时把时钟中断关闭。程序中需要时间较长、精度不高的延时时,可仿照下例编程,避免多层嵌套的循环延时。
例:从P1.1口输出1秒的高电平脉冲
MOV A,INCPI
INC A
CJNE A,INCPI,$;等待一次中断处理完成
SETB P1.1 ;设P1.1为1,脉冲开始
ADD A,#50 ;50个20ms为1秒
CJNE A,INCPI,$ ;等中断将INCPI加一50次
CLR P1.1 ;设P1.1为0,脉冲结束
综上可知,设计时要灵活地应用时钟中断,将任务合理分配给中断和主程序,二者要分工明确,接口简单。并应注意尽量缩短中断处理程序的执行时间,切勿长于20ms。
用89C2051控制的可变频率和占空比的脉冲恒流源
本恒流源的负载为纯电阻性,阻值变化范围100Ω~1kΩ,输出恒定电流4mA。恒流源提供三路输出,每路输出脉冲恒流源的频率分别为12次/分、6次/分、3次/分,输出脉冲宽度均为300ms。
该恒流源主要由恒流源输出电路及可变频率和占空比的脉冲控制信号产生电路两部分组成。
用TTL或CMOS电路分频,也能够得到上述脉冲控制信号,但电路比较复杂,且频率和占空比不容易更改。用89C2051的输出口作为脉冲控制信号,能够通过程序改变脉冲控制信号的频率和占空比。
脉冲恒流源电路如附图所示。为了说明方便,这里只画了一路恒流源输出电路
接插件P1接9V电池,P3接负载。
恒流源输出电路由U1、T1、T2和D1以及其他外围电路组成。T1、R3、D1、RW1和R2构成基准电压源。根据设计要求,由输出电流和取样电阻R1的阻值确定加到运放同相端的基准电位。按照图中的参数,T1导通时,调整RW1,使运放的同相端的基准电位为0.4V,显然T1截止时,该基准电位等于0V。T1导通时,若负载电流低于4mA,取样电阻R1上的电压下降,运放的反相输入端的电位下降,运放的输出电位上升,T2的基极电位和集电极电流(负载电流)上升;负载电流大于4mA时,T2的基极电位和集电极电流(负载电流)下降,最终维持输出电流恒定。T1截止时,由于加到运放同相端的基准电位降到0V,运放的输出电压下降,T2截止,负载中没有电流通过。
控制T1导通和截止的脉冲信号从89C2051的P10口输出。产生脉冲控制信号的软件主要由循环程序和延时子程序组成。
如果要扩大输出电流的范围,只需用功率比较大的稳压源并将T2换成大功率复合管便可。
AT89C系列单片机加密模式
单片机解密简单就是擦除单片机片内的加密锁定位。由于AT89C系列单片机擦除操作时序设计上的不合理。使在擦除片内程序之前首先擦除加密锁定位成为可能。AT89C系列单片机擦除操作的时序为:擦除开始---- <擦除操作硬件初始化(10微秒)----> <擦除加密锁定位(50----200微秒)---> <擦除片内程序存储器内的数据(10毫秒)-----> <擦除结束。如果用程序监控擦除过程,一旦加密锁定位被擦除就终止擦除操作,停止进一步擦除片内程序存储器,加过密的单片机就变成没加密的单片机了。片内程序可通过总线被读出。对于at89c系列单片机有两种不可破解的加密方法。>
一、永久性地破坏单片机的加密位的加密方法。简称OTP加密模式。
二、永久性地破坏单片机的数据总线的加密方法。简称烧总线加密模式。
AT89C系列单片机OTP加密模式原理
这种编程加密算法烧坏加密锁定位(把芯片内的硅片击穿),面不破坏其它部分,不占用单片机任何资源。加密锁定位被烧坏后不再具有擦除特性,89C51/52/55有3个加密位进一步增加了加密的可靠性。一旦用OTP模式加密后,单片机片内的加密位和程序存储器内的数据就不能被再次擦除,89C51/52/55单片机就好象变成了一次性编程的OTP型单片机一样。如果用户程序长度大于89C51单片机片内存储器的容量,也可使用OPT模式做加密,具体方法如下:
1、按常规扩展一片大容量程序存储器,如27C512(64K)。
2、把关键的程序部分安排在程序的前4K中。
3、把整个程序写入27C512,再把27C512的前4K填充为0。
4、把程序的前4K固化到AT89C51中,用OPT模式做加密。
5、把单片机的EA脚接高电平。
这样程序的前4K在单片机内部运行,后60K在片外运行。盗版者无法读出程序的前4K程序,即使知道后60K也无济于事
AT89C系列单片机炼总线加密模式原理
因为单片机片内的程序代码最终都要通过数据总线读出,如果指导单片机的数据总线的其中一条线永久性地破坏,解密者即使擦除了加密位,也无法读出片内的程序的正确代码。89C1051/2051的数据总线为P1口烧总线模式烧坏89C2051的P1.0端口,原程序代码为02H、01H、00H。读出的数据则为03H,01H,00H。其中最低位始终为1,读出的程序代码显然为错码。这种加密模式用于加密89C1051/2051单片机。缺点是占用单片机的资源。开发设计人员在设计单片机硬件系统时只要预留出口线P1.0不用,以后就可用烧总线模式对单片机加密。