⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电阻,电容,电感测量仪设计.txt

📁 用QUARTUS编译通过的等精度频率计
💻 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 + -