zls3210018 发表于 2018-6-10 19:40:59

求教89C52定时器2的使用

为使用89c52的定时器2,编写了一段C语言程序,让一个灯闪烁。程序如下:
#include<reg52.h>

sbit led1 = P1^0;
int i = 0;

void timer1_inte()//定时器初始化函数
{
        TMOD = 0x01;   //定时器T0选择工作方式1
        TH2 = 0x4c;           //设置初始值
        TL2 = 0x00;
        EA = 1;                   //打开总中断
        ET2 = 1;           //打开定时器T2中断
        TR2 = 1;           //启动定时器T2
}

void main()
{
        led1 = 0;
        timer1_inte();
        while(1)
        {       
                if(i==20)
                {       
                        led1 = ~led1;
                        i=0;
                }
        }
}

void tmer3() interrupt 3
{
        TF2 = 0;
        TH2 = 0x4c;                  //设置初始值
        TL2 = 0x00;
        i=i+1;
}
但烧录后不能运行,请高手指点。

ycx2002 发表于 2018-6-10 19:59:57

寄存器设置错误~~

zls3210018 发表于 2018-6-10 20:13:47

寄存器设置
TMOD = 0x01;   //定时器T0选择工作方式1
是为了试一下T0定时器用的,将其去掉后仍是一样。
将程序中TH2等等改成TH0后,运行通过。也就是这个程序用T0定时器是成功的。

zls3210018 发表于 2018-6-10 20:15:10

如果是其它寄存器设置,烦请告知。谢谢!

huxiangming 发表于 2018-6-10 20:39:18

本帖最后由 huxiangming 于 2018-6-10 20:40 编辑

T2的中断号应该是5.
void timer2() interrupt 5

流小新星 发表于 2018-6-10 21:33:42

把 main() 写到最后

https://blog.csdn.net/u013020969/article/details/39588167

飞蟾 发表于 2018-6-10 21:55:23

你这程序是直接用定时器1的程序改的吧?完全不对路,能正常运行才怪。建议好好看看Datasheet里关于Timer2的说明:中断号是5不是3,上面已经有人说了;初始化时不需要设置TMOD,而是T2CON=0x00.

zls3210018 发表于 2018-6-11 16:46:43

把中断号3改成5,试验成功。TOMD不需要设置是知道的。T2CON的默认值是0,这里可以不设置。但中断号必须是5我真不知道,资料上只是说中断号是编译器识别不同中断的唯一编号,为什么必须是5就不知道了,现在仍然不知道。

zls3210018 发表于 2018-6-11 16:47:12

谢谢各位高手的指点!

longshort 发表于 2018-6-11 16:57:25

zls3210018 发表于 2018-6-11 16:46
把中断号3改成5,试验成功。TOMD不需要设置是知道的。T2CON的默认值是0,这里可以不设置。但中断号必须是5 ...

中断控制寄存器IE、IPL、IPH的位5,定义为T2的控制位。这是由硬件或微程序决定的,用户不可更改。

ycx2002 发表于 2018-6-17 00:49:41

本帖最后由 ycx2002 于 2018-6-17 00:50 编辑

设置RCAP2H和2L即可,百度一下,方法一坨一坨的。
页: [1]
查看完整版本: 求教89C52定时器2的使用