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

📄 test.c

📁 积分式直流数字电压表,在不使用任何积分是以AD的情况下
💻 C
字号:
//---------头文件-------------//
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include"Fr_LCD_12864.c"

//--------定义变量-----------//
#define uchar unsigned char
#define uint  unsigned int

//----------AD接口定义--------//
sbit  Relay=P1^0;       //积分电容的选择
sbit  Switch_C=P1^3;    //模拟开关
sbit  Switch_B=P1^2;
sbit  Switch_A=P1^1;

unsigned long int count ,volt ;
uint Zrang ;     //量程标志位的定义

uchar Tab_voutsmall[6]={0};
uchar Tab_voutmax[6]={0};

uint Tab_num[]={'0','1','2','3','4','5','6','7','8','9','.'};
uchar code string2v[]={"2V :"};
uchar code string200mv[]={"200mV:"};
uchar code string1[]={"积分式直流数字"};
uchar code string2[]={"电压表"};

//--------函数定义区--------//
void delay(uint t);
void data_transmax();
void data_transsmall();    

//---------主函数---------//
void main(void)
{

    LCD_RST = 0 ;
    LCD_RST = 1 ;
    LCD_PSW = 1 ;
    Re_Start_LCD12864();
    Write_OrderOrData_To_LCD12864( Order , ClearDDTAM_Data ) ;   //首先清除显示
    Write_OrderOrData_To_LCD12864( 0 , 0x80 ) ;
    Write_String_To_LCD12864(1,2,string1);
	Write_String_To_LCD12864(2,3,string2);
    Write_String_To_LCD12864(3,1,string200mv);
	Write_String_To_LCD12864(4,1,string2v);




//------时序控制开始--------------
 
    Zrang=0;       //标志位为零,说明并没有置标志位
    Relay=1;
    Relay=0;   //低电平,电容放电
    delay(20);
    Relay=1;
    Switch_C=0;            //000,输入;      011 , -1V 
    Switch_B=1;            //001,+1V;        100 ,-100mV;
    Switch_A=0;            //010 ,100mV;
    TMOD=0x55;     //0101 0101     定时计数器0和1,工作模式1,T0,T1均为计数,
    TH0=(65536-50000)/256;      //计数10000个脉冲
    TL0=(65536-50000)%256;
    TR0=1;        //启动定时计数器0
    TR1=0;  
    ET0=1;      //	开定时计数器中断
    EA=1;
    while(1)
    {
      ;
    }
}

void t0(void) interrupt 1
{
      TH0=0;
      TL0=0;
      TR0=0;
      EA=0;  //关总中断  
/*	    if(Zrang==0)
	      {
            Switch_C=0;      //选择-1V基准 
            Switch_B=1;
            Switch_A=1;
		  }
	   else if (Zrang==1)
	      {
	        Switch_C=1;      //选择-100Mv基准来进行反向积分
            Switch_B=0; 
            Switch_A=0;
			}
	     else
		    {
	        Switch_C=0;     //选择-1V基准
            Switch_B=1;
            Switch_A=1;
			}*/


			if(Zrang == 1)
			{
	        Switch_C=1;      //选择-100Mv基准来进行反向积分
            Switch_B=0; 
            Switch_A=0;
			}
			else
			{
	        Switch_C=0;     //选择-1V基准
            Switch_B=1;
            Switch_A=1;
			}
			
    TH1=0;
    TL1=0;
    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256; 
    TR1=1;
    TR0=0;
    EX1=1;
    IT1=1;
    EA=1;

}


//测正电压,直接用INT1中断,不用反向
void int1(void) interrupt 2
{   
    Relay=0;
    EA=0;
    TR1=0; 
    Switch_C=1;   //接地
    Switch_B=1;
    Switch_A=1;
	count=TH1*256+TL1;
	  if(Zrang==0)
	    {
	    if(count<=2600)
		    {
		    Zrang=1;
			}
		else
		    {
		     Zrang=2;
			}
         }
		else if(Zrang==1)
		  {
		    data_transsmall();
			Zrang=0;
		  }
		 else
		 {
		    data_transmax();
			Zrang=0;
		 }
    Switch_C=0;   //选择100mV基准
    Switch_B=1;
    Switch_A=0;
    TMOD=0x55;    //定时计数器初始化一次就可以了
    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256; 
  //  TH1=0;
   // TL1=0;
	Relay=1;
    TR0=1;      //启动定时计数器
    TR1=0;
    ET0=1;      //开定时计数器中断
    EA=1;

}

//-----------t为几,延时几毫秒------
void delay(uint t)
{
  uint j , k , l;
  for(j=0;j<t;j++)
  for(k=0;k<2;k++)
  for(l=0;l<255;l++);
}       

 //----------2V量程显示函数----------
void data_transmax()
{
     uint a;
	  volt=count-600;
      Tab_voutmax[0]=volt/10000;
	  Tab_voutmax[1]=10;
      Tab_voutmax[2]=(volt%10000)/1000;
      Tab_voutmax[3]=(volt%1000)/100;
      Tab_voutmax[4]=(volt%100)/10;
	  Tab_voutmax[5]=volt%10;
	  SetPonit_In_LCD12864( 4 , 3 );
	    for(a=0;a<6;a++)
		{
	      Write_OrderOrData_To_LCD12864(  Datas , Tab_num[Tab_voutmax[a]] );
		}
		Write_OrderOrData_To_LCD12864(  Datas , 'V');

}

 //-------------200mV量程显示函数-----
void data_transsmall()
{
     uchar a;
	  volt=count/2;
	  volt=volt-4000;
      Tab_voutsmall[0]=volt/10000;
      Tab_voutsmall[1]=(volt%10000)/1000;
      Tab_voutsmall[2]=(volt%1000)/100;
	  Tab_voutsmall[3]=10;
      Tab_voutsmall[4]=(volt%100)/10;
	  Tab_voutsmall[5]=volt%10;
	  SetPonit_In_LCD12864( 3 , 4 );
	    for(a=0;a<6;a++)
		  {		    
	        Write_OrderOrData_To_LCD12864(  Datas , Tab_num[Tab_voutsmall[a]] );
		  }
         
		  Write_OrderOrData_To_LCD12864(  Datas , 'm');
		  Write_OrderOrData_To_LCD12864(  Datas , 'V');

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -