专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:huqin   来源:本站原创   点击数:  更新时间:2014年01月27日   【字体:

Proteus仿真电路图如下:(下载仿真文件后有清晰图)


有电路图和程序,电路是isis的,程序是uv3的,仿真工程文件下载:http://www.51hei.com/f/dgnplj.rar   下面是程序源代码:
#include<AT89x52.h>
#include<stdio.h>
#include <intrins.h>
//端口定义
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!='\0')
 { 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;
}

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); 

}

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);  
}

 
 

关闭窗口

相关文章