?? 電阻,電容,電感測量儀設計.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 + -