标题: 51单片机定时器交替工作 可以这么写吗? 可是运行时间不对啊 求指教 [打印本页]

作者: guanxin13    时间: 2017-11-3 00:36
标题: 51单片机定时器交替工作 可以这么写吗? 可是运行时间不对啊 求指教
12M晶振  stc89C52RC
代码
#include <reg52.h>

sbit pwm=P1^0;
int i=0,j=0;

void timer00()
{
TMOD=0x01; //T0 16位
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
ET0=1;
EA=1;
//TRO=1;
}


void timer11()
{
TMOD=0x10; //T1 16位
TH1=(65535-10000)/256;
TL1=(65535-10000)%256;
ET1=1;
EA=1;
//TR1=1;
}


void main()
{
pwm=1;
timer00();
timer11();
TR0=1;
while(1);
}


void timer0() interrupt 1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
        i++;
        if(i==100)//时间1S
          {
                  pwm=0;
                i=0;
                TR0=0;
                TR1=1;
          }
}

void timer1() interrupt 3
{
TH1=(65535-10000)/256;
TL1=(65535-10000)%256;
        j++;
        if(j==100) //时间1S
          {
                  pwm=1;
                j=0;
                TR1=0;
                TR0=1;
          }
}


为什么不是1S高电平  1S低电平呢 ??   




作者: wulin    时间: 2017-11-3 06:21
TMOD被错误设置,无法交替工作。可以分别写成TMOD |= 0x01;和TMOD |= 0x10;或者合在一起
void Timer_Init()
{
        TMOD=0x11;
        TH0=(65535-10000)/256;
        TL0=(65535-10000)%256;
        TH1=(65535-10000)/256;
        TL1=(65535-10000)%256;
        ET0=1;
        ET1=1;
        EA=1;
}
作者: HC6800-ES-V2.0    时间: 2017-11-3 09:16
我找到你的程序问题了。
在我的开发板上运行成功。
错误很简单:就是把一个功能,复制成两个功能时,没有考虑到原来的设置被改变了!!!!!
你把你的两个定时器设置中的TMOD均改为0x11,就好了。原因嘛,你自己想想吧。
好好看看芯片手册中的例子程序。我以前都没看过,最近在学习新的芯片,阅读芯片手册中的例程,对我触动很大,例程中的程序书写方式,让我反应过来你会出现的问题。而例程中的书写方式,在一般的程序教程中都是没有的。

作者: guanxin13    时间: 2017-11-3 09:30
wulin 发表于 2017-11-3 06:21
TMOD被错误设置,无法交替工作。可以分别写成TMOD |= 0x01;和TMOD |= 0x10;或者合在一起
void Timer_Init( ...

恩恩 明白了   确实是这的问题  想了半天没想出来问题   谢谢啊
作者: guanxin13    时间: 2017-11-3 09:32
HC6800-ES-V2.0 发表于 2017-11-3 09:16
我找到你的程序问题了。
在我的开发板上运行成功。
错误很简单:就是把一个功能,复制成两个功能时,没有 ...

恩恩  明白了
作者: yzwzfyz    时间: 2017-11-3 10:09
脑子不够用,主程序起动了T0后又起动了T1,前后相差估计在几个微秒。
1秒后T0中断,你将PWM清0,几个微秒后T1中断到来你又将它置1。
以后重复这个动作,你想想应该是怎样?

其实很简单:只用一个T0就可以了,中断后将PWM求反。PWM就可以输出2Hz的脉冲了。

实在要按你的思路做,也要将T0、T1的时间错天0.5秒!(T0起动0.5秒后,再起动T1)
作者: guanxin13    时间: 2017-11-5 01:49
yzwzfyz 发表于 2017-11-3 10:09
脑子不够用,主程序起动了T0后又起动了T1,前后相差估计在几个微秒。
1秒后T0中断,你将PWM清0,几个微秒 ...

对哈 这样计时确实不准  计时逻辑没理清楚




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1