一、主要功能
1、可调节频率
2、LCD频率和周期
二、硬件资源
1、51单片机核心模块
2、NE555模块
3、LCD1602模块
三、软件设计
#include<reg52.h>
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


联系作者
B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
本文介绍了一种基于51单片机的频率计设计方案,通过NE555模块实现频率输入,并利用LCD1602进行频率与周期显示。文章详细阐述了硬件资源选择、软件编程流程及实验效果。



1万+

被折叠的 条评论
为什么被折叠?



