电子常识
AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
1、与MCS-51单片机产品兼容;
2、8K字节在系统可编程Flash存储器;
3、1000次擦写周期;
4、全静态操作:0Hz-33MHz;
5、三级加密程序存储器;
6、32个可编程I/O口线;
7、三个16位定时器/计数器;
8、6个中断源;
9、全双工UART串行通道;
10、低功耗空闲和掉电模式;
11、掉电后中断可唤醒;
12、看门狗定时器;
13、双数据指针;
14、掉电标识符。
AT89S52 具有PDIP、PLCC、TQFP3 种封装形式以适用于不同的使用场合。各封装引脚定义如下图所示。
下面简单介绍AT89S52各引脚的功能,更多信息请查阅Atmel公司的技术文档。 VCC:电源。 GND:地。
P0 口:P0 口是一个8 位漏极开路的双向I/O 口。作为输出口,每位能驱动8 个TTL逻辑电平。对P0 端口写“1”时,引脚用做高阻抗输入。当访问外部程序和数据存储器时,P0 口也被作为低8 位地址/数据复用。在这种模式下,P0 具有内部上拉电阻。在Flash编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。在程序校验时,需要外部上拉电阻。
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,P1 输出缓冲器能驱动4 个TT
逻辑电平。当对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。当作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此 外,P1.0 和P1.2 分别作为定时器/计数器2 的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如表1-1 所示。在Flash编程和校验时,P1口接收低8 位地址字节。
P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TT逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。当作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问
表1口部分管脚的第二功能
外部程序存储器或用16 位地址读取外部数据存储器(如执行MOVX @DPTR)时,P2 口送出高8 位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8 位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在Flash编程和校验时,P2 口也接收高8位地址字节和一些控制信号。 P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TT
逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。当作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3 口也作为AT89S52 特殊功能(第二功能)使用,如表1-2所示。在Flash编程和校验时,P3口也接收一些控制信号。
表2 P3口部分管脚的第二功能
RST: 复位输入。在晶振工作时,RST脚持续两个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO 位可以使此功能无效。在DISRTO 默认状态下,复位高电平有效。
ALE/PROG:地址锁存控制信号(ALE)在访问外部程序存储器时,锁存低8 位地址的输出脉冲。在Flash编程时,此引脚(PROG)也用做编程输入脉冲。 在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0 位置“1”,ALE 操作将无效。这一位置“1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0 位)的设置对微控制器处于外部执行模式下无效。
PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH 的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在Flash编程期间,EA也接收12伏VPP电压。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。
T89S51看门狗定时器由一个14位定时器及WDTRST(地址为6AH)寄存器构成。开启看门狗定时器后,14位定时器会自动计数,每16384(214)个机器周期溢出一次,并产生一个高电平复位信号,使系统复位。对于12MHZ的时钟脉冲每16384us(约0.016s)产生一个复位信号。
如果启动看门狗定时器,当系统超过0.016s没有动作(程序跑飞),看门狗定时器自动复位,让系统归复于正常运作状态。为了系统既能正常工作又不会出现死机(程序跑飞),在0.016s内必须喂狗一次,即对看门狗定时器进行复位,看门狗的启动和复位的方法是一样的。
在汇编语言中启动或复位看门狗定时器的命令如下。
MOV 6AH, #1EH
MOV 6AH, #0E1H
若要在C语言中使用看门狗定时器功能,由于reg51.h中并没有声明WDTRST寄存器,所以必须先声明WDTRST寄存器。
Sfr WDTRST=0xa6;
进行声明以后可以用一下命令启用或复位看门狗定时器。
WDTRST=0x1e;
WDTRST=0xe1;
下面用一个C语言进行说明
#include 《reg51.h》
Sfr WDTRST=0xa6;
Main()
{ ……;
WDTRST=0x1e;
WDTRST=0xe1;
While(1)
{ WDTRST=0x1e;
WDTRST=0xe1;
……;
……; 这部分执行时间必须少于0.016s } }
以上程序中系统在做一个无限循环的动作,通过看门狗定时器可以防止程序在执行过程中跑飞。因为只要程序一跑出while()循环,看门狗定时器溢出以后得不到复位,所以自动复位系统,让程序从mian()开始重新运行。
但是在C语言应用看门狗定时器也特别小心,一定要在看门狗定时器启动后的0.016s内喂一次狗。
注:在汇编语言中每条指令的执行时间都是可以准确算出来,下面是一个汇编语言编写的8路led向左移程序应用看门狗定时器的实例。
ORG 00H 1 1us
MOV 0A6H,#1EH 2 1us
MOV 0A6H,#0E1H 3 1us
START: MOV A,#0FEH 4 1us
LOOP: MOV P2,A 5 1us
CALL DELAY 6 2us
RL A 7 2us
JMP LOOP 8 2us
DELAY: MOV R7,#200 9 1us
DV: MOV R6,#250 10 1us
DJNZ R6,$ 11 2us
MOV 0A6H,#1EH 2 1us
MOV 0A6H,#0E1H 3 1us
DJNZ R7,DV 12 2us
RET 13 2us
END 14 2us
在程序的每个行标号后面是12MHZ时钟脉冲下的指令执行时间,为了让系统正常工作且不死机将看门狗定时器启动指令放在1和2之间,将看门狗定时器复位指令放在11和12之间。
现在一起通过执行时间来计算看门狗定时器复位指令放在那里比较合适。
程序执行顺序:1 2 3 4 5 6 9 10 11 12 9 10 ……
运行时间: 1us 1 1 1 1 2 1 1 2*250 us (1+250*2+2)*199
程序运行到11的时候用的时间是2*250+6=506us《16384us
程序运行到12的时候用的时间是506+(1+250*2+2)*199=10063us》16384us
从比较结果可以看出,看门狗定时器的喂狗指令必须放在11和12之间。可以想一下放在12和13之间会是什么效果。
全部0条评论
快来发表一下你的评论吧 !