为什么不能进入AT89S52单片机的定时器2中断服务程序?程序在Keil编译没有问题,请高手指点。程序如下:

#include <AT89X52.H>
typedef unsigned char uchar;

sbit LED=P1^0;
unsigned int j=0;
//-------------------------------------------------------------------------------
void delay_s(unsigned int s) //延时函数,延时s*0.1 秒
{
int x;
int y=100;
for(x=0;x<=s;x++)
{
for(y=0;y<100;y++)
{
unsigned int k=110;
while(k--);
}
}
}
//---------------------------------------------------------------------------------------------------------
void init() //单片机初始化函数
{
T2MOD=0x00;
T2CON=0x00;

//TH2=0x6F; //将定时器2的定时时间40ms
//TL2=0x77;
RCAP2H=0x6F;
RCAP2L=0x77;

EA=1; //开总中断
ET2=1; //使能定时器2中断
TR2=1; //启动定时器2
TF2=0; //清除定时器2溢出标志
EXF2=0; //清定时器2外部中断
PT2=1; //设定定时器2为高优先级中断
}
//-----------------------------------------------------------------------------------------------------------
void T2_timer() interrupt 5 //定时器2中断服务函数
{
int xy=6;
TF2=0; //清除定时器2溢出标志
EXF2=0; //清定时器2外部中断
if(j>=66) //2.65秒
{
j=0;
while(xy--) //LED灯闪烁xy次
{
LED=0;
delay_s(4); //延时0.4s
LED=1;
delay_s(4);
}
}
}
//-------------------------------主函数main()-----------------------------------------------
main()
{
init(); //初始化单片机
while(1);
}

第1个回答  2013-06-22
你的程序能进入中断服务,但是每次进入中断,你没有让变量j递增,所以j的值永远是0,就永远不会让LED闪烁了。
你把程序改成这样:
if(j>=66)
{
....
}else j++;
另外,尽量不要在中断中进行延时,虽然你这里是没有什么影响,但这种写法应该尽量避免。本回答被网友采纳
第2个回答  2013-06-22
AT89S52内部没有定时器2.
STC的有些芯片内部有。追问

不是吧,我看资料AT89S52的资料,有定时器0、1、2啊。STC89C52里有定时器2

追答

你是不是搞错了

追问

不会,不信你去查资料。你说没有定时器2,你是在什么资料上看的?

追答

不好意思,我看错资料了。

应该是你寄存器配置不正确造成的,你查查

追问

我查过很多资料了,寄存器都是这样配置的,我下载确实不知道是怎么回事。希望大侠能把程序在单片机上运行帮我找出问题,感激不尽!

追答

T2MOD = 0; //

T2CON = 0; //16位自动重装模式

TR2 = 1; //启动计数

RCAP2L = (65536-50000)%256;
RCAP2H = (65536-50000)/256;

TL2 = (65536-50000)%256;
TH2 = (65536-50000)/256;

ET2 =1;

我用这个配置,在STC单片机上是可以运行的,你试试看

追问

为什么一定要用表达式给寄存器赋值呢?我照你的程序试试

本回答被提问者采纳

同一个程序在stc89c52单片机上能用,但是在at89s52上不能用。但是其他...
at89s52是没有的,如果使用xdata定义的变量,at89s52会尝试通过P0 P2 ALE P3.6 P3.7这几个IO去读取外部SRAM的数据。如果没有外部SRAM读回来的数据始终是FF这样就导致程序无法执行了。如果Keil里面选择了Large:variables in XDATA的模式的话 STC89C52可以运行AT89S52是无法运行的 STC89C52能运行但是AT89S52无...

单片机的问题!我使用的是AT89S52单片机,使用KEIL开发程序找不到对应的A...
就选c51一样,用到s52的特殊功能寄存器如果c51头文件里面没有声明的话自己声明就可以用了,stc型号这些都一样,用汇编的话更不用理会了

keil编译错误如何解决???
AT89S52共有256Bytes RAM,10个unsigned char型数据肯定没问题了,但是10个unsigned char型数组,如果每个数组维数为20,那就20*10=200bytes。不知到LZ的情况是咋样的 建议:1、如果数据>128Bytes <256Bytes 将数组定义添加idata 2、如果数据>256Bytes可选择带XRAM的单片机,将数组定义到xdata 3、尽量减...

AT89S52在KEIL中如何设置?
低128字节的RAM空间可以以“直接寻址”或“间接寻址”方式访问;高128字节的RAM空间只能以“间接寻址”方式访问;若以“直接寻址”方式访问一个位于高128字节的地址,其实访问的是单片机的特殊寄存器空间;所以说,不是“变量不能超过128字节”,而是“可以以“直接寻址方式”访问的RAM空间不能超过128字节 ...

单片机的c语言中,#include <AT89X52.h>作用?它和#include<reg52.h>...
1、AT89X52.h指的就是s或c都可以用。C和S在看门狗、定时器上面有一定的区别,因而实际应用该单片机时要包含对应的头文件。而reg52.h是所有52单片机公共部分所通用的头文件,一般应用情况都能满足。2、reg51.h和reg52.h实质上是没有区别的,都是一些特殊功能寄存器的申明。当然,51里有的52中都...

at89s52单片机简介
1.硬件连接:将AT89S52单片机的P1口接到LED灯的正极,将LED灯的负极接到GND。2.编写程序:使用KeilC51编写程序,实现LED灯的闪烁功能。3.编译程序:将程序编译成HEX文件,用于烧录到AT89S52单片机中。4.烧录程序:使用烧录器将HEX文件烧录到AT89S52单片机中。5.运行程序:将AT89S52单片机上电,LED灯开始...

p89v52和at89s52有什么区别?
低EMI方式(ALE禁能)兼容TTL和CMOS逻辑电平 掉电检测 低功耗模式 -掉电模式,外部中断唤醒-空闲模式 AT89S52 1、与MCS-51单片机产品兼容;2、8K字节在系统可编程Flash存储器;3、1000次擦写周期;4、全静态操作:0Hz-33MHz;5、三级加密程序存储器;6、32个可编程I\/O口线;7、三个16位定时器\/...

AT89S52单片机有哪些特性?
13.AT89S52单片机的机器周期等于12个时钟振荡周期。14.51系列单片机有5个中断源,优先中断级。15.定时器工作方式2的特点是定时初值可以自动重装,目的是为了实现自动连续计数 或者产生周期性的定时脉冲。16. AT89S52单片机任何一个端口要想获得较大的驱动能力,要采用低电平输出。17.检测开关处于闭合状态还是...

请问:何处能够下载AT89S52单片机烧录程序?谢谢。
看芯片手册, 用ISP或JTAG.或者你是需要个什么测试Demo做试验? 用Keil自带例子编译一下不就成了. 没有的话pudn里面肯定有现成整体项目.

单片机8951,8952有什么区别呢,可以用8952代替8951吗?
2,,8952多了一个定时器T2;3,,8952内部有8K的程序存储空间,256直接的运行空间,8951只有4k的程序存储空间,128直接的运行空间;主要就是这几个区别, 所以说89c52 是完全可以代替8951的,但是8951 不一定可以代替8952,这个主要是看编写的程序 的功能 和程序的大小了,在keil里 ,code就是程序的...

相似回答