#include <reg52.h>
#include "1602.h"
#define DataPort P0
#define ADCPort P2
#define uchar unsigned char
sbit button_r=P1^0;
sbit button_c=P1^1;
sbit button_l=P1^2;
sbit button_q=P1^3;
sbit LED_R=P1^4;
sbit LED_C=P1^5;
sbit LED_L=P1^6;
sbit LED_Q=P1^7;
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
sbit START=P3^7;
unsigned char func;
unsigned long int R,C,L,f,y;
uchar i=0;
uchar aa,bb,cc;
//uchar code aa[5]="free";
uchar code meun[2][16]={" is: ","00000000 "};
uchar code m[10]="0123456789";
unsigned char T0count;
unsigned char timecount;
bit flag;
void Intar_T0T1(void)
{
flag=0;
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
TR1=1;
}
void delay1(void)
{
int i;
for(i=80;i>0;i--);
}
void delay_ms(uchar t)
{
unsigned char i=0;
while(t--)for(i=0;i<120;i++);
}
void WriteData(uchar dat)
{
EN=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
EN=1;
DataPort=dat;
EN=0;
RS=0;
RW=0;
for (i=0;i<20;i++);
}
void WriteCmd(uchar cmd)
{
EN=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
EN=1;
DataPort=cmd;
RS=0;
RW=0;
EN=0;
for (i=0;i<20;i++);
}
void DisChar(uchar ps,uchar dat)
{
WriteCmd((0x80+ps));
WriteData(dat);
}
void LcdInit(void)
{
char pp=0;
WriteCmd(0x38);
delay_ms(5);
WriteCmd(0x38);
delay_ms(5);
WriteCmd(0x38);
delay_ms(5);
WriteCmd(0x01);delay_ms(5);
WriteCmd(0x06);delay_ms(5);
WriteCmd(0x38);
WriteCmd(0x0c);
WriteCmd(0x40);
for(pp=0;pp<16;pp++)DisChar(pp,*(meun[0]+pp));
for(pp=0;pp<16;pp++)DisChar(pp+0x40,*(meun[1]+pp));
}
void Display(unsigned long int x)
{ DisChar(0,aa);
DisChar(9+0x40,bb);
DisChar(10+0x40,cc);
DisChar(7+0x40,m[x%10]);x /= 10;
DisChar(6+0x40,m[x%10]);x /= 10;
DisChar(5+0x40,m[x%10]);x /= 10;
DisChar(4+0x40,m[x%10]);x /= 10;
DisChar(3+0x40,m[x%10]);x /= 10;
DisChar(2+0x40,m[x%10]);x /= 10;
DisChar(1+0x40,m[x%10]);x /= 10;
DisChar(0+0x40,m[x%10]);x /= 10;
delay_ms(200);
}
button()
{
//button_r=1;
if(button_r==0)
{
func=1; //功能1:测电阻
LED_R=0;
LED_C=1;
LED_L=1;
LED_Q=1;
}
//button_c=1;
if(button_c==0)
{
func=2; //功能2:测电容
LED_R=1;
LED_C=0;
LED_L=1;
LED_Q=1;
}
//button_l=1;
if(button_l==0)
{
func=3; //功能3:测电感
LED_R=1;
LED_C=1;
LED_L=0;
LED_Q=1;
}
if(button_q==0)
{
func=4; //功能3:测电感
LED_R=1;
LED_C=1;
LED_L=1;
LED_Q=0;
}
return func;
}
void R_measure(void) //电阻测量,以Ω为单位
{
while(flag==0);
f=(T0count*65536+TH0*256+TL0); //Hz
//电阻计算公式
R=721500000/f-10000;
y=R;
}
void C_measure(void) //电容测量,以pF为单位
{
while(flag==0);
f=(T0count*65536+TH0*256+TL0); //Hz
//电容计算公式
C=4800000/f; //pf
y=C;
}
void L_measure(void) //电感测量,以uH为单位
{
while(flag==0);
f=(T0count*65536+TH0*256+TL0); //Hz
//电感计算公式
f/=100000;
L=922/(f*f); //L=922*10^10/(f*f) uH
y=L;
}
unsigned int ADCTransform()
{
unsigned long int uiResult;
START=1;
START=0;
delay_ms(10);
uiResult=ADCPort; //出入转换结果。
uiResult=(10000000*uiResult)/51; //处理运算结果。
y=uiResult;
}
void main(void)
{ TMOD=0x15;//0001 0101
TH0=0;
TL0=0;
TH1=(65536-49989)/256;
TL1=(65536-49989)%256;
ET0=1;
ET1=1;
EA=1;
TR1=1;
TR0=1;
y=0x00;
//ADCPort=51;
LcdInit();
// while(1);
/*while(1)
{
if(flag==1)
{
y=(T0count*65536+TH0*256+TL0);
Display(y);
flag=0;
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
TR1=1;
}
}*/
while(1)
{
button();
if (func==1)
{
aa='R';
bb='\n';
cc='\n';
R_measure();
}
if (func==2)
{
aa='C';
bb='p';
cc='F';
C_measure();
}
if (func==3)
{
aa='L';
bb='u';
cc='H';
L_measure();
}
if(func==4)
{
aa='Q';
bb='\n';
cc='\n';
ADCTransform();
}
Display(y);
Intar_T0T1();
}
}
void t0(void) interrupt 1 using 0 //计脉冲个数
{
T0count++;
}
void t1(void) interrupt 3 using 0 //定时1s
{
TH1=(65536-50045)/256;
TL1=(65536-50045)%256;
timecount++;
if(timecount==20)
{
TR0=0;
TR1=0;
timecount=0;
flag=1;
}
}