51单片机频率计Proteus仿真设计(带程序电路)

发布者:PeacefulOasis最新更新时间:2015-05-13 来源: 51hei关键字:51单片机  频率计  Proteus 手机看文章 扫描二维码
随时随地手机看文章
Proteus仿真电路图如下:(下载仿真文件后有清晰图)



电路图和程序,电路是isis的,程序是uv3的,仿真工程文件下载:http://www.51hei.com/f/dgnplj.rar   下面是程序源代码:
#include
#include
#include
//端口定义
sbit LCDRS = P3^5; 
sbit  LCDRW = P3^6; 
sbit  LCDEN = P3^7;  
sbit LCDBF = P2^7; 

#define DBPORT  P2  
#define DIS_CURS_OFF 0x0c
#define LCD_CLRS 0x01
#define DIS_HIDE 0x08  
#define LCD_INIT 0x38 
#define LCD_HOME 0x02
#define LCD_DATA 1
#define LCD_COMMAND 0
#define LCD_READ 1
#define LCD_WRITE 0

#define K1 6
#define K2 5
#define K3 4
#define K4 3
#define K5 2
#define K6 1
#define K7 0
#define Fctrl P0_3
#define Tctrl P0_4
#define Distc P0_5
#define Width P0_6
#define Cut  P0_7
#define Stop P1_6
#define Clrs P1_7
#define Enex P3_0
#define Disall P0=0xff;P1=0xff

#define StopCount P1_6=0
#define StarCount P1_6=1
#define ClrsCount P1_7=0;_nop_();P1_7=1
#define ClrsDff   P1_2=0;_nop_();P1_2=1

#define Backb P1_3
#define Backc P1_4

#define BackLight P1_0

unsigned char sbuffer[15],w[5];
unsigned char contrast=5;
unsigned long value=0,copyer=0,wvalue=0;

bit IsFreq=1;
bit IsLow=1;

void lcd_wait();
void lcd_command(unsigned char command);
void lcd_putchar(unsigned char character);
void lcd_moveto(unsigned char x, unsigned char y);
void lcd_print(unsigned char *str);
void delay1s();
void high_init();
void key_delay();
void key_jud();
void low_init();
void width_init();
void depart_w();
void intrT2();
void width_get();
void count();
void count_init();
void low_get();
void show_high_t();
void show_high_f();
void show_low_t();
void show_low_f();
void intr0();
void intr1();
void high_get();
void contrast_handle();
void install();
void lcd_init();

void lcd_wait()

 LCDEN=0;      
 DBPORT=0xff;  
 LCDRS=LCD_COMMAND;    
 LCDRW=LCD_READ;
 LCDEN=1; _nop_();
 while(LCDBF)
 { LCDEN=0; _nop_();
  LCDEN=1; _nop_();
 }
 LCDEN=0;

void lcd_command(unsigned char command)

 lcd_wait();
 LCDRS=LCD_COMMAND;
 LCDRW=LCD_WRITE;  
 DBPORT=command;  
 LCDEN=1; _nop_();    
 LCDEN=0;
}

void lcd_putchar(unsigned char character)

 lcd_wait();     
 LCDRS=LCD_DATA;
 LCDRW=LCD_WRITE;  
 DBPORT=character;  
 LCDEN=1; _nop_();    
 LCDEN=0;
}
void lcd_moveto(unsigned char x, unsigned char y)

 if(x==0)
  lcd_command(0x80|y);
 if(x==1)
  lcd_command(0xc0|y);
}
   
void lcd_print(unsigned char *str)

 while(*str!='')
 { lcd_putchar(*str);
  str++;
 }
}

void delay1s()
{
 unsigned char i,j,k;
 for(i=0;i<255;i++)
  for(j=0;j<103;j++)
   for(k=0;k<11;k++);
 for(k=0;k<216;k++);
 _nop_();
}

void high_init()
{
 EA=0;
 Disall;
 Fctrl=0; 
 TMOD=0x05;
 TR0=1;
 StopCount;
 ClrsCount;
 TL0=0;
 TH0=0;
}[page]

void key_delay()
{
 unsigned char i,j;
 for(i=0;i<255;i++)
  for(j=0;j<250;j++);
}

void key_jud()
{
 switch(P0&0x7)
 {
  case K6:TH0=0;
       TL0=0;
       ClrsCount;
       key_delay();           
    break;
  case K7:P1_6=!P1_6;
    lcd_moveto(1,15);
    if(!P1_6) 
     lcd_putchar('P');
    else
     lcd_putchar(' ');    
    key_delay();
    break;
  case K1:w[0]++;
    if(w[0]==10) w[0]=0;
    key_delay();
    break;
  case K2:w[1]++;
    key_delay();
    if(w[1]==10) w[1]=0;
    break;
  case K3:w[2]++;
    if(w[2]==10) w[2]=0;
    key_delay();
    break;
  case K4:w[3]++;
    if(w[3]==10) w[3]=0;
    key_delay();
    break;
  case K5:w[4]++;
    if(w[4]==10) w[4]=0;
    key_delay();
    break;    
 }
}

void low_init()
{
 Disall;
 Distc=0;
 Tctrl=0;
 Cut=0;
 StopCount;
 ClrsCount;
 StarCount;
 IsLow=1;
 TL0=0;
 TH0=0;
 IT0=1;
 IT1=1;
 EX1=1;
 EX0=1;
 ClrsDff;
 EA=1;
}

void width_init()
{
 Disall;
 Width=0;
 Tctrl=0;
 ClrsCount;
 TL0=0;
 TH0=0;
 TMOD=0x05;
 TR0=1;
 TF2=0; 
 T2CON=8;
 ET2=1;
 ClrsCount;
 TH0=0;
 TL0=0;
    EA=1;
}


void depart_w()
{
 unsigned char i;
 while(wvalue>=1e4) wvalue/=10;
 for(i=0;i<4;i++)
 {
  w[3-i]=wvalue%10+'0';
  wvalue/=10;
 }
}

void intrT2() interrupt 5
{
 unsigned char i;
 Tctrl=1;
 P2=0xff;
 Enex=0;
 value=TH0;
 value=(value<<8);
 value=value+TL0;
 value=(value<<8);
 value=value+DBPORT;
 Enex=1;
 for(i=0;value;i++)
 {
  sbuffer[i]=value%10+'0';
  value=value/10;
 }
 lcd_moveto(1,3);
 i++;
 while(i)
 {
   lcd_putchar(sbuffer[i]);
   i--;
 }
 lcd_putchar(sbuffer[i]);
 lcd_print(" uS          ");
 while(1)
 {
  i=P0&0x07;
  if(i==K1) break;
 }
 TH0=0;
 TL0=0;
 ClrsCount;
 lcd_moveto(1,3);
 lcd_print("  Capture.....");
 key_delay();
 T2CON=8;
 Tctrl=0;
  
}

void width_get()
{
 while(1);
}

void count() 
{
 while(1)
 {  
  key_jud();
  P2=0xff;
  Enex=0;
  value=TH0;
  value=(value<<8);
  value=value+TL0;
  value=(value<<8);
  value=value+DBPORT;
  Enex=1;
  lcd_moveto(1,9);
  sprintf(sbuffer,"%-5lu",value);  
  lcd_moveto(1,9);
  lcd_print(sbuffer); 
  copyer=w[4]+w[3]*10+w[2]*1e2+w[1]*1e3+w[0]*1e4;
  if(value==copyer)  
  {
   StopCount;
   P3_1=0;
   while(P0_1==1||P0_2==1);
   P3_1=1;
   StarCount;
  }  
  sprintf(sbuffer,"%c%c%c%c%c",w[0]+'0',w[1]+'0',w[2]+'0',w[3]+'0',w[4]+'0');  
  lcd_moveto(0,9);
  lcd_print(sbuffer);  
 }
}

void count_init()
{
 unsigned char i;
 Disall;
 Fctrl=0; 
 TMOD=0x05;
 TR0=1;
 StopCount;
 ClrsCount;
 TL0=0;
 TH0=0; 
 for(i=0;i<5;i++) w[i]=9;
 w[2]=8;
 StarCount;
}

void low_get()
{
 low_init();
 while(IsLow);
 high_init();
}

void show_high_t()
{
 copyer=value;
 while(value>=100000) value/=10;
 wvalue=1e9/value;
 depart_w();
 if(copyer<=1e4)
  sprintf(sbuffer,"%c%c%c.%c uS   ",w[0],w[1],w[2],w[3]);
 else if(copyer<=1e5)
  sprintf(sbuffer,"%c%c.%c%c uS   ",w[0],w[1],w[2],w[3]);
 else if(copyer<=1e6)
  sprintf(sbuffer,"%c.%c%c%c uS   ",w[0],w[1],w[2],w[3]);
 else if(copyer<=1e7)
  sprintf(sbuffer,"%c%c%c.%c nS   ",w[0],w[1],w[2],w[3]);
 else 
  sprintf(sbuffer,"%c%c.%c%c nS   ",w[0],w[1],w[2],w[3]);
 lcd_moveto(1,5);
 lcd_print(sbuffer); 

}[page]

void show_high_f()
{
 wvalue=value;
 depart_w();
 if(value<1e4)
  sprintf(sbuffer,"%c.%c%c%c KHz  ",w[0],w[1],w[2],w[3]);
 else if(value<1e5)
  sprintf(sbuffer,"%c%c.%c%c KHz  ",w[0],w[1],w[2],w[3]);
 else if(value<1e6)
  sprintf(sbuffer,"%c%c%c.%c KHz  ",w[0],w[1],w[2],w[3]);
 else if(value<1e7)
  sprintf(sbuffer,"%c.%c%c%c MHz  ",w[0],w[1],w[2],w[3]);
 else
  sprintf(sbuffer,"%c%c.%c%c MHz  ",w[0],w[1],w[2],w[3]);
 lcd_moveto(1,5);
 lcd_print(sbuffer);
}

void show_low_t()
{
 wvalue=value;
 depart_w();
 if(value<1e4)
  sprintf(sbuffer,"%c%c%c.%c uS   ",w[0],w[1],w[2],w[3]);
 else if(value<1e5)
  sprintf(sbuffer,"%c.%c%c%c mS   ",w[0],w[1],w[2],w[3]);
 else if(value<1e6)
  sprintf(sbuffer,"%c%c.%c%c mS   ",w[0],w[1],w[2],w[3]);
 else if(value<1e7)
  sprintf(sbuffer,"%c%c%c.%c mS   ",w[0],w[1],w[2],w[3]);
 else if(value<1e8)
  sprintf(sbuffer,"%c.%c%c%c S    ",w[0],w[1],w[2],w[3]);
 lcd_moveto(1,5);
 lcd_print(sbuffer);
}

void show_low_f()
{
 copyer=value;
 while(value>=100000) value/=10;
 wvalue=1e9/value;
 depart_w();
 if(copyer<=1e4)
  sprintf(sbuffer,"%c.%c%c%c KHz  ",w[0],w[1],w[2],w[3]);
 else if(copyer<=1e5)
  sprintf(sbuffer,"%c%c%c.%c Hz   ",w[0],w[1],w[2],w[3]);
 else if(copyer<=1e6)
  sprintf(sbuffer,"%c%c.%c%c Hz   ",w[0],w[1],w[2],w[3]);
 else 
  sprintf(sbuffer,"%c.%c%c%c Hz   ",w[0],w[1],w[2],w[3]);
 lcd_moveto(1,5);
 lcd_print(sbuffer);
}

void intr0() interrupt 0
{       
 
 Cut=1;
 P2=0xff;
 Enex=0;
 value=TH0*0x10000+TL0*0x100+DBPORT;
 value*=10;//注意在写片时屏掉此语句
 Enex=1; 
 if(!IsFreq) show_low_t();
 else show_low_f();
 if(value<4000) IsLow=0;
 Cut=0;
   
}

void intr1() interrupt 2
{
 TL0=0;
 TH0=0; 
}

void high_get()
{
 while(1)
 {
  StarCount;
  delay1s();
  StopCount;
  P2=0xff;
  Enex=0;
  value=TH0*0x10000+TL0*0x100+DBPORT;
  Enex=1;
  if(value<2000) low_get();
  if(IsFreq)  show_high_f();
  else  show_high_t();
  ClrsCount;
  TL0=0;
  TH0=0;
 }
}

void contrast_handle()

 lcd_moveto(1,0);
 lcd_print("Contrast : ");
 lcd_putchar(contrast+'0');
}
 

void install()
{
 key_delay();
 while(1)
 {
  switch(P0&0x7)
  {
   case K2:P1_5=~P1_5;
     _nop_();
     P1_5=~P1_5;               
     key_delay();
     lcd_moveto(0,12);
     if(BackLight) lcd_print("N  ");
     else lcd_print("FF");           
     break;
   case K7:contrast--;
     if(contrast==0xff) contrast++;
     contrast_handle();
     key_delay();
     break;
   case K6:contrast++;
     if(contrast==8) contrast--;
     contrast_handle();
     key_delay();
     break;

  }
 }
}

void lcd_init()
{   
 lcd_command(DIS_CURS_OFF);
 lcd_command(LCD_INIT);
 lcd_command(LCD_HOME);
 contrast_handle();
}

void main()

 lcd_init();
 lcd_command(LCD_CLRS);
 lcd_print("Welcome");
 lcd_moveto(1,0);
 lcd_print("Press Button...");
 while(1)
 {
  switch(P0&0x7)
  {
   case K1:lcd_command(LCD_CLRS);
     lcd_moveto(0,0);
     lcd_print("Frequency:");
     lcd_moveto(1,5);
     lcd_print("No Input");
     high_init();
     high_get();
   case K2:IsFreq=0;
     lcd_command(LCD_CLRS);
     lcd_moveto(0,0);
     lcd_print("Priod:");
     lcd_moveto(1,5);
     lcd_print("No Input");
     high_get();
   case K3:lcd_command(LCD_CLRS);
     lcd_print("Count To:");
     lcd_moveto(1,0);
     lcd_print("Present: ");
     count_init();
     count();
   case K4:lcd_command(LCD_CLRS);
     lcd_print("Pulse Width:");
     lcd_moveto(1,5);
     lcd_print("Capture.....");     
     width_init();
     width_get();
   case K5:lcd_command(LCD_CLRS);
     lcd_print("Backlight: O");
     lcd_moveto(0,12);
     if(BackLight) lcd_print("N  ");
     else lcd_print("FF");
     lcd_moveto(1,0);
     lcd_print("Contrast : ");
     lcd_putchar(contrast+'0');
     install();
  }
 }
 lcd_command(LCD_CLRS);
 while(1);  
}

关键字:51单片机  频率计  Proteus 引用地址:51单片机频率计Proteus仿真设计(带程序电路)

上一篇:51单片机+DHT11温控程序-可设置温度值
下一篇:51单片机教程之基础编(基于C语言)

推荐阅读最新更新时间:2024-03-16 14:02

关于4×4矩阵式键盘路的改进
下图就是一个常规的4×4键盘电路图。 这种常规的矩阵键盘电路,相信大家都司空见惯了,好多人都会编写它的驱动程序。 图中使用了P0口的8个引脚(P0.0~P0.7),分别驱动键盘的行和列。按键的编号,在图中分别标注了0~F。 检测按键的一般的思路是在四个列线,分别输出一个低电平,然后输入行线,逐行检测是否存在低电平。 如果在某行有低电平出现,就说明该行、列的交叉点上的按键,被按下了。 其实,这些行、列引线,是“分时”工作的,当在某一列输出低电平的时候,其它的列,输出的就是高电平。 如果利用这些输出高电平的列,进行输入,那么就可以极大的节省IO接口的引线数量。 基于这个道理,在上图中,下面的四个列驱动引线(
[单片机]
关于4×4矩阵式键盘路的改进
51单片机超声波系统板电路分析
比赛板电路板组成:51单片机(STC89C52芯片,下面统称为51单片机)电路、DC电源插座电路、复位电路、晶振电路、5V转3V3降压电路、0.96寸OLED屏幕电路、蜂鸣器电路、LED电路、超声波电路。 51单片机主控电路 我们用51单片机系列的STC89C52芯片作为主控芯片。P0引脚组接上4.7K的排阻和5V的VCC以形成上拉电阻,将不确定的信号通过排阻钳位在高电平,电阻同时起限流作用。 DC电源插座电路 本电路通过DC插头线给整个比赛板供电5V,但前提是按下按钮SW1,电路才会连接成功供电,否则一直为开路状态。通电后LED1亮表示已经供电。 复位电路 本电路按下REST按键时电流会走51单片机的RST引脚,引导
[单片机]
<font color='red'>51单片机</font>超声波系统板电路分析
关于51单片机中断Using的使用
interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断; using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器; 51单片机内的寄存器是R0--R7(不是R0-R3) R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。 using 0时设置 RS1=0,RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(0
[单片机]
STC89C51单片机和ADXL345三轴加速度模块实现简易计步器程序
单片机源程序如下: #include STC51PRJ.h extern BYTE BUF ;//接收数据缓存区 /*****************起始信号***************/ void ADXL345_Start() { SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线 } /************
[单片机]
51单片机定时器模式1使用
特殊功能寄存器如下 使用TCON和TMOD TF:溢出标志 为1时表示溢出 需要手工置0 TR:开始计时 为1开始 为0停止 M1,M0 :工作模式 01为模式1 //16位 65536 GATE门暂不使用 置0 C/T:定时/计数 TH0,TL0:定时器0初始值 方法: 1、设定TMOD 2、设定初始值TH TL 3、设定TCON 开始计时 实例:共阳七段数码管0-F循环显示延时1s 七段共阳数码管真值表 const uint8 ledcode ={ 0xC0, // 0 0xF9, // 1 0xA4, // 2 0xB0, // 3 0x99, // 4 0x92, // 5 0x
[单片机]
<font color='red'>51单片机</font>定时器模式1使用
51单片机+DS18B20温度上下限报警可调数字温度计
单片机源程序如下: /******************************************************************** * 程序名; 基于DS18B20的测温系统 * 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来 * 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限 * 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动 * 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除 * 按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能, * K1是实现减1功能,K3是用来设定上下限温
[单片机]
<font color='red'>51单片机</font>+DS18B20温度上下限报警可调数字温度计
51单片机NEC红外遥控器解码
【前言】 红外遥控器常用的调制制式主要分为两种,这里主要讲解以NEC调制方式的遥控器解码过程。 废话不多说,直接上时序图!( 更多详细资料自行查询) 总时序图: 前导码: ' 0 ' 和 ' 1 ' 编码表示: 【解码思路】 -----1、 使用定时器计算高低电平的时间 -----2、 使用数组存放一组完整的电平时间编码 -----3、 计算电平的时长 -----4、 组合数据,获得编码值,存放于数组 -----5、 LCD1602管显示 【编写程序】 /*-------------------------------------------------------- 程序功
[单片机]
<font color='red'>51单片机</font>NEC红外遥控器解码
基于51单片机的多路压力测量仪
  1 引言   压力测量对实时监测和安全生产具有重要的意义。在工业生产中,为了高效、安全生产,必须有效控制生产过程中的诸如压力、流量、温度等主要参数。由于压力控制在生产过程中起着决定性的安全作用,因此有必要准确测量压力。为了测到不同位置的压力值,研制了基于C8051F020单片机的测量仪。通过压力传感器将需要测量的位置的压力信号转化为电信号,再经过OP07运算放大器进行信号放大,送至C805lF020单片机内部的高速率12位A/D转换器,然后将模拟信号转换成单片机可以识别的数字信号,再经单片机转换成液晶显示器可以识别的信息,最后显示输出。与此同时,可以利用SD卡存储器将各通道设定的压力值、系统参数存储起来,以便在系统断电或复位
[单片机]
基于<font color='red'>51单片机</font>的多路压力测量仪
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved