这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 基于51单片机的数字频率机设计

共23条 1/3 1 2 3 跳转至

基于51单片机的数字频率机设计

高工
2022-01-20 11:28:25     打赏

一.硬件方案

频率计由89S52单片机控制电路、信号处理电路、键盘电路以及测量数据的显示电路还有系统软件所构成的,在信号处理电路当中包含了待测信号放大、限幅、波形变换、波形整形以及分频电路。测量范围为0~100KHZ。


主要由51单片机+最小系统+分频模块+整形模块+lcd1602液晶显示+按键而成;如图:

二.设计功能

(1)频率的测量范围为1Hz—100kHz能测量各种周期信号,能测出正弦波、三角波或方波等波形的频率。

(2)通过LCD1602液晶显示屏显示检测到的即时频率数值(最多8位数,单位为Hz)。

(3)电路板上排针左边接信号输入,右边接地。


三.设计原理图

(1)原理图主要采用AD软件进行设计,如图:

(2)Protues仿真图如下:

四.软件设计

(1)程序流程图

(2)频率测量程序框图

(3)中断服务流程图

(4)主程序源码


//----------------主函数--------------------

void main()

unsigned char i;

LCD_init();

timer_init();             //定时/计数器初始化 

for(i = 0;i<4;i++)

{

LCD_disp_char(i+0,1,character_1[i]);

}

while(1)

{

dis_num();         //显示

delay_1s();

}

}

//-------------------定时/计数器初始化--------------

void timer_init(void)         //定时/计数器初始化

TMOD=0x66;                //计数器0和计数器1工作工作方式2,自动重装初值 

TH0=0;                    //计数器初值为0

TL0=0;

TR0=1;                    //计数器开始计数    

ET0=1;                    //打开计数器0中断   

TH1=0;                    //计数器初值为0

TL1=0;

TR1=1;                    //计数器开始计数    

ET1=1;                    //打开计数器1中断   

RCAP2H=(65536-62500)/256; //在程序初始化的时候给RCAP2L和RCAP2H赋值, 

RCAP2L=(65536-62500)%256; //TH2和TL2将会在中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。 

TH2=RCAP2H;               //12M晶振下每次中断62.5ms(1s=1000ms=62.5ms×16)

TL2=RCAP2L;

ET2=1;                    //打开定时器2中断 

TR2=1;                    //定时器2开始计时  

EA=1;                     //开总中断   

//------------------中断函数----------------------

void timer2(void) interrupt 5 //定时器2中断(62.5ms)

{

time++;

TF2=0;                    //定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零

if (time==16)             //定时1s时间到  

{

   time=0;                //计时清0

   EA=0;                  //关中断 

   fre=(long)count1*256+TL1;     //count*256强制转换成long型,否则将不产生进位~先判断分频后(计数器1)

   FLAG = 0; 

  

   if(fre<2000)//如果不到200KHz则读取分频前(计数器0)频率(200K÷100=2000)

   {

   fre = (long)count*256+TL0;

FLAG = 1;          

   } 

if(!FLAG)

{

fre = fre *100;//100分频

}

   TL0=0;                 //清零计数器0计数    

   TH0=0;

   TL1=0;

   TH1=0; 

   count=0;               //清零计数器0计数  

   count1=0;

   EA=1;                  //开中断    

}




工程师
2022-02-07 22:45:20     打赏
2楼

设计的挺到位的


菜鸟
2022-02-08 02:56:04     打赏
3楼

有参考意义


专家
2022-02-08 06:45:14     打赏
4楼

谢谢分享


高工
2022-02-08 07:40:03     打赏
5楼

谢谢分享


专家
2022-02-08 07:56:37     打赏
6楼

谢谢分享


专家
2022-02-08 08:00:00     打赏
7楼

学习


专家
2022-02-08 08:19:59     打赏
8楼

感谢分享


院士
2022-02-08 08:22:40     打赏
9楼

谢谢楼主提供的好示例~!


院士
2022-02-08 08:27:37     打赏
10楼

感谢分享


共23条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]