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

1.设计任务

利用单片机AT89C51设计数字频率计,能将所测量的频率在LED显示器上显示。

基于51单片机的数字频率计设计_第1张图片

2. 设计要求

2.1系统方案论证

根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。

2.2系统硬件电路设计

根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。

2.3软件设计

根据该系统要求的功能进行软件设计,简述软件的功能,并根据每个模块的功能绘制软件流程图,根据流程图编写程序并汇编调试通过;

2.4 软硬件系统仿真

将编译后的程序软件加载到Proteus软件仿真的单片机ROM中,运行系统,实现软件程序对单片机系统的硬件电路的控制,并调试仿真结果,直至与设计任务相符。

#include "reg52.h"
#include "intrins.h"
#include "stdio.h"
#include "lcd1602.h"
#include "public.h"

 #define CHECK_BUSY


sbit LED=P1^2;    //定义LED端口
bit OVERFLOWFLAG;
bit TIMERFLAG;
/*------------------------------------------------
                    定时器0初始化子程序
					本程序用于计数
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01 | 0x04;	  //0x101  1 为计数模式//使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响		     
 TH0=0;	      //给定初值
 TL0=0;         
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                    定时器1初始化子程序
					本程序用于定时
------------------------------------------------*/
void Init_Timer1(void)
{
 TMOD |= 0x10;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 
 TH1=1;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
 TL1=0;
 EA=1;            //总中断打开
 ET1=1;           //定时器中断打开
 TR1=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器0中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
 TH0=00;	      //重新给定初值
 TL0=00; 

 OVERFLOWFLAG=1;  //溢出标志

}
/*------------------------------------------------
                 定时器1中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
 static unsigned char i;
 TH1=1;		 //重新赋值10ms
 TL1=0;

 i++;
 if(i==10)       //100ms 计数时间单位,得出100ms脉冲个数 x10就是1s中脉冲个数,即为频率 Hz 
   {
   i=0;
   TR0=0;        //2个定时器关闭
   TR1=0;
   TIMERFLAG=1;  //标志位清零
   TH1=1;	 //重新赋值
   TL1=0;
   }
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
	unsigned  long int a;
	char temp[16];      //定义字符显示缓冲数组
	Init_Timer0();      //初始化定时器0
	Init_Timer1();      //初始化定时器1
	lcd1602_init();         //初始化液晶屏
	delay_ms(10);        //延时用于稳定,可以去掉
	lcd1602_clear();        //清屏
	lcd1602_show_string(0,0,"Frequency Meter");//写入第一行信息,主循环中不再更改此信息,所以在while之前写入
 while(1)
 {
  if(OVERFLOWFLAG)//检测溢出标志,如果溢出表明频率过高,显示溢出信息
    {
	 OVERFLOWFLAG=0;//标志清零
     lcd1602_show_string(0,1,"overflow >655KHz");
	}
  if(TIMERFLAG)      //定时100ms到,做数据处理
    {
	 a=TL0+TH0*256;//读取计数值
	 a=a*1.538461538;     //扩大到实际值
   sprintf(temp,"FREQ:%08.0f Hz",(float)a);
   lcd1602_show_string(0,1,temp);//显示到液晶第二行
	 TR0=1;                     //2个定时器打开
	 TR1=1;
	 TH0=0;                     //保证计数器初值为0
	 TL0=0;
	 TIMERFLAG=0;               //打开计时计数标志
	 
	}
  }
}

完整代码点开链接私信  免费  获取。

【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa

你可能感兴趣的:(51单片机,单片机,嵌入式硬件)