历史上的今天

今天是:2024年11月12日(星期二)

2019年11月12日 | 一种智能频率计的设计与制作(AVR) 带仿真与源程序和原理图

发布者:红尘清梦 来源: 51hei关键字:智能频率计  AVR  串口上位机 手机看文章 扫描二维码
随时随地手机看文章

0.png 
基于avr单片机的频率计的仿真原理图

0.png 

俺毕业设计的小玩意.也许有人可以拿去玩.

当时刚出毕业选题就赶紧的选了这个简单的.免得以后为毕业设计费神.
这是最初的,后来给学校也是交的这个. 花了三天时间.

//*********************11月29日开始毕业选题
读了一点频率计原理,高频记数,低频测周期 规划了一下大体,坚决不用老师指定的51,
//*********************11月30日开始写代码
凑合着开始了,偏差很大,很无聊,晚上跟123JJ在51hei灌水,灌了阵找到思维了,继续写,基本完成
//*********************12月1日调试
写了个串口上位机对数据进行分析和记录,方便多了.仔细的调了下.不管他效率和规范了,出结果了就要得,马虎的收工了.
16MHz晶振,范围1Hz--5MHz,软件仿真测周期误差<1/8us.计数误差最大可能1hz. 当然液晶显示误差就大多了.显示位数有限.随便忽悠一下, 可以给老师交差了.前端信号处理和pcb以后再弄.

后来前端处理参照冬瓜哥的精华帖和建议,把CD4069作运放用.
感谢冬瓜哥给我打板,搭顺路车.

后来在寒假发神经又琢磨了一下,修改下代码,加上些别的东西,反正资源还足够,有些作了测试,有些只是空想,规划和写代码,没有测试.脉宽和占空比,电压表,示波器,欧姆表,信号发生器,温度计,电容表,电感表,逻辑仪,红外分析,弄了5,6天又停了,人太懒.再后来又忘干净了,只记得电容表是测充电时间.
再后来,写毕业论文,网上下了n多资料和论文用来copy,弄的电脑很乱,写到一半,实在太乱,文件整理中,大把的删文件夹,一不小心把软件都删了,还好在qq群共享里留下了这个最初版本.好险.差点作无用功.

0.png 

0.png 


下面是智能频率计的原理图是用ad画的.
0.png 

下面是主程序的源程序:

#ifndef main_c   //test ok

#define main_c

#endif 


#include "main.h"

//************************全局变量


volatile uint t0_cont;


volatile uint t1_cont;

volatile uchar flg1; //

//-------------------------------------------------------------------------

//     测试函数 用来初始化

//-------------------------------------------------------------------------

void test()

{

  send_str( "pinlvji" ); //完成后把所有串口去掉

  showstr( "cymometer", 1, 1, 9 ); //液晶显示

//  showstr( "1KHz", 12, 1, 4 );

  showstr( "Hz", 14, 2, 2 );

}


//-------------------------------------------------------------------------

//mcu初始化 端口 定时器 中断 外中断 变量

//-------------------------------------------------------------------------

void mcu_init()

{

//******************端口

  data_direc = out; //输出

  DDRB = out; //输出

  DDRC = out; //输出

  PORTC = 0X00; //输出0


  DDRB=0XE0;   //输入口       

  PORTB=0XE9;

//********************定时器

  TIMSK |= 0x12; //定时中断允许位 只允许两个匹配

}


//-------------------------------------------------------------------------

//       主函数 

//-------------------------------------------------------------------------

int main()

{

  uchar f_t; //用测频还是测周

//******************

  mcu_init();                 //初始化

  usart_init( 57600 );        //初始化

  send_str( "com ok" ); //完成后把所有串口去掉

  yj_set( 0x38, 0x0f, 0x06 ); //初始化

  clearall(); //初始化

  mzd_on();   //开中断


  #if debug

    test();

  #endif 


  while ( 1 )

  {

    if ( !( PINB& ( 1 << 3 )))

    {

      refish();       //刷新所有的东西

      f_t = hz_try(); //估计范围 1k

      if ( f_t )

      {

        cl_f(); //频率法

      }

      else

      {

        cl_t(); //周期法

      }

    }

  }

  return 1;

}

复制代码

cale.c

#ifndef cale_c

  #define cale_c

  #include "main.h"

//-------------------------------------------------------------------------

// //周期法   先笨方法

//-------------------------------------------------------------------------

  void cale_t( uchar* back )

  {

    ulint count_all; //存放周期 max 16m min 16k

    uint z_sh;      

    ulint y_sh;     

    uchar test;      

//*******************整数小数分离  

    count_all = t1_cont * 50000+TCNT1; 

        if(count_all>max_t)

        count_all=max_t;

    z_sh = max_t / count_all;          

        #if pc

    y_sh=max_t-count_all*z_sh;

        y_sh*=10;

    count_all/=100;

#else

    y_sh = ( max_t % count_all )* 1000; 

#endif

//*******************整数计算部分

    *back++ = z_sh / 100;

    z_sh = z_sh % 100;

    *back++ = z_sh / 10;

    *back++ = z_sh % 10; 

//***************小数计算 

    z_sh = y_sh / count_all; 

    *back++ = z_sh / 100;

    z_sh = z_sh % 100;


    *back = z_sh / 10;

    z_sh = z_sh % 10;

//************做四舍五入计算

    test=0; 

    if ( z_sh >= 5 )

    {

        send_char(z_sh);

      *back += 1; //

      if ( *back == 10 )

      {

            test++;

        *back-- = 0;

        *back += 1; 

        if ( *back == 10 )

        {

            test++;

          *back-- = 0; 

          *back += 1; //

          if ( *back == 10 )

          {

            test++;

            *back-- = 0;

            *back += 1; //

            if ( *back == 10 )

            {

            test++;

              *back-- = 0;

              *back += 1; 

            }

          }

        }

      }

    }

    back-=(4-test); 


//****************转到ascii码

    for ( test = 5; test > 0; test-- )

    {

      *back++ = * back + 0x30;

    }

back-=5;

//****************插进小数点

    back[5] = back[4]; 

    back[4] = back[3];

    back[3] = '.';


//****************去掉不要的0


    for ( test = 3; test > 0; test-- )

    { 

      if ( *back == 0x30 )

      {

        *back++ = * back - 0x30;

      }

      else

      {

        break;

      }

    }

  }


//-------------------------------------------------------------------------

//       //记数法 

//-------------------------------------------------------------------------

  void cale_f( uchar* back )

  {

    ulint count_all;  

    uchar test;       


    count_all = t1_cont * 50000+TCNT1; //原始值

//*****************计算 笨方法计算

    *back++   = count_all / 1000000; //最高位

    count_all = count_all % 1000000; //去掉最高位

    *back++   = count_all / 100000; //100k位

    count_all = count_all % 100000; //去掉

    *back++   = count_all / 10000;

    count_all = count_all % 10000;

    *back++   = count_all / 1000;

    count_all = count_all % 1000;

    *back++   = count_all / 100;

    count_all = count_all % 100;

    *back++   = count_all / 10;   //十位

    *back     = count_all % 10;   //个位


    back = back - 6;


//转到ascii字符

    for ( test = 7; test > 0; test-- )

    {

      *back++ = * back + 0x30;

    }

    back = back - 7; //指针退回

//处理前面的0

    while ( *back == 0x30 )

    {

      *back++ = * back - 0x30;

    }

  }

#endif



关键字:智能频率计  AVR  串口上位机 引用地址:一种智能频率计的设计与制作(AVR) 带仿真与源程序和原理图

上一篇:avr单片机流水灯和按键抗干扰
下一篇:avr单片机流水灯的程序

推荐阅读

近年来各手机厂商为了能做出100%的全面屏手机都费了不少心思,例如滑盖,弹出式镜头都是为了全面屏手机做出的过渡方案,主要是为了放置听筒和前置摄像头。但日前有媒体报道,华为申请了新的全面屏听筒方案。 据了解,USPTO在11月6日公布了华为这项专利稿,显示华为将会在屏幕内挖槽,用来放置听筒,并且还显示该款手机将会采用背部...
摘要:为了调节两路相同频率正弦信号之间的相位差,采用DDS技术设计了相位关系可调的双通道信号发生器。该信号发生器的输出频率范围为0Hz~150MHz,频率分辨率为1μHz,相位调节范围为0%26;#176;~360%26;#176;,分辨率为0.022%26;#176;。它不仅可输出两路相同频率、相位差可调的正弦信号,而且可分别作为两路独立的可调频、调幅、调相的信号发生器使用。...
Maxim Integrated Products, Inc (NASDAQ: MXIM) 宣布推出MAX77655单电感多输出(SIMO)电源管理IC (PMIC),以最高功率密度实现新的技术突破,适用于尺寸极小的下一代设备。与最接近的竞争方案相比,该款PMIC将方案尺寸缩小70%,4路升/降压转换通道可提供700mA电流,且仅需一个外部电感,总方案尺寸仅为17mm2。 ...
近日,是德科技以“畅谈行业未来发展,探讨前沿科技创新”为主题,举办了线上沟通会。是德科技认为数字化转型、移动互联和网络安全等方面的新突破正成为衡量企业成功与否的关键。在 5G、Open RAN、量子计算、互联汽车、在线教育等技术之上构建的使用场景为是德科技创造了一个又一个机遇。就以上这些话题,是德科技与媒体一起畅谈行业未来发展趋势,探讨...

史海拾趣

问答坊 | AI 解惑

清华数字电视标准胜出 将启动千亿元市场

数字电视标准迟到3年终有定论  晨报讯(记者 刘映花)数字电视地面传输标准在难产了3年多之后,有消息说在本月底就能公布最终结果,清华大学标准已经胜出,随后将启动为期一年的大规模商业测试。与标准同时启动的,则是一个至少价值千亿元的庞 ...…

查看全部问答∨

单片机毕业设计

单片机方面的毕业设计…

查看全部问答∨

PCB Layout的第一次经历分享

试着layout一回,使用的软件是PADS layout 2005 sp1。据同事说这个软件不算稳定,用时心里也有点虚,不过上手的时候用的就是这个版本,就没管稳定不稳定了。 先是布局,板子不大,45mm*75mm的面积,因为背面是电池盒,所以元件基本在TOP层。最开始 ...…

查看全部问答∨

【转】PCB布线设计之超级功略

内容简介: 双面板布线技巧 模拟和数字布线的基本相似之处及差别 寄生元件危害最大的情况 AD 转换器的精度和分辨率增加时使用的布线技巧 如何使用工具确定与电路布线有关问题 传感系统的布线 对于电流回路,需要注意如下基本事项 1. 如果 ...…

查看全部问答∨

一个LED的N种玩法

 欢迎讨论     一个LED的N种玩法(一)——让LED闪起来https://bbs.eeworld.com.cn/viewthread.php?tid=103121   一个LED的N种玩法(二)——渐变https://bbs.eeworld.com.cn/viewthread.php?tid=103168   一个LED的 ...…

查看全部问答∨

我如何向LCD屏上的寄存器写数据?

三星6410/VS2005/Wince6.0, LCD屏上有寄存器, 我如何向LCD屏上的寄存器写数据? 请给一些思路.…

查看全部问答∨

2440里面基于ZC301的摄像头的QT4.5上显示视频的问题

要做个基于S3C2440的视频跟踪的东西,但目前遇到的问题太多了,现在是摄像头的视频提取与显示的方法未必对,下面是一部分主要的程序,肯定有许多地方是不合适地,希望大家能指教一下,目前下面的程序的问题是图片刷新很慢,并且只能刷新一段时间, ...…

查看全部问答∨

盘点机有谁搞过啊

能简单说说原理和开发工具吗? 我没搞过 向知道一般是用什么开发?…

查看全部问答∨

基于STM32的485通讯

void UART3Init(void){        GPIO_InitTypeDef GPIO_InitStructure;        USART_InitTypeDef USART_InitStructure;         RC ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved