Proteus仿真電路圖如下:(下載仿真文件后有清晰圖)
有電路圖和程序,電路是isis的,程序是uv3的,仿真工程文件下載:http://www.torrancerestoration.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);
}