找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2506|回复: 15
收起左侧

简易频率计程序 不停的复位单片机 程序问题出在哪呢

[复制链接]
ID:183117 发表于 2017-3-24 17:31 | 显示全部楼层 |阅读模式
程序如下:
#include <reg52.h>
#include "lcd.h"


uint dispcount,lck;
uint disp;

uchar flag;

void Time0_init()           //方式1,初值1ms
{        
                TMOD=0x01;
                TH0=0xFC;
                TL0=0x18;
                ET0=1;
                TR0=1;
}        

void Time1_IntConfiguration()
{      
                PT0=0;
                PX1=1;        //优先级设置
        
                IT1=1;            //边沿触发
                EX1=1;
                EA=1;
}


void Time0_int() interrupt 1         //初值1ms,定时1s,每一秒中断一次,所记得数就是频率,即频率检测
{

          TH0=0xFC;
          TL0=0x18;
          lck++;
   if(lck==1000)
                {
                        flag=1;
                        disp=dispcount;                                        //disp==xxxx,则xxxxHZ
                        lck=0;
                }
}


void Time1_zhongduan() interrupt 2               //外部中断1,P3^3
{
                dispcount++;               //每一次中断,计数加一
                if(flag==1)
                        dispcount=0;

}

void main()
{
    Time0_init();
    Time1_IntConfiguration();
    lcd_init();
    while(1)
  {
    write_num(0,0,dispcount);
   }
}


LCD的程序就不放了,显示数字的程序都没有问题的
现在的问题是,这个程序,我用频率计给P3^3口提供频率,结果是,不停的复位单片机,dispcount永远只能计数为1,而且在松开P3^3口的瞬间,dispcount瞬间计数很多值,超过1000也会出现,这个没有规律。如果用独立按键置低电位给P3^3口,可以不停的累计dispcount。
现在程序问题出在哪呢
回复

使用道具 举报

ID:183117 发表于 2017-3-24 19:00 | 显示全部楼层
单独把定时器的程序给注释,dispcount也是只有松开的时候,瞬间计数很多值
回复

使用道具 举报

ID:183117 发表于 2017-3-24 19:00 | 显示全部楼层
有没有人救救我的程序
回复

使用道具 举报

ID:183117 发表于 2017-3-24 19:52 | 显示全部楼层
标题出错了,就是“简易频率计”而已,具体问题就是我后面描述的
回复

使用道具 举报

ID:183117 发表于 2017-3-24 19:53 | 显示全部楼层
求大神指点指点
回复

使用道具 举报

ID:183156 发表于 2017-3-24 20:56 | 显示全部楼层
测量的范围是多少
回复

使用道具 举报

ID:111634 发表于 2017-3-24 20:59 | 显示全部楼层
本帖最后由 zl2168 于 2017-3-24 21:00 编辑

测量脉冲频率


Proteus仿真一下,确认有效
实例73 测量脉冲频率.rar (52.74 KB, 下载次数: 7)
回复

使用道具 举报

ID:151348 发表于 2017-3-26 11:40 | 显示全部楼层
我帮你改了改,proteus仿真通过,你之前的逻辑不对哈
//************************************
//****************************************
void Time0_init()           //方式1,初值1ms
{        
                TMOD=0x01;
                TH0=0xFC;
                TL0=0x18;
                ET0=1;
                TR0=1;
}        

void Time1_IntConfiguration()
{      
                PT0=0;
                PX1=1;        //优先级设置      
                IT1=1;            //边沿触发
                EX1=1;
                EA=1;
}

void Time0_int() interrupt 1         //初值1ms,定时1s,每一秒中断一次,所记得数就是频率,即频率检测
{
        TH0=0xFC;
        TL0=0x18;
        lck++;
        if(lck==1000)
        {
                disp=dispcount;   //disp==xxxx,则xxxxHZ
                lck=0;
                dispcount=0;
        }
}

void Time1_zhongduan() interrupt 2               //外部中断1,P3^3
{
        dispcount++;               //每一次中断,计数加一
}
//**************************************
void main()
{
        LcdInitiate();
        Time0_init();
        Time1_IntConfiguration();
        while(1)
      {
                 write_num(0,0,disp);
       }
}
回复

使用道具 举报

ID:183117 发表于 2017-3-26 15:40 | 显示全部楼层
286352649 发表于 2017-3-24 20:56
测量的范围是多少

1000HZ左右,因为这个东西只是我做的课设其中一部分要到的原理
回复

使用道具 举报

ID:183117 发表于 2017-3-26 15:43 | 显示全部楼层
imxuheng 发表于 2017-3-26 11:40
我帮你改了改,proteus仿真通过,你之前的逻辑不对哈
//************************************
//******* ...

这个是我一开始的做法,还是实现不了才定义了个标志位作为清零,这个程序我试过也还是没法实现,现象和我发的一样
回复

使用道具 举报

ID:183117 发表于 2017-3-26 15:43 | 显示全部楼层

是我这个程序可以用吗?
回复

使用道具 举报

ID:183117 发表于 2017-3-26 15:44 | 显示全部楼层
286352649 发表于 2017-3-24 20:56
测量的范围是多少

1000HZ左右,因为这个东西只是我做的课设其中一部分要到的原理
回复

使用道具 举报

ID:151348 发表于 2017-3-26 15:56 | 显示全部楼层
碎步湖上 发表于 2017-3-26 15:43
是我这个程序可以用吗?

修改之后就是实现记录1s内外部脉冲个数
回复

使用道具 举报

ID:151348 发表于 2017-3-26 15:59 | 显示全部楼层
碎步湖上 发表于 2017-3-26 15:43
是我这个程序可以用吗?

你下载到单片机试试.如果P3.3口的按键1秒钟按1下,那你的显示器显示1;按键1秒钟按2下,显示器显示2
回复

使用道具 举报

ID:111634 发表于 2017-3-26 22:19 | 显示全部楼层
碎步湖上 发表于 2017-3-26 15:43
是我这个程序可以用吗?

你没看到5挡测量频率:10~10kHz?
回复

使用道具 举报

ID:183117 发表于 2017-4-4 12:22 | 显示全部楼层
imxuheng 发表于 2017-3-26 11:40
我帮你改了改,proteus仿真通过,你之前的逻辑不对哈
//************************************
//******* ...

void Time0_int() interrupt 1         //初值1ms,定时1s,每一秒中断一次,所记得数就是频率,即频率检测
{
        TH0=0xFC;
        TL0=0x18;
        lck++;
   temp=~temp;         //sbit temp=P1^0;使定时器每进入两次,temp一个周期
        if(lck==1000)
        {
                disp=dispcount;   //disp==xxxx,则xxxxHZ
                lck=0;
                dispcount=0;
        }
}



我在上述语句增加了一个temp,用P3^3直接检测我用单片机产生的方波(P1^0),也能正常显示是500,但是用P3^3接方波发生器的产生的方波(产生500HZ),显示一直是1,只有不停的短触,才会突然数值上升又停止,这是怎么回事
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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