熱度 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; //液晶數(shù)據(jù)命令選擇端
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; //測量電感信號輸入
//聲明子函數(shù)
void delayms(uint xms); //延時函數(shù)
void write_com(uchar com); //液晶寫命令函數(shù)
void write_data(uchar date); //液晶寫數(shù)據(jù)函數(shù)
void led_init(); //液晶初始化函數(shù)
void t_init(); //定時器0初始化函數(shù)
void keyscan(); //鍵盤檢測函數(shù)(確定被測元件為電阻、電容或電感)
void display_f(ulong f); //頻率顯示函數(shù)
void display_R(ulong R); //電阻顯示函數(shù)
void display_C(uint C); //電容顯示函數(shù)
void display_L(uint L); //電感顯示函數(shù)
//主函數(shù)
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;
}
}
}
//中斷函數(shù)
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;
}
//延時函數(shù)
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//液晶寫命令函數(shù)
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//液晶寫數(shù)據(jù)函數(shù)
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//液晶初始化函數(shù)
void led_init()
{
lcden=0;
write_com(0x38); //設置16×2顯示,5×7點陣,8位數(shù)據(jù)接口
write_com(0x0c); //設置開顯示,不顯示光標
write_com(0x06); //寫一個字符后地址指針加1
write_com(0x01); //顯示清0,數(shù)據(jù)指針清0
write_com(0x80); //顯示歡迎界面
for(num=0;num<8;num++)
{
write_data(table1[num]);
delayms(5);
}
}
//定時器0初始化函數(shù)
void t_init()
{
TMOD=0x01; //設置定時器0工作方式1(M1M0=0x0001)
TH0=0; //裝初值
TL0=0;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
}
//鍵盤檢測函數(shù)(確定被測元件為電阻、電容或電感)
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); //按鍵按下時退出死循環(huán)
}
//頻率顯示函數(shù)
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);
}
}
//電阻顯示函數(shù)
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);
}
}
//電容顯示函數(shù)
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);
}
}
//電感顯示函數(shù)
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);
}
}
Powered by 單片機教程網(wǎng)