找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助大佬,想用STC12C5A60S2单片机做一个频率计,但是遇到问题了

[复制链接]
跳转到指定楼层
楼主
原理图我贴在这里,希望大佬们帮我看一下
目前我的接上电源,屏幕只能显示:f 0.000000Hz,接入信号没有办法做到测频

代码如下:
#include"STC12C5A60S2.H"
#include "stdio.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB     P0        //数据信号
/************端口定义***************/
sbit lcdrs = P1^0;
sbit lcdrw = P1^1;
sbit lcden = P1^2;         
sbit GATE  = P1^5;         //门控信号
/************变量声明***************/
uint t0,t1;
double feq;        //测得频率值
uint x=1000;//初始化闸门时间                                         
/************1ms延时***************/
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=1400;y>0;y--);
}
/**********液晶写指令*************/
void write_com(uchar com)
{
        LCD_DB=com;
                lcdrs=0;
                lcdrw=0;
        lcden=0;
        delay(1);
        lcden=1;
        delay(1);
        lcden=0;      
}
/**********液晶写数据*************/
void write_date(uchar date)
{
        LCD_DB=date;
                lcdrs=1;
                lcdrw=0;
        lcden=0;
        delay(1);
        lcden=1;
        delay(1);
        lcden=0;      
}
/**********液晶初始化*************/
void init()
{
        uchar num;
        uchar code table[]="f: ---Ready---- ";//初始化显示
        lcden=0;
        GATE=0;                                                                //开始先关闸门保证第一次测量准确
        write_com(0x38); //设置8位格式,2行,5x7
        write_com(0x0c); //整体显示,关光标,不闪烁
        write_com(0x06); //设定输入方式,增量不移位
        write_com(0x01); //清除屏幕显示         
        write_com(0x80);
        for(num=0;num<15;num++)
                write_date(table[num]);
            TMOD=0xD9;        //设置计数器,计数器0和计数器1为工作方式1,T0内计数,T1外计数
        AUXR=(AUXR|0x80);
        AUXR=(AUXR|0x40);
        AUXR=(AUXR|0x04);   
        TR0=1;              //计数器0开始计数                        
        TR1=1;                                //计数器1开始计数
        ET0=1;              //打开计数器0中断                    
        ET1=1;                                //打开计数器1中断
        EA=1;               //开总中断,EA最后保证一起计数

}
/**********拆分显示*************/
void write(double f)                              
{
        uchar i;
        uchar ch[12];
        sprintf(ch, "%.6f", f);       //把数转换为字符串
        for(i=0;ch[ i]!='\0';i++)
        {
           write_date(ch[ i]);
        }         
}
/*********频率计算*************/
void calcu_Fx()
{      
        uchar i;
        float N,M;
        double feq_cl;
        M=(t0*65536)+(TH0*256)+TL0; //内计数值
        N=(t1*65536)+(TH1*256)+TL1; //外计数值
        feq=(N/M)*12000000;
                feq_cl=feq;

        write_com(0x80+0x03);                //第一行刷屏
        for(i=0;i<16;i++)
                write_date(' ');
        if(feq>0.05&feq<=1000)                //频率显示HZ
        {
                write_com(0x80+0x03);
                write(feq_cl);
                write_date('H');                                 
                write_date('z');
        }
        else                                         //无输入频率显示0HZ
        {
             write_com(0x80+0x03);
                write(0);
                write_date('H');                              
            write_date('z');
        }


}
/********自动闸门选择*************/
void chane_time()
{
        if(feq>0.05&feq<=0.5)        //频率小于0.5HZ 闸门时间20秒                                 
                x=20000;
        if(feq>0.5&feq<=10)//频率小于10HZ大于0.5HZ,闸门时间6秒
                x=8000;                                          
        if(feq>10&feq<=100)//频率小于100HZ大于10HZ,闸门时间4秒
                x=6000;      
        if(feq>100&feq<=10000)//频率小于2000HZ大于100HZ,闸门时间2秒
                x=4000;                                 
        if(feq>10000)                  //频率大于10K闸门时间1S               
                x=2000;

}

/**********主程序*************/
void main()
{
        init();                                            //测频初始化
        while(1)
        {
                GATE=1;                                         //开闸门
                delay(x);                          //延时关门时间(第一次1秒)
                GATE=0;                                 //闸门时间到gate为0;关门然后计算
                calcu_Fx();                         //计算频率
                TH1=TL1=TH0=TL0=t1=t0=0;  //所以计数清零为下次做准备      
                chane_time();            //根据频率选择闸门时间
        }
}
/*******定时器0对内计数*********/
void timer0() interrupt 1
{
        t0++; //内部计数
}
/*******定时器1对外计数*********/
void timer1() interrupt 3
{
        t1++;//外部计数      
}

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

使用道具 举报

沙发
ID:1020821 发表于 2022-4-28 17:13 | 只看该作者
有没有大佬来帮我解答一下呀
回复

使用道具 举报

板凳
ID:624769 发表于 2022-4-28 18:52 | 只看该作者
撇开代码不讲……

你确定你这个电路,能用?


回复

使用道具 举报

地板
ID:1020821 发表于 2022-4-28 19:26 | 只看该作者
188610329 发表于 2022-4-28 18:52
撇开代码不讲……

你确定你这个电路,能用?

啊,这里是标注错误
回复

使用道具 举报

5#
ID:1020821 发表于 2022-4-28 19:28 | 只看该作者
188610329 发表于 2022-4-28 18:52
撇开代码不讲……

你确定你这个电路,能用?

大佬,帮我看一下是哪里不对了
回复

使用道具 举报

6#
ID:624769 发表于 2022-4-28 20:14 | 只看该作者
没看明白你这个  代码和硬件之间的动作逻辑.

     TMOD=0xD9;        //设置计数器,计数器0和计数器1为工作方式1,T0内计数,T1外计数
哪这句来说, 你GATE0  和 GATE1 都有效了。 你INT0 INT1 至少应该都有线吧?实际上,你的原理图里只有INT0 有接线。 关键是没找到你捕捉频率的切入点。你依据什么捕捉频率?

话说,你用的是 STC12C5A60S2 吧? 他有CCP的呀,用CCP不香么?整地这个奇怪的定时器到底是什么鬼?“闸门” 又是为了什么作用?
个人觉得计算用定时器,一个定时器计时,一个定时器数数, 除一下不就是频率了? 外部电路整那么复杂你都不知问题出在什么地方。

回复

使用道具 举报

7#
ID:213173 发表于 2022-4-28 21:04 | 只看该作者
用STC12C5A60S2单片机做频率计完全没有问题,但是你希望这个频率计的计量范围是多大?这关系到硬件电路设计方案。看你的电路图未必合理。
回复

使用道具 举报

8#
ID:1020821 发表于 2022-4-29 11:30 | 只看该作者
wulin 发表于 2022-4-28 21:04
用STC12C5A60S2单片机做频率计完全没有问题,但是你希望这个频率计的计量范围是多大?这关系到硬件电路设计 ...

我也感觉我的电路设计有很大问题,昨天晚上检查电路就排查了两个问题,但是程序相关的还没有排查,希望大佬能指导一下
回复

使用道具 举报

9#
ID:1020821 发表于 2022-4-29 21:05 | 只看该作者
188610329 发表于 2022-4-28 20:14
没看明白你这个  代码和硬件之间的动作逻辑.

     TMOD=0xD9;        //设置计数器,计数器0和计数器1为 ...

你这么一说,我也感觉好像逻辑是有一点问题,但是没办法私底下交流
回复

使用道具 举报

10#
ID:297393 发表于 2022-8-21 11:23 | 只看该作者
我在 https://www.elecfans.com/article/83/116/2017/20171217604523.html 看到过相似电路,你把与门接错了。1B和2B应短接,2Y接P3.5端口。我理解原电路P3.2应是开闸门下降沿触发的中断信号,这个好像多此一举有机会做个试验。你在主程序中计算频率之前定时器中断不用关吗?这是个等精度测频法,据说精度很高。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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