📄 电阻,电容,电感测量仪设计.txt
字号:
//=========================================================
//功 能:电阻,电容,电感测量仪设计
//编 写 者:JIANXIAOMU
//编写时间:2007-11-06
//修改时间:2007-11-11
//M C U:AT89S52
//=========================================================
/
void delay(uint j)
{
uint i;
for(i=0;i<j;i++);
}
void LCD_Busy(void)
{
while(1)
{
RS=0;
RW=1;
E=1;
if(!BF) break; //判断是否忙,忙则BF=1 即E=0
E=0;
}
}
void LCD_Write_Command(uchar com)
{
LCD_Busy(); //写指令前判断是否忙
delay(10);
E=0;
RS=0; //不忙则输入指令
RW=0;
_nop_();
E=1;
data_port=com; //将指令输入到主机
_nop_();
E=0; //下降延有效
}
void LCD_Write_data(uchar dat)
{
LCD_Busy(); //写数据前判断是否忙
delay(10);
E=0;
RS=1;
RW=0;
_nop_();
E=1;
data_port=dat; //将数据输入到主机
_nop_();
E=0; //下降延有效
}
void Init(void)
{
RST=0; //复位
delay(10);
RST=1;
RS=0;
RW=0;
E=0;
LCD_Write_Command(0x0c); //整个显示开
LCD_Write_Command(0x30);
LCD_Write_Command(0x80); //首地址
}
void display1(uchar x_add ,uchar dat1 ,uchar dat2)
{
LCD_Write_Command(x_add);//写入具体的某个地址
LCD_Write_data(dat1); //写入前两位
LCD_Write_data(dat2); //写入后两位
}
void display2(uchar x_add ,uchar *p)
{
LCD_Write_Command(x_add); //写入具体的某个地址
LCD_Write_data(*p); //输入一个字,一个字占两个字符
p++;
LCD_Write_data(*p);
p++;
}
void display3(uchar row, uchar line, uchar *p)
{
uint i;
i=strlen(p); //计算指针的长度
i/=2;
while(i!=0)
{
LCD_Write_Command(Tab[row][line]); //输入首地址
if(line>7) //换行标志
{
row++;
line=0;
}
if(row>4) break; //如果行数超出,则不计数
LCD_Write_data(*p); //写入汉字 ,一个字占两个字符,所以当输入数字的时候要占满两格,可以在第一位写 空格
p++;
LCD_Write_data(*p);
p++;
i--;
line++;
}
}
void display_R(void)
{
if(flag_R==1)
{
flag_R=0; //清标志位
LCD_Write_Command(0x01); //清屏
F_buffer[5]=(frequency/10000)%10+'0';
F_buffer[6]=(frequency/1000)%10+'0';
F_buffer[7]=(frequency/100)%10+'0';
F_buffer[8]=(frequency/10)%10+'0';
F_buffer[9]=frequency%10+'0';
R_value=100000000/(2.761*frequency);
//R_value=100000/C_value;
R_buffer[5]=(R_value/10000)%10+'0';
R_buffer[6]=(R_value/1000)%10+'0';
R_buffer[8]=(R_value/100)%10+'0';
R_buffer[9]=(R_value/10)%10+'0';
R_buffer[10]=R_value%10+'0';
display3(0,0,R_count);
display3(1,0,R_buffer); //显示电阻
display3(3,0,F_buffer); //显示频率值
}
}
void display_C(void)
{
if(flag_C==1)
{
flag_C=0; //清电容处理标志位
LCD_Write_Command(0x01); //清屏
F_buffer[5]=(frequency/10000)%10+'0';
F_buffer[6]=(frequency/1000)%10+'0';
F_buffer[7]=(frequency/100)%10+'0';
F_buffer[8]=(frequency/10)%10+'0';
F_buffer[9]=frequency%10+'0';
C_value=10000000/(5.6456*frequency);
//R_value=100000/C_value;
C_buffer[5]=(C_value/100000)%10+'0';
C_buffer[6]=(C_value/10000)%10+'0';
C_buffer[8]=(C_value/1000)%10+'0';
C_buffer[9]=(C_value/100)%10+'0';
C_buffer[10]=(C_value/10)%10+'0';
C_buffer[11]=C_value%10+'0';
display3(0,0,C_count);
display3(1,0,C_buffer); //显示电阻
display3(3,0,F_buffer); //显示频率值
}
}
void display_L(void)
{
if(flag_L==1)
{
flag_L=0; //清电感处理标志位
LCD_Write_Command(0x01); //清屏
F_buffer[5]=(frequency/10000)%10+'0';
F_buffer[6]=(frequency/1000)%10+'0';
F_buffer[7]=(frequency/100)%10+'0';
F_buffer[8]=(frequency/10)%10+'0';
F_buffer[9]=frequency%10+'0';
L_value=1000000000/(frequency*frequency*0.05);
L_buffer[5]=(L_value/1000)%10+'0';
L_buffer[7]=(L_value/100)%10+'0';
L_buffer[8]=(L_value/10)%10+'0';
L_buffer[9]=L_value%10+'0';
//L_buffer[10]=(L_value/10)%10+'0';
//L_buffer[11]=L_value%10+'0';
display3(0,0,"电容三点式测量仪");
display3(1,0,L_buffer); //显示电阻
display3(3,0,F_buffer); //显示频率值
}
}
void t0(void) interrupt 1 using 0
{
TH0=0;
TL0=0;
count++;
}
void t1(void) interrupt 3 using 1
{
TH1=0xdc;
TL1=0x00;
cnt++;
if(cnt>=100)
{
cnt=0;
TR0=0;
flag=1;
}
}
void keyscanf(void)
{
if(key_R==0) //选择0通道,测量电阻
{
CD4051_A=0;
CD4051_B=0;
CD4051_C=0;
flag_R=1; //置处理电阻测量标志位
}
else if(key_C==0) //选择1通道,测量电容
{
CD4051_A=1;
CD4051_B=0;
CD4051_C=0;
flag_C=1; //置处理电容测量标志位
}
else if(key_L==0) //选择2通道,测量电感
{
CD4051_A=0;
CD4051_B=1;
CD4051_C=0;
flag_L=1; //置处理电感测量标志位
}
else
{
CD4051_A=1;
CD4051_B=1;
CD4051_C=1;
}
}
void System_Init(void)
{
TMOD=0x15; //设置T0外部计时
TH0=0;
TL0=0;
TH1=0xdc; //T1赋定时1S初始值
TL1=0x00;
TR1=1; //启动定时器1
TR0=1; //启动定时器0
ET0=1; //T0中断
ET1=1; //T1中断
EA=1; //总中断
flag_R=0;
flag_C=0;
flag_L=0;
Init(); //液晶初始化
}
int main(void)
{
System_Init(); //系统初始化
display3(0,0,"简易电阻电容和电感测量仪"); //开机显示状态
while(1)
{
keyscanf(); //扫描按键
if(flag==1)
{
flag=0;
frequency=count*65535+TH0*256+TL0; //求频率值
display_R(); //若电阻标志位为1,则处理电阻测量值
display_C(); //若电容标志位为1,则处理电容测量值
display_L();
count=0; //测量频率计数清0
TH0=0;
TL0=0;
//TH1=0xdc;
//TL1=0x00;
TR0=1; //启动定时器0
//TR1=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -