立即注册 登录
返回首页

uid:254444的个人空间

日志

基于51单片机的rlc测量仪的程序

热度 1已有 1846 次阅读2017-11-27 23:03

程序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);

  }

}



路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (2 个评论)

回复 哈哈哈哈慕 2019-8-9 20:26
有没有原理图啊
回复 哈哈哈哈慕 2019-8-9 20:26
您能给个原理图吗?

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部