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

📄 自动校正.c

📁 采用c8051f020单片机接受数据
💻 C
📖 第 1 页 / 共 2 页
字号:
//deal voltage
//=================================================
void dealvoltage(void)
 {   int i;
     long maxnum=0;
     long minnum=0xffff;
     long pnum;
     long maxconter=0;
     long summax=0;
     long minconter=0;
     long summin=0;
     while(!tranover);     

         for(i=0;i<ctime;i++)
          {if(result1[i]>maxnum)
          maxnum=result1[i];
        if(result1[i]<minnum)
          minnum=result1[i];
          }

        
        pnum=(maxnum+minnum)/2;
       
       DAC0H = pnum>>4 ;
       DAC0L=pnum<<4;
     voltage = ( pnum* VREF0)>>12;  
     maxvoltage = (maxnum* VREF0)>>12;
     minvoltage = (minnum* VREF0)>>12;

         dashu() ;
  
       tranover=0;
       EA = 1;   
    }
//*************************************************
//仅有4位数的处理子程序,
//入口: flonum
//出口:dealresult[i],本例有4位小数unsigned char dealresult[5];
//------------------------------------------------
void dashu(void)                
{ 
   dealresult[0]=voltage/1000;
   voltage=voltage%1000;
   dealresult[1]=voltage/100;
  voltage=voltage%100;
   dealresult[2]=voltage/10;

   maxresult[0]=maxvoltage/1000;
   maxvoltage=maxvoltage%1000;
   maxresult[1]=maxvoltage/100;
  maxvoltage=maxvoltage%100;
   maxresult[2]=maxvoltage/10;

   minresult[0]= minvoltage/1000;
    minvoltage= minvoltage%1000;
   minresult[1]= minvoltage/100;
   minvoltage= minvoltage%100;
   minresult[2]=minvoltage/10;

   
   }

//=============================================================================
//-----------------------------------------------------------------------------
void delay0_5ms(void)               //延时5ms子程序   
{int dtime=1136;
  while(dtime--);
  }


//=============================================================================
//-----------------------------------------------------------------------------
// 解码子程序××××××××××××××××××××××××××××××
//-----------------------------------------------------------------------------
//
 void scan(void)
 {  int i,j,displace,num1;
     bit beginsign=0;
    for(i=0;i<48;i++)                         //每隔0.5ms采集一次数据,共采集48个,
                                              // 一般采得的每两位表示发送来的一位数据
      {
      outbit[i]=vout;
      delay0_5ms();
      }

     for(i=0;i<48;i++)                       //逐个扫描
      {
   
      num1=0;
      for(j=0;j<10;j++)                      //检测起始位
        {
        if(outbit[i+j]!=1)                   //检测起始位,
                                              //否则 break
           break;
         num1++;                            
           if(num1==9)                        //连续9个1,即认为开始
           {beginsign=1;                       //开始标志位
          
            if(outbit[i+9]==0)                  //在附近寻找隔离位0
            displace=i+9;                        //得出隔离位在数组中偏移量
            if(outbit[i+10]==0)
            displace=i+10;
            }
           }


          if(beginsign==1)                     //开始标志位1,调处查询
              break;

         }
      if(beginsign==1)  
      { 
      if(outbit[displace]==outbit[displace+1])   //判断从隔离位开始,若连续两数都相同,则数据有效
            if(outbit[displace+2]==outbit[displace+3])
   
                if(outbit[displace+4]==outbit[displace+5])
                        
                           if(outbit[displace+6]==outbit[displace+7])
                             
                               if(outbit[displace+8]==outbit[displace+9])
                                  if(outbit[displace+10]==outbit[displace+11])
                                  if(outbit[displace+12]==outbit[displace+13])
                                  {
                                  led1=outbit[displace+2];      //读出数据
                                  led2=outbit[displace+4];
                                  led3=outbit[displace+6];
                                  led4=outbit[displace+8];
                                  led5=outbit[displace+10];      //奇偶校验位
                                  readsign=1;
                                  }
                         
        }   

      }
       
//=============================================================================
//-----------------------------------------------------------------------------
//odd,even   奇偶校验子程序(偶校验,即数据和校验位的1的个数为偶数)
even_odd(void)
{  
  uchar oddnum;
  bit judgeoddsign=0;
  oddnum=0;
  if(led1==1)
    oddnum++;
  if(led2==1)
    oddnum++;
  if(led3==1)
    oddnum++;
  if(led4==1)
    oddnum++;

    if((oddnum==1)||(oddnum==3))
        judgeoddsign=1;
    if(judgeoddsign==led5)
        return 1;
    else return 0;
 }


//=============================================================================
//-----------------------------------------------------------------------------
// display  液晶显示子程序
//-----------------------------------------------------------------------------
//

//
 void display(void)
 {

 
   writeinstru(0x80);                   // 显示起始位置(80--A7)
     dischar('v');
     dischar('r');
     dischar(tab4[dealresult[0]]);
     dischar(0x2e);
      dischar(tab4[dealresult[1]]);
	  dischar(tab4[dealresult[2]]);

      dischar(0x20);
 
	   dischar('m');
     dischar('x');
     dischar(tab4[maxresult[0]]);
      dischar(0x2e);
      dischar(tab4[maxresult[1]]);
	  dischar(tab4[maxresult[2]]);

      dischar(0x20);

      dischar('m');
     dischar('i');
     dischar(tab4[minresult[0]]);
      dischar(0x2e);
      dischar(tab4[minresult[1]]);
	  dischar(tab4[minresult[2]]);

      writeinstru(0xC6);             //第二行显示                    



         dischar(0x20);
         dischar('R');
         dischar('e');
         dischar(':');


         dischar(tab4[led4]);        //显示所接受数据(4位)
         dischar(tab4[led3]);
         dischar(tab4[led2]);
         dischar(tab4[led1]);


         led11=~led4;      // 接收的最高位    
         led22=~led3;      // 接收的第二位    
         led33=~led2;      // 接收的最三位    
         led44=~led1;      // 接收的最四位     
     
	  }



//------------------------------------------------------------------------------------------
//以下为液晶显示初始化控制
//---------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------//---------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------
void lcd_init(void)                       // initialize lcd
     {
      unsigned long xdata i;
	  for(i=1000;i>0;i--);
      writeinstru(0X38);
	  for(i=200;i>0;i--);

	  writeinstru(0X38);
	  for(i=50;i>0;i--);
	  writeinstru(0X38);
	  writeinstru(0X38);

	  writeinstru(0X08);                     //显示OFF,

	  writeinstru(0X01);                     //清除显示

	  writeinstru(0X02);                     //光标归位 

	  writeinstru(0X06);                     //输入模式

	  writeinstru(0X0c);                     //显示方式

	  }



//----------------------------------------------------------
//end
void writeinstru(uchar instru)     //write 写指令,注意时序
	{
	uint xdata i;
	for(i=0;i<3;i++);
	  RS=0;
	  WR=0;
	dataport=instru;
    for(i=0;i<5;i++);
	WR=1;
	RS=1;
    for(i=0;i<20;i++);	
	}
//----------------------------------------------------------
 readreg(void)     //read  bf acc读忙位和地址
	{
	uint xdata i;
	uchar reg;
	for(i=0;i<3;i++);
	  RS=0;
	  RD=0;
	reg=dataport;
    for(i=0;i<10;i++);
	RD=1;
	RS=1;
    for(i=0;i<20;i++);
	return reg;	
	}

//----------------------------------------------------------
//end
void dischar(uchar disch)     //write 写显示数据
	{
	uint xdata i;
	for(i=0;i<3;i++);
	  RS=1;
	  WR=0;
	dataport=disch;
    for(i=0;i<5;i++);
	WR=1;
	RS=0;
    for(i=0;i<20;i++);	
	}

⌨️ 快捷键说明

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