【Proteus仿真】【51单片机】简易数字频率计设计

文章目录

  • 一、主要功能
  • 二、硬件资源
  • 三、软件设计
  • 四、实验现象
  • 联系作者


一、主要功能

1、可调节频率
2、LCD频率和周期


二、硬件资源

1、51单片机核心模块
2、NE555模块
3、LCD1602模块


三、软件设计

#include
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
sbit rs=P2^6;	 // 数据命令选择
sbit rw=P2^5;	 //读写选择
sbit e=P2^7;	  //使能
uint8 d1[16]="   Frequency    ";
uint8 num[]="0123456789";
uint8 s[8];  //用来存放要显示的8位数的值
uint8 n[8];

uint32 Freq;        //用来存放要显示的频率值
uint32	TimeCount;   //用于计算1S钟的
uint16 T;

void delay(uint16 i)   //延时函数
{
	while(i--);
}
void TIMER_Configuration()
{
	//--定时器T0做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
	//--定时器T1做定时器,工作方式1(16位定时器),只由TRx打开定时器--//	
	TMOD=0x15;

	//--设置定时器晶振为12MHZ时定时50ms--//
	TH1=0x3C;
	TL1=0xB0;

	//--打开中断-//
	ET1=1;
	ET0=1;
	EA=1;

	//--打开定时器*/
	TR0=1;
	TR1=1;
}
void wrc(uint8 c)	 //写命令
{
	delay(1000);
	rs=0;
	rw=0;
	e=0;
	P0=c;
	e=1;
	delay(10);
	e=0;
}
void wrd(uint8 dat)	  //写数据
{
	delay(1000);
	rs=1;
	rw=0;
	e=0;
	P0=dat;
	e=1;
	delay(10);
	e=0;
	rs=0;
}
void lcdinit()	  //LCD初始化
{
	delay(1000);
	wrc(0x38);
	wrc(0x38);
	wrc(0x38);
	wrc(0x06);
	wrc(0x0c);
	wrc(0x01);
}
void display()	 //LCD显示函数
{
	uint8 i;
	wrc(0x80);
	for(i=0;i<16;i++)
	{
		wrd(d1[i]);
	}
	wrc(0x80+0x40);
	for(i=0;i<3;i++)
	{
		wrd(s[i+3]);
	}
	wrd('H');	
	wrd('z');
	
	wrd(' ');
	wrd(' ');
	for(i=0;i<3;i++)
	{
		wrd(n[i+1]);
	}
	wrd('m');
	wrd('s');	
}
void main()
{
	uint16 t;
	float dat;
	lcdinit();	  //LCD初始化
	TIMER_Configuration();
	while(1)
	{
		if(TR0 == 0)         //当计数器停下的时候,表明计数完毕
		{
			Freq = Freq + TL0;         //读取TL的值
			Freq = Freq + (TH0 * 256); //读取TH的值

			t=Freq%1000;  
			//--求频率的个十百千万十万位--//
			s[0] = num[Freq%1000000/100000];	
			s[1] = num[Freq%100000/10000];	
			s[2] = num[Freq%10000/1000];	
			s[3] = num[Freq%1000/100];	
			s[4] = num[Freq%100/10];	
			s[5] = num[Freq%10];
			
			dat=1000/t;
			T=(uint16)dat;
			n[0]=num[T/1000];
			n[1]=num[T%1000/100];
			n[2]=num[T%1000%100/10];
			n[3]=num[T%1000%100%10];		
			Freq = 0;//将计算的频率清零		 //--显示完,重新计算下一次频率。--//
			TH0 = 0; //将计数器的值清零
			TL0 = 0;
			TR1 = 1; //开启定时器
			TR0 = 1; //开启计数器	
		}
		display();
	}
}



void Timer1()	interrupt 3
{
	TimeCount++;
	if(TimeCount==20)//计时到1S
	{
		TR0=0;
		TR1=0;
		TimeCount=0;		
	}

	//--12MHZ设置定时50ms的初值--//
	TH1=0x3C;
	TL1=0xB0;	
}

void Timer0()	interrupt 1
{	
	//--进入一次中断,表明计数到了65536--//
	Freq=Freq+65536;		
}

四、实验现象

B站演示视频:https://space.bilibili.com/444388619

【Proteus仿真】【51单片机】简易数字频率计设计_第1张图片
【Proteus仿真】【51单片机】简易数字频率计设计_第2张图片


联系作者

B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,51单片机,stm32,proteus,c语言)