自然风扇
三、参考代码
//======================================================= ===========
#include
#include
//********************************************
// I/O port design
//********************************************
//输入定义
#define Key_null 0xff
#define Key_f 0xfe
#define Key_m 0xfd
#define Key_t 0xfb
//控制输出/输入
sbit m_out = P3^6;
sbit pwm_out = P3^7;
sbit err_in = P1^3;
//函数声明
void led_display(void);
//======
//PWM 电机输出控制 (timer0 中断)
code unsigned int pwm_m1[3] = {62536,56536,63536}; code unsigned int pwm_m2[3] = {56536,62536,55536}; unsigned char th01_new,tl01_new;
unsigned char th02_new,tl02_new;
bit pwm_state;
void timer1(void) interrupt 1 //定时0中断
{
if(pwm_state)
{
TL0 = tl01_new;
TH0 = th01_new;
pwm_out = 0;
}
else
{
TL0 = tl02_new;
TH0 = th02_new;
pwm_out = 1;
}
pwm_state = ~pwm_state;
}
bit key_time_ok,time_1s_ok;
unsigned char key_time,time_1s;
void timer0(void) interrupt 3 //定时1中断
{
TL1 = 0x78; // THTL=0xec78 = 65536 - 5000(5ms)
TH1 = 0xec;
led_display(); // LED动态扫描
if (++key_time >= 4)
{
key_time = 0;
key_time_ok = 1; //10ms到
if(++time_1s >= 50)
{
time_1s = 0;
time_1s_ok = 1; //1秒到
}
}
}
//======
//LED数码管扫描显示驱动
unsigned char dis_buff[4];
code unsigned char led_7[13]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x79};
code unsigned char position[4]= {0xfe,0xfd,0xfb,0xf7};
void led_display(void) // 4位LED数码管动态扫描函数,5ms 执行一次
{
static unsigned char posit;
P0 = 0xff; // 关全部显示
P2 = led_7[dis_buff[posit]]; // 输出一位段码
P0 = position[posit]; // 显示其中一位
if(++posit >= 4) posit = 0;
}
//=======================
//按键扫描底层接口
unsigned char read_key(void)
{
static unsigned char key_press_old = Key_null,key_state = 0 ;
unsigned char key_value= Key_null,key_press;
key_press = P1;
switch (key_state)
{
case 0:
if(key_press != Key_null) key_state = 1;
break;
case 1:
if (key_press != key_press_old)
{
key_state = 0;
}
else
{
if (key_press == Key_f) key_value = Key_f;
if (key_press == Key_m) key_value = Key_m;
if (key_press == Key_t) key_value = Key_t;
key_state = 2;
}
break;
case 2:
if (key_press == Key_null) key_state = 0;
break;
}
key_press_old = key_press;
return key_value;
}
//======================================================= ======================
// 主程序
//======================================================= ======================
void main(void)
{
bit delay_time_ok = 0,m_type_ok = 0, move_on = 0; unsigned char f_type = 1,time_type = 0,delay_time = 0,mov e_time = 0,key;
EA = 0; //关闭全局中断
SP = 0x80; //将堆栈空间定义到RAM后128B的空间,让出前128B给变量
P2 = 0x00;
P3 = 0x00;
P0 = 0xff;
P1 = 0xff;
//Configure Timer0, Mode=1,Interrupt=ENABLED,Clock Source=INTERNAL,Enable Gat ing Control=DISABLED
TMOD &= 0XF0; /* clear Timer 0 */
TMOD |= 0X01;
TL0 = 0x78;
TH0 = 0xec;
ET0 = 1; /* IE.1*/
TR0 = 1; /* TCON.4 start timer */
//Configure Timer1, Mode=1,Interrupt=ENABLED,Clock Source=INTERNAL,Enable Gat ing Control=DISABLED
TMOD &= 0X0F; /* clear Timer 1 control */
TMOD |= 0X10;
TL1 = 0X78; // THTL=0xec78 = 65536 - 5000(5ms)
TH1 = 0Xec;
ET1 = 1; /* ET0 is IE.3 */
TR1 = 1; /* TCON.6 start timer */
dis_buff[3] = f_type;
dis_buff[2] = 10;
dis_buff[1] = 0;
dis_buff[0] = 0;
th01_new = pwm_m1[f_type-1] >> 8;
tl01_new = pwm_m1[f_type-1];
th02_new = pwm_m2[f_type-1] >> 8;
tl02_new = pwm_m2[f_type-1];
EA = 1; //打开全局中断
while(1)
{
if (err_in)
{
if(key_time_ok)
{
key_time_ok = 0;
key = read_key();
if (key != Key_null)
{
if (key == Key_f)
{
if (++f_type >= 4) f_type = 1;
th01_new = pwm_m1[f_type-1] >> 8;
tl01_new = pwm_m1[f_type-1];
th02_new = pwm_m2[f_type-1] >> 8;
tl02_new = pwm_m2[f_type-1];
dis_buff[3] = f_type;
}
else if(key == Key_t)
{
if (++time_type >= 7)
{
time_type = 0;
delay_time_ok = 0;
delay_time = 0;
}
else
{
delay_time_ok = 1;
delay_time = time_type * 10;
}
} else if(key == Key_m)
{
m_type_ok = ~m_type_ok;
}
}
}
if (time_1s_ok)
{
time_1s_ok = 0;
if(delay_time) delay_time-- ;
dis_buff[1] = delay_time / 10;
dis_buff[0] = delay_time % 10;
if (m_type_ok)
{
if (++move_time >= 3)
{
move_time = 0;
move_on = ~move_on;
}
}
}
if (delay_time_ok)
dis_buff[2] = 11;
else
dis_buff[2] = 10;
if (delay_time_ok && (delay_time == 0))
{
ET0 = 0;
pwm_out = 1;
}
else
{
ET0 = 1;
}
if (m_type_ok) m_out = move_on;
}
else
{
ET0 = 0;
pwm_out = 1;
dis_buff[2] = 12;
}
}
}
========================================================= ====
四、代码简单说明与模拟调试过程
1。本代码是在我设计的“AVR-51多功能实验开发板”上调试实现的。编程工具就是并口的ISP,开发平台KEIL,编程软件SLISP。根据板上资源代码的显示部分与上面所贴图有点改动。
2。代码中简单的把P2口作为LED的8个段的输出口,PO口作为位控,采用共阴LED数码管。由于89S52的I/O口驱动比较小,所以亮度不太高。可以通过调节限流电阻提高亮度。
3。实际板上有一片1413驱动,可以作为LED数码管显示的位驱动,这样亮度就没有问题了。
4。代码中尽量保证RAM的前128B(直接寻址)全部给用户变量使用,把堆栈放在后128B的空间,固定数据的数组定义在FLASH空间(见代码中有CODE声明的数组变量定义)
5。外围的马达的驱动电路、马达、继电器、温度输入检测(此部分电路请自己补充画完)没有接,通过以下的模拟方式验证和调试6。PWM的输出直接控制板上的一个LED,不同占空比时,LED的亮度变化代表了转速的不同。实际如果有马达的话,只要根据实际情况,改变PWM的频率就可以了。
7。摆动马达控制也可以使用2个LED显示控制I/O的输出情况8。采用一个I/O输入“1”或“0”表示温度的超过或正常。
AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
MCS-51指令系统,片内置通用8位中央处理器和Flash存储
单元
初级会计实务单元训练题天津单元检测卷六年级下册数学单元教学设计框架单元教学设计的基本步骤主题单元教学设计
,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
。
AT89S52具有如下特点:40个引脚,8k Bytes Flash 片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
89S52不能用MAX232芯片链接串口下载!
89S52有专门的ISP电路。
AT89c52用专门的烧录工具+相应软件;
AT89s52用专门的烧录工具+相应软件,或者一个ISP下载器+相应软件(这种软件有很多)。
AT89S52与AT89C52基本能通用,但AT89S52的性能比后者好。我做毕业设计开使用的A T89C52后来老师给的是A T89S52。他说什么也不影响。
AT89S52中文资料
学习资料2009-04-03 16:16:10 阅读509 评论1 字号:大中小AT89S52
1
主要性能
l 与MCS-51单片机产品兼容
l 8K字节在系统可编程Flash存储器
l 1000次擦写周期
l 全静态操作:0Hz~33Hz
l 三级加密程序存储器
l 32个可编程I/O口线
l 三个16位定时器/计数器
l 八个中断源
l 全双工UART串行通道
l 低功耗空闲和掉电模式
l 掉电后中断可唤醒
l 看门狗定时器
l 双数据指针
l 掉电标识符功能特性描述
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有
8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非
易失性存储器技术制造,与工业80C51 产品指令和引脚完
全兼容。片上Flash允许程序存储器在系统可编程,亦适于
常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统
可编程Flash,使得AT89S52为众多嵌入式控制应用系统提
供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位
定时器/计数器,一个6向量2级中断结构,全双工串行口,
片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻
辑操作,支持2种软件可选择节电模式。空闲模式下,CPU
停止工作,允许RAM、定时器/计数器、串口、中断继续工
作。掉电保护方式下,RAM内容被保存,振荡器被冻结,
单片机一切工作停止,直到下一个中断或硬件复位为止。
R
8 位微控制器
8K 字节在系统可编程
Flash
AT89S52
Rev. 1919-07/01
AT89S52
2
引脚结构
AT89S52
3
方框图
引脚功能描述
AT89S52
4
VCC : 电源
GND: 地
P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻
辑电平。对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,
P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验
时,需要外部上拉电阻。
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个
TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入
口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2
的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能
P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI(在系统编程用)
P1.6 MISO(在系统编程用)
P1.7 SCK(在系统编程用)
P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个
TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入
口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)
时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内
部上拉发送1。在使用
8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个
TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入
口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。
AT89S52
5
引脚号第二功能
P3.0 RXD(串行输入)
P3.1 TXD(串行输出)
P3.2 INT0(外部中断0)
P3.3 INT0(外部中断0)
P3.4 T0(定时器0外部输入)
P3.5 T1(定时器1外部输入)
P3.6 WR(外部数据存储器写选通)
P3.7 RD(外部数据存储器写选通)
RST: 复位输入。晶振工作时,RST脚持续2 个机器周期高电平将使单片机复位。看门
狗计时完成后,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:振荡器反相放大器的输出端。
AT89S52
6
表1 AT89S52 特殊寄存器映象及复位值
特殊功能寄存器
特殊功能寄存器(SFR)的地址空间映象如表1所示。
并不是所有的地址都被定义了。片上没有定义的地址是不能用的。读这些地址,一般将
得到一个随机数据;写入的数据将会无效。
用户不应该给这些未定义的地址写入数据“1”。由于这些寄存器在将来可能被赋予新的
功能,复位后,这些位都为“0”。定时器2 寄存器:寄存器T2CON 和T2MOD 包含定时器2 的控制位和状态位(如表2
和表3所示),寄存器对RCAP2H和RCAP2L是定时器2的捕捉/自动重载寄存器。
中断寄存器:各中断允许位在IE寄存器中,六个中断源的两个优先级也可在IE中设置。
AT89S52
7
表2 T2CON:定时器/计数器2控制寄存器
T2CON 地址为0C8H 复位值:0000 0000B
位可寻址
TF2 EXF2 RLCLK TCLK EXEN2 TR2
7 6 5 4 3 2 1 0
符号功能
TF2 定时器2 溢出标志位。必须软件清“0”。RCLK=1 或TCLK=1 时,TF2
不用置位。
EXF2
定时器2 外部标志位。EXEN2=1 时,T2EX 上的负跳变而出现捕捉或重
载时,EXF2 会被硬件置位。定时器 2 打开,EXF2=1 时,将引导CPU
执行定时器2 中断程序。EXF2 必须如见清“0”。在向下/向上技术模式
(DCEN=1)下EXF2不能引起中断。
RCLK
串行口接收数据时钟标志位。若RCLK=1,串行口将使用定时器2 溢出
脉冲作为串行口工作模式1 和3 的串口接收时钟;RCLK=0,将使用定
时器1计数溢出作为串口接收时钟。
TCLK
串行口发送数据时钟标志位。若TCLK=1,串行口将使用定时器2 溢出
脉冲作为串行口工作模式1 和3 的串口发送时钟;TCLK=0,将使用定
时器1计数溢出作为串口发送时钟。
EXEN2
定时器2外部允许标志位。当EXEN2=1时,如果定时器2没有用作串行
时钟,T2EX(P1.1)的负跳变见引起定时器 2 捕捉和重载。若EXEN2
=0,定时器2将视T2EX端的信号无效
TR2 开始/停止控制定时器2。TR2=1,定时器2开始工作
定时器2 定时/计数选择标志位。=0,定时;=1,外部事
件计数(下降沿触发)
捕捉/重载选择标志位。当EXEN2=1时,=1,T2EX出现负脉冲,会引起捕捉操作;当定时器2溢出或EXEN2=1时T2EX出现负跳变,都
会出现自动重载操作。=0 将引起T2EX 的负脉冲。当RCKL=1 或TCKL=1时,此标志位无效,定时器2溢出时,强制做自动重载操作。
双数据指针寄存器:为了更有利于访问内部和外部数据存储器,系统提供了两路16位
数据指针寄存器:位于SFR中82H~83H的DP0和位于84H~85。特殊寄存器AUXR1
中DPS=0 选择DP0;DPS=1 选择DP1。用户应该在访问数据指针寄存器前先初始化
AT89S52
8
DPS至合理的值。
表3a AUXR:辅助寄存器
AUXR 地址:8EH 复位值:XXX00XX0B
不可位寻址
- - - WDIDLE DISRTO - - DISALE
7 6 5 4 3 2 1 0
- 预留扩展用
DISALE ALE使能标志位
DISALE 操作方式
0 ALE 以1/6晶振频率输出信号
1 ALE 只有在执行MOVX 或MOVC指令时激活
DISRTO 复位输出标志位
DISRTO
0 看门狗(WDT)定时结束,Reset 输出高电平
1 Reset 只有输入
WDIDLE 空闲模式下WDT使能标志位
WDIDLE
0 空闲模式下,WDT继续计数
1 空闲模式下,WDT停止计数
掉电标志位:掉电标志位(POF)位于特殊寄存器PCON的第四位(PCON.4)。上电期
间POF置“1”。POF可以软件控制使用与否,但不受复位影响。表3b AUXR1:辅助寄存器1
AUXR1 地址:A2H 复位值:XXXXXXX0B
不可位寻址
-------DPS
7 6 5 4 3 2 1 0
- 预留扩展用
DPS 数据指针选择位
DPS
0 选择DPTR寄存器DP0L和DP0H
1 选择DPTR寄存器DP1L和DP1H
AT89S52
9
存储器结构
MCS-51器件有单独的程序存储器和数据存储器。外部程序存储器和数据存储器都可以
64K寻址。
程序存储器:如果EA引脚接地,程序读取只从外部存储器开始。对于89S52,如果EA 接VCC,程序读写先从内部存储器(地址为0000H~1FFFH)开
始,接着从外部寻址,寻址地址为:2000H~FFFFH。
数据存储器:AT89S52 有256 字节片内数据存储器。高128 字节与特殊功能寄存器重
叠。也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。
当一条指令访问高于7FH 的地址时,寻址方式决定CPU 访问高128 字节RAM 还是特
殊功能寄存器空间。直接寻址方式访问特殊功能寄存器(SFR)。例如,下面的直接寻址指令访问0A0H(P2口)存储单元
MOV 0A0H , #data
使用间接寻址方式访问高128 字节RAM。例如,下面的间接寻址方式中,R0 内容为
0A0H,访问的是地址0A0H的寄存器,而不是P2口(它的地址也是0A0H)。
MOV @R0 , #data
堆栈操作也是简介寻址方式。因此,高128字节数据RAM也可用于堆栈空间。
看门狗定时器
WDT是一种需要软件控制的复位方式。WDT 由13位计数器和特殊功能寄存器中的看
门狗定时器复位存储器(WDTRST)构成。WDT 在默认情况下无法工作;为了激活
WDT,户用必须往WDTRST 寄存器(地址:0A6H)中依次写入01EH 和0E1H。当
WDT激活后,晶振工作,WDT在每个机器周期都会增加。WDT 计时周期依赖于外部
时钟频率。除了复位(硬件复位或WDT溢出复位),没有
办法
鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载
停止WDT工作。当WDT
溢出,它将驱动RSR引脚一个高个电平输出。
WDT的使用
为了激活WDT,用户必须向WDTRST寄存器(地址为0A6H的SFR)依次写入0E1H
和0E1H。当WDT激活后,用户必须向WDTRST写入01EH和0E1H喂狗来避免WDT
溢出。当计数达到8191(1FFFH)时,13 位计数器将会溢出,这将会复位器件。晶振正
常工作、WDT激活后,每一个机器周期WDT 都会增加。为了复位WDT,用户必须向
WDTRST 写入01EH 和0E1H(WDTRST 是只读寄存器)。WDT 计数器不能读或写。
当WDT 计数器溢出时,将给RST 引脚产生一个复位脉冲输出,这个复位脉冲持续96
个晶振周期(TOSC),其中TOSC=1/FOSC。为了很好地使用WDT,应该在一定时间
内周期性写入那部分代码,以避免WDT复位。
掉电和空闲方式下的WDT
在掉电模式下,晶振停止工作,这意味这WDT也停止了工作。在这种方式下,用户不
必喂狗。有两种方式可以离开掉电模式:硬件复位或通过一个激活的外部中断。通过硬
件复位退出掉电模式后,用户就应该给WDT 喂狗,就如同通常AT89S52 复位一样。
通过中断退出掉电模式的情形有很大的不同。中断应持续拉低很长一段时间,使得晶振
AT89S52
10
稳定。当中断拉高后,执行中断服务程序。为了防止WDT在中断保持低电平的时候复
位器件,WDT 直到中断拉低后才开始工作。这就意味着WDT 应该在中断服务程序中
复位。
为了确保在离开掉电模式最初的几个状态WDT不被溢出,最好在进入掉电模式前就复
位WDT。
在进入待机模式前,特殊寄存器AUXR的WDIDLE位用来决定WDT是否继续计数。
默认状态下,在待机模式下,WDIDLE=0,WDT继续计数。为了防止WDT在待机模
式下复位AT89S52,用户应该建立一个定时器,定时离开待机模式,喂狗,再重新进
入待机模式。
UART
在AT89S52 中,UART 的操作与AT89C51 和AT89C52 一样。为了获得更深入的关于
UART 的信息,可参考ATMEL 网站()。从这个主页,选择
“Products”,然后选择“8051-Architech Flash Microcontroller”,再选择“Product
Overview”即可。
定时器0 和定时器1
在AT89S52 中,定时器0 和定时器 1 的操作与AT89C51 和AT89C52 一样。为了获得
更深入的关于UART 的信息,可参考ATMEL 网站()。从这个主
页,选择“Products”,然后选择“8051-Architech Flash Microcontroller”,再选择“Product
Overview”即可。
定时器2
定时器2是一个16位定时/计数器,它既可以做定时器,又可以做事件计数器。其工作
方式由特殊寄存器T2CON中的C/T2位选择(如表2所示)。定时器2有三种工作模式:
捕捉方式、自动重载(向下或向上计数)和波特率发生器。如表3 所示,工作模式由
T2CON中的相关位选择。定时器2 有2 个8位寄存器:TH2和TL2。在定时工作方式
中,每个机器周期,TL2 寄存器都会加1。由于一个机器周期由12 个晶振周期构成,
因此,计数频率就是晶振频率的1/12。
表3 定时器2工作模式
RCLK+TCLK CP/RL2 TR2 MODE
0 0 1 16位自动重载