单片机数字频率计

单片机数字频率计

通过单片机实现对于正弦波频率、幅值的测量。

Proteus仿真图片

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "MCP3208.h"

unsigned char dispcount;   //显示计数器值
unsigned char T0count;     //T0的计数器值
unsigned char timecount;   //计时计数器值
bit flag;                  //标志位
unsigned long x;           //频率值

unsigned int P_date = 0; P_max = 0;

//频率计算函数
void HzCal(void)
{
    unsigned char i; 
    x=T0count*65536+TH0*256+TL0; //得到T0的16位计数器值
    LCD_ShowNum(1,5,x,4);
	
		P_date = GET_MCP3208();
		if(P_date > P_max)
		{
			P_max = P_date;		
		}
		LCD_ShowNum(2,5,P_max/3,4);
		
		
    timecount=0; 
    T0count=0; 	
	
}
   

int main()
{
    LCD_Init();
    LCD_ShowString(1,1,"FRE:");
    LCD_ShowString(2,1,"AMP:");
		TMOD=0x15;              //设置定时器工作方式
		TH0=0; 
		TL0=0; 
		TH1=(65536-5000)/256; 
		TL1=(65536-5000)%256;       //初始化T1
		TR1=1; 
		TR0=1; 
		ET0=1; 
		ET1=1; 
		EA=1;                     //开中断
  
		while(1) 
		 { 

			 if(flag==1) 
				 { 
					 flag=0; 
					 HzCal();   //频率计算函数
					 TH0=0; 
					 TL0=0; 
					 TR0=1; 
						
				 } 
		 } 
}
//定时器T0中断服务子函数
void t0(void) interrupt 1 using 0 
{ 
  T0count++; 
} 
//定时器T1中断服务子函数  
void t1(void) interrupt 3 using 0 
{ 
	
  TH1=(65536-5000)/256; 
  TL1=(65536-5000)%256;          //初始化T1预装值,1ms定时
  timecount++;                   //扫描
  if(timecount==200)             //秒定时
    { 
      TR0=0;                     //启动T0
      timecount=0; 
      flag=1; 
			P_max = 0;
    }  
} 
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LEO的实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值