热度 1
程序2:电阻、电容和电感测量值的显示
//简易电阻、电容、电感测量仪程序
//初始化
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define PI 3.1415926
uchar code table1[8]="Welcome!";
uchar table2[16]="f(Hz)=";
uchar table3[16]="R(Ohm)=";
uchar table4[16]="C(pF)=";
uchar table5[16]="L(uH)=";
uchar num,a=0,th0,tl0;
uint C,L;
ulong f,R;
sbit lcden=P2^4; //液晶使能端
sbit lcdrs=P2^5; //液晶数据命令选择端
sbit key_R=P1^5; //测量电阻按键
sbit key_C=P1^6; //测量电容按键
sbit key_L=P1^7; //测量电感按键
sbit R_out=P1^2; //测量电阻信号输入
sbit C_out=P1^3; //测量电容信号输入
sbit L_out=P1^4; //测量电感信号输入
//声明子函数
void delayms(uint xms); //延时函数
void write_com(uchar com); //液晶写命令函数
void write_data(uchar date); //液晶写数据函数
void led_init(); //液晶初始化函数
void t_init(); //定时器0初始化函数
void keyscan(); //键盘检测函数(确定被测元件为电阻、电容或电感)
void display_f(ulong f); //频率显示函数
void display_R(ulong R); //电阻显示函数
void display_C(uint C); //电容显示函数
void display_L(uint L); //电感显示函数
//主函数
void main()
{
led_init();
t_init();
keyscan();
write_com(0x01);
while(1)
{
display_f(f);
switch(a)
{
case 1:R=(ulong)(5000000.0/0.6931472/f-150+0.5);display_R(R);break;
case 2:C=(int)(100000000.0/153/0.6931472/f+0.5);display_C(C);break;
case 3:L=(int)(1000000000000.0/0.1/PI/PI/f/f+0.5);display_L(L);break;
}
}
}
//中断函数
void T0_count() interrupt 1
{
switch(a)
{
case 1:while(R_out);
while(!R_out);
TH0=0;
TL0=0;
while(R_out);
while(!R_out);
th0=TH0;
tl0=TL0;
TR0=0;
break;
case 2:while(C_out);
while(!C_out);
TH0=0;
TL0=0;
while(C_out);
while(!C_out);
th0=TH0;
tl0=TL0;
TR0=0;
break;
case 3:while(L_out);
while(!L_out);
TH0=0;
TL0=0;
while(L_out);
while(!L_out);
th0=TH0;
tl0=TL0;
TR0=0;
break;
}
f=1000000.0/1.085069/(th0*256+tl0)+0.5;
}
//延时函数
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//液晶写命令函数
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//液晶写数据函数
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//液晶初始化函数
void led_init()
{
lcden=0;
write_com(0x38); //设置16×2显示,5×7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
write_com(0x80); //显示欢迎界面
for(num=0;num<8;num++)
{
write_data(table1[num]);
delayms(5);
}
}
//定时器0初始化函数
void t_init()
{
TMOD=0x01; //设置定时器0工作方式1(M1M0=0x0001)
TH0=0; //装初值
TL0=0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
//键盘检测函数(确定被测元件为电阻、电容或电感)
void keyscan()
{
if(key_R==0)
{
delayms(10);
if(key_R==0)
a=1;
}
else
if(key_C==0)
{
delayms(10);
if(key_C==0)
a=2;
}
else
if(key_L==0)
{
delayms(10);
if(key_L==0)
a=3;
}
else
while(key_R&&key_C&&key_L); //按键按下时退出死循环
}
//频率显示函数
void display_f(ulong f)
{
uchar count=0;
ulong f0;
f0=f;
while(f)
{
f=f/10;
count++;
}
for(num=5+count;num>5;num--)
{
table2[num]=f0%10+48;
f0=f0/10;
}
write_com(0x80);
for(num=0;num<6+count;num++)
{
write_data(table2[num]);
delayms(5);
}
}
//电阻显示函数
void display_R(ulong R)
{
uchar count=0;
ulong R0;
R0=R;
while(R)
{
R=R/10;
count++;
}
for(num=6+count;num>6;num--)
{
table3[num]=R0%10+48;
R0=R0/10;
}
write_com(0x80+0x40);
for(num=0;num<7+count;num++)
{
write_data(table3[num]);
delayms(5);
}
}
//电容显示函数
void display_C(uint C)
{
uchar count=0;
uint C0;
C0=C;
while(C)
{
C=C/10;
count++;
}
for(num=5+count;num>5;num--)
{
table4[num]=C0%10+48;
C0=C0/10;
}
write_com(0x80+0x40);
for(num=0;num<6+count;num++)
{
write_data(table4[num]);
delayms(5);
}
}
//电感显示函数
void display_L(uint L)
{
uchar count=0;
uint L0;
L0=L;
while(L)
{
L=L/10;
count++;
}
for(num=5+count;num>5;num--)
{
table5[num]=L0%10+48;
L0=L0/10;
}
write_com(0x80+0x40);
for(num=0;num<6+count;num++)
{
write_data(table5[num]);
delayms(5);
}
}