找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4142|回复: 10
收起左侧

单片机外部中断计数,T0口计时,使用TRCT5000来检测转速,结果不正确

[复制链接]
ID:361216 发表于 2018-8-3 11:55 | 显示全部楼层 |阅读模式
小弟用89C52单片机在INT0上接了个TRCT5000来计数,测量电机转速,但不管怎么弄数值都不会超过248,有没有大侠遇到过这样的情况。
回复

使用道具 举报

ID:111634 发表于 2018-8-3 20:23 | 显示全部楼层
本帖最后由 zl2168 于 2018-8-3 22:23 编辑

给你介绍一个正确有效看得懂的案例,自己对照查错吧!
Proteus仿真一下,确认有效
实例71  统计T0引脚上10分钟内的脉冲数
实例71 统计T0引脚上10分钟内脉冲数.rar (52.96 KB, 下载次数: 50)

评分

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

查看全部评分

回复

使用道具 举报

ID:382689 发表于 2018-8-3 22:01 | 显示全部楼层
你说的是检测出来的转速吗?不超过248。
回复

使用道具 举报

ID:361216 发表于 2018-8-4 11:58 | 显示全部楼层
iyouone 发表于 2018-8-3 22:01
你说的是检测出来的转速吗?不超过248。

是的,不知道是怎么回事。我还专门另外买了一个转速表来对比。转速表检测结果在6500的时候,单片机这边依然不稳定且不超过248,头都搞大了,没有搞清楚。
回复

使用道具 举报

ID:361216 发表于 2018-8-4 11:58 | 显示全部楼层
zl2168 发表于 2018-8-3 20:23
给你介绍一个正确有效看得懂的案例,自己对照查错吧!
先Proteus仿真一下,确认有效实例71  统计T0引脚上1 ...

谢谢了,我的哥!!!
回复

使用道具 举报

ID:213173 发表于 2018-8-4 21:53 | 显示全部楼层
用T0外部脉冲计数的仿真
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar code table[]={                                        //0~F数组
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar i=0,ge,shi,bai,qian;
uint j=0;
void InitTimer0()
{
        TMOD= 0x15;                //T0外部脉冲计数,T1定时50ms
        TH0 = 0x00;
        TL0 = 0x00;
        TH1 = 0x3C;                //设置定时初值50ms
        TL1 = 0xB0;                //设置定时初值50ms
        TR1 = 1;                        //定时器1开始计时
        TR0 = 1;                        //定时器0开始计数
        EA = 1;
        ET1 = 1;
}
void display()
{
        static uchar num=0;
        P0=0x00;        //消隐
        switch(num)
        {
                case 0:
                        P2=0xfe;
                        P0=table[qian];
                        num++;
                 break;       

                case 1:
                        P2=0xfd;
                        P0=table[bai];
                        num++;
                 break;       

                case 2:
                        P2=0xfb;
                        P0=table[shi];
                        num++;
                 break;       

                case 3:
                        P2=0xf7;
                        P0=table[ge];
                        num=0;
                 break;       
        }
}
void main()
{
        InitTimer0();
        while(1)
        {
                qian = j/1000;                        // 千位
                bai  = j%1000/100;        // 百位
                shi  = j%100/10;                // 十位
                ge   = j%10;                        // 个位
                display();
        }
}
void timer1() interrupt 3
{
        TH1 = 0x3C;
        TL1 = 0xB0;
        i++;
        if(i>=20)//1秒
        {
                i=0;
                j=TH0<<8|TL0;
                TH0=TL0=0;
        }
}

无标题.jpg


评分

参与人数 1黑币 +7 收起 理由
lhqsbz + 7

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2018-8-5 07:07 | 显示全部楼层
lhqsbz 发表于 2018-8-4 11:58
谢谢了,我的哥!!!

你Proteus试了没有?试了有效,然后看看程序,对照思考,必然有所收获。
回复

使用道具 举报

ID:361216 发表于 2018-8-15 09:49 | 显示全部楼层
wulin 发表于 2018-8-4 21:53
用T0外部脉冲计数的仿真
#include
#define uint unsigned int

谢谢,大侠。我和系统一共要处理5个检测量,两个温度检测,两个转速,一个角度,还有串口发送,温度和角度以及串口都正确,就只有两个转速不正常,我是分别接到外部0、1中断口上的,搞了好久了没有结果。
回复

使用道具 举报

ID:361216 发表于 2018-8-15 09:50 | 显示全部楼层
zl2168 发表于 2018-8-5 07:07
你Proteus试了没有?试了有效,然后看看程序,对照思考,必然有所收获。

大哥,没有上proteus直接接的实物进行调试的,心想这个也不复杂。系统一共要处理5个检测量,两个温度检测,两个转速,一个角度,还有串口发送,温度和角度以及串口都正确,就只有两个转速不正常,我是分别接到外部0、1中断口上的,搞了好久了没有结果。
回复

使用道具 举报

ID:213173 发表于 2018-8-15 13:52 | 显示全部楼层
lhqsbz 发表于 2018-8-15 09:49
谢谢,大侠。我和系统一共要处理5个检测量,两个温度检测,两个转速,一个角度,还有串口发送,温度和角 ...

外部脉冲计数与外部中断计数是不同的计数方法,输入端口也不同,不要混淆了。我给你的示例是用T0外部脉冲计数的仿真程序。
回复

使用道具 举报

ID:361216 发表于 2018-8-26 09:41 | 显示全部楼层
我去,闹了个乌龙,问题解决了,定义变量时把数据型搞错了,改成一样后,问题解决了!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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