找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3206|回复: 6
打印 上一主题 下一主题
收起左侧

51单片机定时器交替工作 可以这么写吗? 可是运行时间不对啊 求指教

[复制链接]
跳转到指定楼层
楼主
ID:234581 发表于 2017-11-3 00:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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低电平呢 ??   



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 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;
}
回复

使用道具 举报

板凳
ID:164602 发表于 2017-11-3 09:16 | 只看该作者
我找到你的程序问题了。
在我的开发板上运行成功。
错误很简单:就是把一个功能,复制成两个功能时,没有考虑到原来的设置被改变了!!!!!
你把你的两个定时器设置中的TMOD均改为0x11,就好了。原因嘛,你自己想想吧。
好好看看芯片手册中的例子程序。我以前都没看过,最近在学习新的芯片,阅读芯片手册中的例程,对我触动很大,例程中的程序书写方式,让我反应过来你会出现的问题。而例程中的书写方式,在一般的程序教程中都是没有的。

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 赞一个!

查看全部评分

回复

使用道具 举报

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

恩恩 明白了   确实是这的问题  想了半天没想出来问题   谢谢啊
回复

使用道具 举报

5#
ID:234581 发表于 2017-11-3 09:32 | 只看该作者
HC6800-ES-V2.0 发表于 2017-11-3 09:16
我找到你的程序问题了。
在我的开发板上运行成功。
错误很简单:就是把一个功能,复制成两个功能时,没有 ...

恩恩  明白了
回复

使用道具 举报

6#
ID:123289 发表于 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)
回复

使用道具 举报

7#
ID:234581 发表于 2017-11-5 01:49 | 只看该作者
yzwzfyz 发表于 2017-11-3 10:09
脑子不够用,主程序起动了T0后又起动了T1,前后相差估计在几个微秒。
1秒后T0中断,你将PWM清0,几个微秒 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表