找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2单片机定时计数出现不知道的问题

[复制链接]
跳转到指定楼层
楼主
ID:826942 发表于 2020-11-3 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在用60S2做以后测风速的实验,但是在定时计数上出现问题,只用T1的计数功能没问题,但是风速不能清零,要用T0定时一秒的话,就检测不到风速,有大佬知道原因吗?源码如下

void  Timer1_init(void)
{
        TMOD = 0X62;//1设定定时器1模式2,计数功能0110 定时器0模式2,定时功能 0010
        TH1  = 0xfe;//设置定计数器初值  PS这里有两种思路 1 一个脉冲溢出 进T1的服务函数加一 ,或者直接计数在T0的服务函数里读值
        TL1  = 0xfe;
        TH0  =(65536-50000)/256;//50ms中断一次
  TL0  =(65536-50000)%256;
        ET0  = 1;
        ET1 = 1;
        TR0  = 1;
        TR1 = 1; //启动定时器
        EA   = 1;
}
/*---------------------T0中断服务子函数------------------*/
/*
void Timer0_int(void) interrupt 1  using  2  //定时T0中断服务程序
                TR0=0;TR1=0;//先关闭定时器
        //                fs=TH1;
                //fs=fs << 8;
   // fs=        TL1;
    flag=1;      //转换结束
                TH1=1;TL1=1; //清0重新计数
          TR0=1;TR1=1;        TF0=0;
         }
}
/*---------------------T1中断服务子函数------------------*/
/*
void Timer1_int(void) interrupt 3 using  1   //计数T1中断服务程序
{
        fs++;
        //TF1=0;
}


如果只用T1的服务函数就可以准确读取FS的脉冲,但是要同时用T0的服务函数 T0会增加 但是T1的FS就读不出来
    post_newreply
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-11-3 21:23 | 只看该作者
一般采用一个定时器作外部脉冲计数器,一个定时器作秒计时。例如:
外部脉冲计数值=TF1溢出次数*65536+(TH1*256+TL1)
void  Timer1_init(void)
{
        TMOD = 0X52;//设T0自动重装定时功能,T1外部计数功能
        TH0  = 0x06;//250us
        TL0  = 0x06;
        TH1  = 0x00;
        TL1  = 0x00;
        TF1  = 0;
        TR0  = 1;
        TR1  = 1;
        ET0  = 1;
        EA   = 1;
}

void Timer0_int(void) interrupt 1
{
        if(TF1==1)
        {
                TF1=0;
                count1++;
        }
        num++;
        if(nmu>=4000)//1秒
        {
                num=0;
                TR1=0;
                count2=count1*65536+(TH1<<8|TL1);
                TH1=0x00;
                TL1=0x00;
                TR1=1;
        }
}
回复

使用道具 举报

板凳
ID:826942 发表于 2020-11-3 22:39 | 只看该作者
wulin 发表于 2020-11-3 21:23
一般采用一个定时器作外部脉冲计数器,一个定时器作秒计时。例如:
外部脉冲计数值=TF1溢出次数*65536+(TH ...

我这也是一个t0做秒计时,t1外部脉冲计数,只是两个分成两个中断服务函数,只是不明白是那里出的问题
如果用t0的那个,我那个读取脉冲的方式有没有问题?没有的话那为什么实际操作时不能读取?求
大佬指点迷津
回复

使用道具 举报

地板
ID:213173 发表于 2020-11-4 08:06 | 只看该作者
0711zhao 发表于 2020-11-3 22:39
我这也是一个t0做秒计时,t1外部脉冲计数,只是两个分成两个中断服务函数,只是不明白是那里出的问题
如 ...

楼主这段程序从构思到代码都有错误。T0模式2最大定时时间256us,不可能产生50ms中断。T1初值0xfe,外部计数2个脉冲即发生中断,也就是外部脉冲数=fs*2。如果两个中断没有协调好也会发生冲突。
类似功能的程序常采用外部中断+定时器计数,楼主可以参考频率表的设计,坛内示例很多。
回复

使用道具 举报

5#
ID:826942 发表于 2020-11-4 08:59 | 只看该作者
wulin 发表于 2020-11-4 08:06
楼主这段程序从构思到代码都有错误。T0模式2最大定时时间256us,不可能产生50ms中断。T1初值0xfe,外部计 ...

谢谢大佬的指点
回复

使用道具 举报

6#
ID:826942 发表于 2020-11-4 16:59 | 只看该作者
wulin 发表于 2020-11-4 08:06
楼主这段程序从构思到代码都有错误。T0模式2最大定时时间256us,不可能产生50ms中断。T1初值0xfe,外部计 ...

大佬你好,我用你这段代码后,只要一有外部脉冲就显示白屏,怀疑是哪个地方出问题,程序跑死了 ,但一直找不到原因。
回复

使用道具 举报

7#
ID:213173 发表于 2020-11-5 08:08 | 只看该作者
0711zhao 发表于 2020-11-4 16:59
大佬你好,我用你这段代码后,只要一有外部脉冲就显示白屏,怀疑是哪个地方出问题,程序跑死了 ,但一直 ...

如果各功能函数没有问题就要从程序构架找问题,要防止中断冲突。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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